Windowsのバッチファイル(.bat)でエラーが発生した際のみウィンドウを閉じずに画面に残すようにする方法を紹介します。パパっと作ってすぐに実行が終わる様なコードでもエラーが起きた際は何が起こったか把握できないと修正は一気に難しくなります。batファイルをダブルクリックで実行すると実行終了時に自動でウィンドウが閉じます。これを pause で毎回止めてもいいのですが、何度も繰り返す実行内容だと毎回閉じるのが面倒です。エラーが起きた時だけ閉じる様にしたくなります。
実際にエラーが起きた時だけ止まるコードは次です。
rem bat ファイル @echo off setlocal enabledelayedexpansion rem ここにコマンドを書く if !errorlevel! neq 0 ( echo エラーが起きました pause exit /b )
このコードが単一のコマンドを実行する際のエラーハンドリングです。もし一つのバッチファイル内で複数のコマンドを実行するならば愚直にやると次の様になります。
rem bat ファイル @echo off setlocal enabledelayedexpansion rem ここにコマンドを書く if !errorlevel! neq 0 ( echo エラーが起きました pause exit /b ) rem ここにコマンドを書く if !errorlevel! neq 0 ( echo エラーが起きました pause exit /b )
正直、毎回 if 文の1セットをコピペするのは読む時の視認性に悪影響です。これを解決するならば次の様にサブルーチンを書く方法があります。
rem bat ファイル @echo off rem ここにコマンドを書く setlocal enabledelayedexpansion call :run_command "python --version" call :run_command "コマンド2号" call :run_command "php -v" goto :eof :run_command %~1 if !errorlevel! neq 0 ( echo エラーが起きました pause exit /b ) goto :eof
こうするとエラーハンドリングでラッピングされた状態でコマンドが実行されます。ただ、エスケープなどがめんどくさくもなります。複雑なスクリプトを書いている気がしてきたら、いっそもっとリッチな言語に移行してサブプロセスを操るコードを書いた方が良いやもしれません。スクリプトレベルのコード量ならば ChatGPT の助けを借りると移行が大変楽になります。実際に Python に翻訳した例が次のスクリーンショットです。