バッチファイルでは、外部アプリケーションを実行したあとに、アプリの処理が終わるまで待ってから次のコマンドを実行したい場面があります。特に、インストーラの実行後に設定ファイルを配置したり、処理完了後にログを記録したりするケースでは「待機処理」が重要になります。
この記事では、start /waitとtimeoutを使って、外部アプリケーションの終了を待ち、順次処理を進める方法について解説します。
通常のstartでは待機しない
以下のようにstartコマンドを使用すると、指定したアプリケーションは別プロセスとして起動され、直後に次の処理へ進んでしまいます。
start notepad.exe
echo メモ帳が開きました
の場合、notepad.exeが開いた直後にechoが実行されてしまい、メモ帳の終了を待ってはくれません。
start /wait で外部アプリの終了を待機する
外部アプリの処理が終わるまで待ってから次の処理に進めたい場合は、start /waitオプションを使用します。
start /wait notepad.exe
echo メモ帳を閉じたので、次の処理を実行します
このように書くことで、ユーザーがメモ帳を閉じるまで後続のコマンドは実行されません。インストーラの実行などにも応用できます。
start /wait setup.exe
echo インストール完了後の設定を実行します
timeoutで強制的に待機する方法
外部アプリの処理時間が決まっている場合や、一定時間の待機だけを入れたい場合は、timeoutコマンドが有効です。
start notepad.exe
timeout /t 10 /nobreak > nul
echo 10秒待機後に次の処理を実行します
このスクリプトは、メモ帳の起動後に10秒間待機し、その後に続く処理を実行します。/nobreakを付けることで、ユーザーがキーを押しても待機をスキップできないようにしています。
なお、timeoutはあくまで時間での待機であり、プロセスの終了を検知するわけではないため、あらかじめ処理時間が分かっているケースでのみ利用してください。
実行ファイルのパス指定時の注意点
ファイルパスにスペースが含まれる場合は、ダブルクォーテーションで囲む必要があります。
start /wait "" "C:\Program Files\App\app.exe"
このとき、startコマンドの仕様上、最初の引数にウィンドウタイトルを指定する必要があるため、空の文字列””を入れるのが正しい構文です。
まとめ
バッチファイルで外部アプリケーションの処理完了を待つには、start /waitが最も信頼性の高い方法です。処理時間が読めない場合に有効であり、システムインストールやツール連携時に頻出します。
一方、timeoutは時間による単純待機に向いており、プロセスの完了確認が不要な場面に適しています。これらのコマンドを状況に応じて使い分けることで、バッチ処理をより堅牢に設計することが可能になります。