LoginSignup
4
2

More than 1 year has passed since last update.

呼び出し元のバッチに処理が戻らず途中終了する

Last updated at Posted at 2021-02-18

はじめに

Windowsバッチ(親バッチ)で別のバッチ(子バッチ)を呼び出した時、
親バッチの処理が返ってこず、子バッチで処理が終了してしまった場合の原因と解決方法の備忘録。

原因① callコマンドを使ってバッチを呼び出していない

呼び出す側の親バッチをmain.bat、呼び出される側の子バッチ①をa.bat、子バッチ②をb.batとする。

main.bat
@echo on
rem callコマンドを使用せず子バッチ呼出し 

a.bat
b.bat
a.bat
echo test1
b.bat
echo test2

呼び出す側の親バッチでcallコマンドを使用しなかった場合、
子バッチ a.bat の実行結果は返ってくるが、子バッチ b.bat の実行結果は返ってこない。

実行結果
> test1

解決方法① callコマンドを使ってバッチを呼び出す

バッチ呼出し時にcallコマンドを使用する。

main.bat
@echo on
rem callコマンドを使用してバッチ呼出し

call a.bat
call b.bat

子バッチ① a.bat だけでなく、子バッチ② b.bat の実行結果も返ってくる。

実行結果
> test1
> test2

原因② 呼び出したバッチをexitで終了している

原因①と同様に呼び出す側の親バッチを( main.bat )、呼び出される側の子バッチ①を( a.bat )、子バッチ②を( b.bat )とする。

main.bat
@echo on

call a.bat
call b.bat

exit 0
a.bat
rem exitでバッチ終了

echo test

exit 0
b.bat
rem exitでバッチ終了

echo test2

exit  0

呼び出される側の子バッチ( a.bat )がexit 0で終了している場合、
子バッチ( a.bat )の実行結果は返ってくるが、子バッチ( b.bat )の実行結果は返ってこない。

実行結果
> test1

解決方法② 子バッチに/bオプションを指定する

main.bat
@echo on

call a.bat
call b.bat

exit /B 0

/bオプションをすることで、現在実行中のバッチのみ終了するように指定できる。
オプションを指定しなかった場合は、コマンドプロンプトを終了するという意味になる。

a.bat
rem exitコマンドに/bオプションを指定

echo test

exit /B 0
b.bat
rem exitコマンドに/bオプションを指定

echo test2

exit /B 0

子バッチ① a.bat だけでなく、子バッチ② b.bat の実行結果も返ってくる。

実行結果
> test1
> test2
4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2