はじめに
Windowsバッチ(親バッチ)で別のバッチ(子バッチ)を呼び出した時、
親バッチの処理が返ってこず、子バッチで処理が終了してしまった場合の原因と解決方法の備忘録。
原因① callコマンドを使ってバッチを呼び出していない
呼び出す側の親バッチをmain.bat、呼び出される側の子バッチ①をa.bat、子バッチ②をb.batとする。
@echo on
rem callコマンドを使用せず子バッチ呼出し
a.bat
b.bat
echo test1
echo test2
呼び出す側の親バッチでcallコマンドを使用しなかった場合、
子バッチ a.bat の実行結果は返ってくるが、子バッチ b.bat の実行結果は返ってこない。
> test1
解決方法① callコマンドを使ってバッチを呼び出す
バッチ呼出し時にcallコマンドを使用する。
@echo on
rem callコマンドを使用してバッチ呼出し
call a.bat
call b.bat
子バッチ① a.bat だけでなく、子バッチ② b.bat の実行結果も返ってくる。
> test1
> test2
原因② 呼び出したバッチをexitで終了している
原因①と同様に呼び出す側の親バッチを( main.bat )、呼び出される側の子バッチ①を( a.bat )、子バッチ②を( b.bat )とする。
@echo on
call a.bat
call b.bat
exit 0
rem exitでバッチ終了
echo test
exit 0
rem exitでバッチ終了
echo test2
exit 0
呼び出される側の子バッチ( a.bat )がexit 0で終了している場合、
子バッチ( a.bat )の実行結果は返ってくるが、子バッチ( b.bat )の実行結果は返ってこない。
> test1
解決方法② 子バッチに/bオプションを指定する
@echo on
call a.bat
call b.bat
exit /B 0
/bオプションをすることで、現在実行中のバッチのみ終了するように指定できる。
オプションを指定しなかった場合は、コマンドプロンプトを終了するという意味になる。
rem exitコマンドに/bオプションを指定
echo test
exit /B 0
rem exitコマンドに/bオプションを指定
echo test2
exit /B 0
子バッチ① a.bat だけでなく、子バッチ② b.bat の実行結果も返ってくる。
> test1
> test2