簡単な作業を行うとき、即興でバッチファイルを記述することがあります。特に実行権限について気にすることもなく、結構適当に記述しても止まることなく動作してしまうところは、長所でもあり、欠点でもありますよね。今回は、バッチファイルから別のバッチファイルを呼び出す方法について、いくつか紹介します。
まず、以下のように記述した場合は、どうなるでしょうか?
A.bat
…続きの処理
この場合、続きの処理が一切行われず、A.batに完全に処理が移ってしまいます。別のバッチファイルを呼び出して、実行した後に、続きの処理を行うためには、CALL文を使ってバッチファイルを呼び出す必要があります。以下のように記述することで、バッチファイルの終了を待ち、次の処理を行います。
Call A.bat
…続きの処理
バッチファイルに引数がある場合は、バッチファイルの後ろに引数を付けます。
Call A.bat "2025/12/25"
Call A.bat "2025/12/24"
Call A.bat "2025/12/23"
…続きの処理
では、バッチファイルを起動して、呼び出したバッチファイルの終了を待たずに、続きの処理を行いたい場合は、どうしたらよいでしょうか?この場合は、Startコマンドを使います。Startコマンドは、本来は別のアプリケーションを呼び出すコマンドです。
例えば、
notepad.exe
…続きの処理
とすると、notepad.exeが開いて待機し、保存してnotepad.exeを終了すると、次の処理に移ります。しかし、notepad.exeの編集をしながら、続きの処理をしてもらいたいこともあると思います。
そのときは、
start notepad.exe
…続きの処理
とすると、notepad.exeが残ったまま、続きの処理が行われます。
これにならって、
start A.bat
…続きの処理
とすると、どうなるでしょうか?A.batのために新しいコマンドプロンプトが開き、A.batの実行が終わった後も、コマンドプロンプトが開いたままになります。Windows 11 24H2では、A.bat内に、exit コマンドが記述されていても、新たに開いたコマンドプロンプトが開きっぱなしになりました。
start /? でヘルプを見てみましょう。
内部コマンドまたはバッチ ファイルの場合、コマンド プロセッサは cmd.exe の /K オプションを使用して実行されます。
と出力されました。
では、cmd /? で、cmd.exeのヘルプを見てみます。
/C "文字列" に指定されたコマンドを実行した後、終了します。
/K "文字列" に指定されたコマンドを実行しますが、終了しません。
ということは、start バッチファイルとすると、コマンドプロンプトが残ったままになるようです。これを避けるにはこうする必要があります。
start cmd.exe /c A.bat
…続きの処理
こうすることで、バッチファイルから別のバッチファイルを非同期に呼び出したときに、コマンドプロンプトが残ったままになることを避けることができます。
ということで、バッチファイルから別のバッチファイルを呼び出す方法について、いくつかご紹介しました。レガシーな仕組みですが、改めて動作を見てみると、まだまだ面白い点があるなと思います。