はじめに
バッチファイルを実行した時、処理が途中で終了してしまい最後まで実行されないってことありませんか?というお話。
バッチファイル内でバッチファイルを呼び出していませんか?
バッチファイルが途中で終了してしまうそこのあなた!バッチファイル内でバッチファイルを呼び出したりしていませんか?つまり、実行しているバッチファイルがa.batで、呼び出しているバッチファイルがb.batの場合、
@echo off
echo Hello
b.bat
echo !
pause
echo World
このようなコードになっていれば要注意です。この場合、a.batの4行目echo "!"は実行されません。これは、3行目でb.batが呼び出された際にa.batに処理が戻らず、終了してしまうためです。そのため、本来期待している振る舞いを実現するためには、バッチファイルやサブルーチンを呼び出すときに用いるcallを利用します。
正しいコード
最初に実行したバッチファイルに処理を戻すためには、callコマンドを用いて以下のように記述します。
@echo off
echo Hello
call b.bat
echo !
pause
echo World
これで、Hello World !と全ての文字列が表示されるようになりました。
最後に
バッチファイル内でバッチファイルを使用する際はcallコマンドを用いると、呼び出したバッチファイルを実行後、もとのバッチファイルの残りの部分が実行されます。また、startコマンドをcallコマンドの代わりに用いると、呼び出したバッチファイルの終了を待たずに呼び出し元の残りの部分が実行されます。これらの使い分けでより柔軟な処理が実現できそうです。