バッチファイルでサブルーチンから処理を戻す際に exit /b
を使いますが、誤用するとバッチ全体が終了してしまったり、
予期せぬ終了コードが返って呼び出し元の処理が止まってしまうことがあります。
本記事では、exit /b
の正しい使い方と、よくある間違いの修正方法を解説します。
exit と exit /b の違い
exit
はコマンドプロンプト自体を終了しますが、exit /b
は「バッチ処理の現在のコンテキスト(サブルーチンや呼び出し元)」だけを終了し、呼び出し元に戻ります。
exit
… cmd.exe を閉じるexit /b
… バッチファイル内の処理を終了して呼び出し元へ戻る
よくある誤り1:バッチ全体が終了してしまう
サブルーチンから呼び出し元に戻りたいのに、exit
と書いてしまうと、バッチ全体が終了してしまいます。
@echo off
call :sub
echo この行は実行されない
exit /b
:sub
echo サブルーチン処理
exit &rem 誤り:バッチ全体が終了
修正: サブルーチンの終端では必ず exit /b
を使用します。
:sub
echo サブルーチン処理
exit /b
よくある誤り2:エラーコードが意図せず伝播する
exit /b
に数値を指定すると、その値がエラーコード (%ERRORLEVEL%
) として呼び出し元に返されます。
値を指定しない場合は直前のエラーコードがそのまま返ってしまうため、意図せずエラー扱いになることがあります。
@echo off
call :sub
echo ERRORLEVEL=%ERRORLEVEL%
exit /b
:sub
rem 直前のコマンドでエラーが出ていた場合、そのまま伝播
exit /b
修正: 正常終了として扱いたい場合は exit /b 0
と明示します。
:sub
rem 正常終了を明示
exit /b 0
よくある誤り3:ラベル末尾に exit /b を忘れる
サブルーチンの終端に exit /b
を書き忘れると、処理が次のラベルやバッチ本体に流れてしまいます。
@echo off
call :sub
echo 呼び出し元に戻るはず
exit /b
:sub
echo サブルーチン処理
rem exit /b を忘れると下に流れてしまう
:next
echo ここも実行されてしまう
修正: サブルーチンの終端では必ず exit /b
を記述し、意図しない処理実行を防ぎます。
まとめ
exit /b
はサブルーチンや関数的処理から戻るための重要なコマンドですが、誤用するとバッチ全体の終了や意図せぬエラーコードの伝播を招きます。
ポイントは以下の通りです。
- サブルーチンから戻るときは
exit /b
を使う - 正常終了なら
exit /b 0
を明示する - 終端に書き忘れると意図しないラベルに流れるので注意する
これらを押さえておけば、exit /b
を原因とする予期せぬ終了を防ぎ、安定したバッチ処理を作成できます。