チャポケのブログ

勉強したことをまとめておく。

Windowsバッチ サブルーチン/別バッチファイルの呼び出し

call : サブルーチンの呼び出し

サブルーチンは、下記の17~20行目や、24~32行目のように、:[ラベル]exit /bの部分になる。
サブルーチンの呼び出しは、callを使う。
6行目は引数無しの呼び出し、9行目は引数有りの呼び出しの例である。

@echo off
rem ------------------------------------
rem メイン処理
echo メイン処理の最初

call :subroutine1
echo サブルーチン1から戻ってきた。

call :subroutine2 12 56
echo サブルーチン2から戻ってきた。

echo メイン処理の最後
exit /b

rem ------------------------------------
rem サブルーチン1の処理
:subroutine1
echo サブルーチン1の最初
echo サブルーチン1の最後
exit /b

rem ------------------------------------
rem サブルーチン2の処理
:subroutine2
echo サブルーチン2の最初
echo 引数0 = %0
echo 引数1 = %1
echo 引数2 = %2
set /a sum = %1 + %2
echo 引数1 + 引数2 = %sum%
echo サブルーチン2の最後
exit /b
メイン処理の最初
サブルーチン1の最初
サブルーチン1の最後
サブルーチン1から戻ってきた。
サブルーチン2の最初
引数0 = :subroutine2
引数1 = 12
引数2 = 56
引数1 + 引数2 = 68
サブルーチン2の最後
サブルーチン2から戻ってきた。
メイン処理の最後

call : 別のバッチファイルの呼び出し

別のバッチファイルの呼び出しは、callを使う。
メイン処理test_mainA.batの5行目は引数無しの呼び出し、8行目は引数有りの呼び出しの例である。

rem test_mainA.bat
@echo off
echo メイン処理の最初

call test_child1.bat
echo 子バッチ1から戻ってきた。

call test_child2.bat 12 56
echo 子バッチ2から戻ってきた。

echo メイン処理の最後
exit /b
rem test_child1.bat
rem 子バッチ1の処理
@echo off

echo 子バッチ1の最初
pause
echo 子バッチ1の最後

exit /b
rem test_child2.bat
rem 子バッチ2の処理
@echo off

echo 子バッチ2の最初
echo 引数0 = %0
echo 引数1 = %1
echo 引数2 = %2

pause

set /a sum = %1 + %2
echo 引数1 + 引数2 = %sum%

echo 子バッチ2の最後
exit /b
メイン処理の最初
子バッチ1の最初
続行するには何かキーを押してください . . .
子バッチ1の最後
子バッチ1から戻ってきた。
子バッチ2の最初
引数0 = test_child2.bat
引数1 = 12
引数2 = 56
続行するには何かキーを押してください . . .
引数1 + 引数2 = 68
子バッチ2の最後
子バッチ2から戻ってきた。
メイン処理の最後

start : 別のバッチファイルの呼び出し

上記でのcallを使ったバッチファイルの呼び出しは、呼び出した先の処理が終了して制御が戻ってくるまで、メイン処理は待ち続ける。戻ってきたらその続きを処理する。

バッチファイルの呼び出しをstartに変えると、メインの処理は特に待たずにその続きを処理する。
startで呼び出された別バッチファイルは、メインの処理とは別処理として処理を開始する。

メイン処理test_mainB.batの5行目は引数無しの呼び出し、8行目は引数有りの呼び出しの例である。
test_mainB.batを実行すると、この2つの呼び出しはそれぞれ別処理を開始させるので、各々で別ウィンドウが立ち上がる。

rem test_mainB.bat
@echo off
echo メイン処理の最初

start test_child1.bat
echo 子バッチ1の終了待たずに進む。

start test_child2.bat 12 56
echo 子バッチ2の終了待たずに進む。

echo メイン処理の最後
exit /b
メイン処理の最初
子バッチ1の終了待たずに進む。
子バッチ2の終了待たずに進む。
メイン処理の最後
子バッチ1の最初
続行するには何かキーを押してください . . .
子バッチ1の最後
子バッチ2の最初
引数0 = test_child2.bat
引数1 = 12
引数2 = 56
続行するには何かキーを押してください . . .
引数1 + 引数2 = 68
子バッチ2の最後

exit /b と exit

上記の全てのバッチファイルでは、/b無しexitを使用せず、exit /bを使用してきた。
exit /bは、サブルーチン/バッチファイルの呼び出し元に処理の制御を戻すように作用する。
/b無しexitは、処理をそこで終了させる。この違いに注意すること。

バッチファイルでexit /bを使用している場合、コマンドプロンプトウィンドウからこのバッチファイルを起動してその処理が終了すると、コマンドプロンプトウィンドウに制御が戻る
バッチファイルで/b無しexitを使用している場合、コマンドプロンプトウィンドウからこのバッチファイルを起動してその処理が終了すると、コマンドプロンプトウィンドウまで消えてしまう