こんなことを知りたい人へ向けて書いています
- 「exit /b」コマンドの使い方を知りたい方
- Windowsバッチファイルでサブルーチンなどから戻り値を得たい方
- サブルーチンの実行後、「errorlevel」に入っている値を利用したい方
- 「exit」と「exit /b」の違いを知りたい方
その他の関連しそうな記事
目次
「exit /b」の基本的な解説(「exit」との違いなど)
「eixt /b」と「exit」はどちらも基本的にバッチファイルを終了するためのコマンドです。
例えば、以下のバッチファイル「stop_process_exitb.bat」のように処理を終了したいところに、これらのコマンドを記入するとその場所で処理が中止されます。
1 2 3 4 5 6 7 8 9 10 |
@echo off rem コマンドプロンプト画面へメッセージを出力 echo 様々な処理を書く rem ここで処理を中止する exit /b rem ここの「echo」コマンドまでは処理が到達しない echo このメッセージはコマンドプロンプト画面へ表示されないはず |
このバッチファイルは7行目の「exit /b」で処理が止まるため、4行目の「echo」コマンドによるコマンドプロンプト画面への表示はされますが、最終行での「echo」コマンドによる表示はされないはずです。
以下がコマンドプロンプト上で実行した結果になります。
期待通り、「exit /b」で処理が止まり、最終行での出力は表示されていません。
では、7行目の「exit /b」を「exit」としてみましょう。以下がそのバッチファイル「stop_process_exit.bat」です。
1 2 3 4 5 6 7 8 9 10 |
@echo off rem コマンドプロンプト画面へメッセージを出力 echo 様々な処理を書く rem ここで処理を中止する exit rem ここの「echo」コマンドまでは処理が到達しない echo このメッセージはコマンドプロンプト画面へ表示されないはず |
これを同様に実行してみて下さい。
…どうでしょうか?コマンドプロンプト画面が消えてしまったと思います。このように、「exit」コマンドは処理を終了させて、コマンドプロンプトまで消してしまう機能を持っています。
なので、処理後のコマンドプロンプト画面に表示されたメッセージなどを確認したい場合には、「exit /b」を使用してコマンドプロンプト画面が消えないようにすることが必要でしょう。
呼び出し先のバッチファイルから呼び出し元のバッチファイルに戻るには「exit /b」を使う
上のバッチファイルの例では「exit」と「exit /b」コマンドの違いはコマンドプロンプト画面が消えるか、消えないかの違いだけで、処理の内容自体には違いはありませんでした。
しかし、バッチファイルからバッチファイルを呼び出すような処理を行う場合、「exit」と「exit /b」とでは処理内容にまで影響が出るので注意が必要です。
例を見てみましょう。以下のような呼び出し元のバッチファイル(親バッチ)と呼び出し先(子バッチ)を考えます。
「calling.bat」(親バッチ)は以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 |
@echo off rem コマンドプロンプト画面へのメッセージの出力 echo ここは親バッチの中です。 pause rem 子バッチの呼び出し call called.bat rem コマンドプロンプト画面へのメッセージの出力 echo 親バッチの中へ帰ってきました。 pause |
一方、「called.bat」(子バッチ)は以下の通りです。
1 2 3 4 5 6 7 8 |
@echo off rem コマンドプロンプト画面へのメッセージの出力 echo ここは子バッチの中です。 pause rem 処理を終了する exit |
親バッチ「calling.bat」では、4行目でコマンドプロンプト画面にメッセージを出力し、8行目の「call」コマンドで子バッチ「called.bat」を呼び出しています。また、親バッチの最後の行でも再びコマンドプロンプト画面にメッセージを出力しています。
呼び出された子バッチでは、4行目でコマンドプロンプト画面へのメッセージ出力を行い、最終行の「exit」で処理を終了しています。
それぞれ「echo」コマンドの後には「pause」コマンドによって処理を一時停止しています。
さて、この親バッチ「calling.bat」を実行したら、コマンドプロンプト画面へはどのようなメッセージ出力となるでしょうか?以下、実行結果です。
ここまで進めて、エンターを押し処理を進めると、コマンドプロンプト画面が閉じます。これは、子バッチに入って4行目の出力の後、最終行の「exit」によって処理が終了したためです。したがって、親バッチの最後の「echo」コマンドには処理が到達しなかったということです。
では、「called.bat」(子バッチ)を以下のように変更して実行するとどうでしょうか?
1 2 3 4 5 6 7 8 |
@echo off rem コマンドプロンプト画面へのメッセージの出力 echo ここは子バッチの中です。 pause rem 処理を終了する exit /b |
最終行の「exit」コマンドを「exit /b」としました。以下、実行結果です。
今度は親バッチの最後の「echo」コマンドによる出力が表示されました。このように、「exit /b」コマンドは現在実行しているバッチファイルの処理を終了させる機能を持っています。一方、「exit」コマンドはすべてのバッチファイルの処理を終了させる機能を持っているのです。
したがって、親バッチから子バッチを呼び出し、再び親バッチに戻りたい場合は、「exit /b」を使用する必要があります。
このことは、バッチファイルを呼び出す場合だけではなく、サブルーチンを呼び出す場合も同様です。例えば、以下のようなバッチファイル「exitb_subroutine.bat」です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
@echo off rem コマンドプロンプト画面へのメッセージの出力 echo ここはメインプログラムです。 rem 子バッチの呼び出し call :called rem コマンドプロンプト画面へのメッセージの出力 echo 親バッチの中へ帰ってきました。 rem 終了 goto :eof rem 以下は「called」サブルーチン :called rem コマンドプロンプト画面へのメッセージの出力 echo ここはサブルーチンです。 rem サブルーチンを終了する exit /b |
7行目で「called」サブルーチンを呼び出しています。サブルーチンは16行目からであり、サブルーチンの終了には「exit /b」を使用しています(最終行)。これで、サブルーチンの処理が終了すれば、メインプログラムの処理に戻ります。以下、実行結果です。
「exit /b」の代わりに「exit」を使用した場合、メインプログラムには戻らず、ここで全ての処理が終了します。
このような違いに気を付けて「exit」と「exit /b」を使い分けましょう。
バッチファイルやサブルーチンからの戻り値を利用する「exit /b [数値]」
「exit /b」コマンドを使って、呼び出したバッチファイルやサブルーチンからメインのプログラムへ戻るとき、戻り値を指定することができます。
戻り値とは、呼び出したバッチファイルやサブルーチンからメインのプログラムへ戻るときにメインのプログラムへ引き渡せる値のことです。実際に以下のバッチファイルを見てみましょう。前節の「exitb_subroutine.bat」を少し編集して「exitbnum_subroutine.bat」を作りました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
@echo off rem コマンドプロンプト画面へのメッセージの出力 echo ここはメインプログラムです。 rem 子バッチの呼び出し call :called rem コマンドプロンプト画面へのメッセージの出力 echo 親バッチの中へ帰ってきました。 rem 戻り値の確認 echo 戻り値は「%errorlevel%」です。 rem 終了 goto :eof rem 以下は「called」サブルーチン :called rem コマンドプロンプト画面へのメッセージの出力 echo ここはサブルーチンです。 rem サブルーチンを終了する exit /b 22 |
注目すべきは2箇所です。1箇所目はこのバッチファイルの最終行「exit /b 22」コマンドです。これまでの「exit /b」の後に「22」を追記しました。これで22という値を戻り値として、メインプログラムに返すことができます。ここでは22を指定していますが、もちろんこの数字はどんなものでも構いません。負の数でもオッケーです。ただし、必ず数値を指定します。文字列は指定できません。
注目すべき2箇所目は、13行目の変数「errorlevel」です。メインプログラムで戻り値を参照するには変数「errorlevel」の中を見ます。ここに戻り値が格納されていますので、「%errorlevel%」とすれば参照できます。
以下、実行結果です。
変数「errorlevel」に戻り値「22」が代入されていることが分かります。
バッチファイルから呼び出したバッチファイルを扱うときも同様です。「exit /b [数値]」とすることで戻り値を指定することができます。
戻り値はサブルーチンや子バッチからの情報をメインプログラムに受け渡すときに使用しましょう。「if」コマンドを使って状況によって戻り値を変化させることで、より高度な処理が可能になるはずです。