実現したいこと
エラーフラグが立っていないときはエラーの処理をスルーして削除コマンドを実行してほしい。
発生している問題・分からないこと
TortoiseSVNの削除コマンドを実行するバッチを作成しました。
■動作
バッチを実行するとファイルパスが記載されたテキストファイル(dlt_list.txt)を読み込んで、上から順番に削除コマンドを実行するというものです。
削除コマンド実行前にファイルパスが合ってるか確認し、一致しないものが有る場合はエラーを吐きます。
エラー発生時は続行するかどうか(Y/N)の入力を求めます。
■参考
バッチとテキストファイルは同じフォルダに配置してます。
該当のソースコード
testbatch
1@echo off 2echo SVNリポジトリからファイルを削除します... 3 4REM TortoiseSVNのインストールディレクトリのパスを設定します 5set SVN_PATH="C:\Program Files\TortoiseSVN\bin\TortoiseProc.exe" 6 7REM 現在のバッチファイルのディレクトリを取得 8set CURRENT_DIR=%~dp0 9 10REM ログファイルのパスを設定します 11set LOG_DIR=%CURRENT_DIR%log 12if not exist "%LOG_DIR%" mkdir "%LOG_DIR%" 13set LOG_FILE=%LOG_DIR%\log_%date:~-10,4%%date:~-5,2%%date:~-2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt 14 15echo ファイルパスの確認を開始します... >> "%LOG_FILE%" 16 17REM エラーフラグを設定 18set ERROR_FOUND=0 19 20REM エラーリストファイルを初期化 21echo エラーリスト: > %LOG_DIR%\error_list.txt 22 23REM ファイルリストを読み込む 24for /f "tokens=*" %%f in (dlt_list.txt) do ( 25 if not exist %CURRENT_DIR%%%f ( 26 echo エラー: %%fは存在しません。 >> "%LOG_FILE%" 27 echo %%f >> %LOG_DIR%\error_list.txt 28 set ERROR_FOUND=1 29 ) 30) 31 32if %ERROR_FOUND%==0 ( 33 echo すべてのファイルパスが正しいことを確認しました。 >> "%LOG_FILE%" 34) 35 36if %ERROR_FOUND%==1 ( 37 type %LOG_DIR%\error_list.txt 38 echo エラーが見つかりました。処理を続行しますか? (y/n) 39 set /p CONTINUE= 40 if /i "%CONTINUE%"=="n" ( 41 echo 処理を中止します。 >> "%LOG_FILE%" 42 goto end 43 ) 44) 45 46echo SVNリポジトリからファイルを削除します... >> "%LOG_FILE%" 47 48REM ファイルリストを再度読み込む 49for /f "tokens=*" %%f in (dlt_list.txt) do ( 50 if exist %CURRENT_DIR%%%f ( 51 echo %%fを削除しています... >> "%LOG_FILE%" 52 %SVN_PATH% /command:remove /path:"%CURRENT_DIR%%%f" /notempfile /closeonend:1 53 if errorlevel 1 ( 54 echo 削除中にエラーが発生しました。処理を中止します。 >> "%LOG_FILE%" 55 goto end 56 ) 57 ) 58) 59 60echo 削除が完了しました。 >> "%LOG_FILE%" 61goto final 62 63:end 64echo 処理が中止されました。 >> "%LOG_FILE%" 65 66:final 67pause
■発生事象
ファイルパスが合っている(%ERROR_FOUND%=0)がカーソルが点滅して入力待ちの状態になってしまう。
ただ、エラー時のように「エラーが見つかりました。処理を実行しますか?(y/n)」というメッセージの表示は出ない。
カーソル点滅時にyやエンターを押すとコマンドプロンプトが閉じる。(svnの削除コマンドは実行される)
カーソル点滅時にnを押すとコマンドプロンプトが閉じる。(svnの削除コマンドは実行されない)
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
■試したこと
1)%ERROR_FOUND%=0のメッセージ表示後に「goto dltsvn」を追加して強制的に削除の処理へ進める。(svn削除の処理の部分に「:dltsvn」を追加)
testbatch.bat
1 2途中は同じなので省略 3 4if %ERROR_FOUND%==0 ( 5 echo すべてのファイルパスが正しいことを確認しました。 >> "%LOG_FILE%" 6 goto dltsvn ←これを追加して飛ばしてる 7) 8 9if %ERROR_FOUND%==1 ( 10 type %LOG_DIR%\error_list.txt 11 echo エラーが見つかりました。処理を続行しますか? (y/n) 12 set /p CONTINUE= 13 if /i "%CONTINUE%"=="n" ( 14 echo 処理を中止します。 >> "%LOG_FILE%" 15 goto end 16 ) 17) 18 19:dltsvn ←ファイルパス確認して正常ならここに飛ばす 20echo SVNリポジトリからファイルを削除します... >> "%LOG_FILE%" 21 22REM ファイルリストを再度読み込む 23for /f "tokens=*" %%f in (dlt_list.txt) do ( 24 if exist %CURRENT_DIR%%%f ( 25 echo %%fを削除しています... >> "%LOG_FILE%" 26 %SVN_PATH% /command:remove /path:"%CURRENT_DIR%%%f" /notempfile /closeonend:1 27 if errorlevel 1 ( 28 echo 削除中にエラーが発生しました。処理を中止します。 >> "%LOG_FILE%" 29 goto end 30 ) 31 ) 32) 33 34echo 削除が完了しました。 >> "%LOG_FILE%" 35goto final 36 37:end 38echo 処理が中止されました。 >> "%LOG_FILE%" 39 40:final 41pause
2)ファイルパスのエラー発生時に続行するかの確認処理を入れずに「goto end」へ飛ばして処理を中断する。
testbatch.bat
1 2途中は同じなので省略 3 4echo ファイルパスの確認を開始します... >> "%LOG_FILE%" 5 6REM ファイルリストを読み込む 7for /f "tokens=*" %%f in (dlt_list.txt) do ( 8 if not exist %CURRENT_DIR%%%f ( 9 echo エラー: %%fは存在しません。処理を中止します。 >> "%LOG_FILE%" 10 goto end 11 ) 12) 13 14echo すべてのファイルパスが正しいことを確認しました。 >> "%LOG_FILE%" 15 16echo SVNリポジトリからファイルを削除します... >> "%LOG_FILE%" 17 18REM ファイルリストを再度読み込む 19for /f "tokens=*" %%f in (dlt_list.txt) do ( 20 echo %%fを削除しています... >> "%LOG_FILE%" 21 %SVN_PATH% /command:remove /path:"%CURRENT_DIR%%%f" /notempfile /closeonend:1 22 if errorlevel 1 ( 23 echo 削除中にエラーが発生しました。処理を中止します。 >> "%LOG_FILE%" 24 goto end 25 ) 26) 27 28echo 削除が完了しました。 >> "%LOG_FILE%" 29goto final 30 31:end 32echo 処理が中止されました。 >> "%LOG_FILE%" 33 34:final 35pause
一応動作は望むものになったのですが、根本の解決にはなってないのでどなたか原因がわかれば教えてほしいです。
2024.12.5追記
回答1件
あなたの回答
tips
プレビュー