& の応用: 複数コマンドを順に・同時に実行するバッチテクニック - Windowsコマンド実用例
バッチファイルで複数のコマンドを連続して実行する場合、& や &&、|| などの演算子を使うことができます。本記事では、コマンドを順に実行する基本から、擬似的に同時実行(並列処理)を行うための応用テクニックまで紹介します。
使用コマンド
基本: 順番に実行する
複数のコマンドを「順番に」実行したい場合、& または && を使います(違いは後述)。
@echo off
REM どちらも順に実行される
command1 & command2 & command3
REM 前のコマンドが成功した場合にだけ次を実行
command1 && command2 && command3
& は各コマンドを常に順番に実行します。&& は前のコマンドが成功(エラーコード 0)したときのみ次のコマンドを実行します。
応用: 同時に実行する(並列実行)
バッチファイルでは通常、1行ずつ順番に処理が実行されますが、start コマンドを用いることで擬似的にコマンドを並列に実行することが可能です。
@echo off
REM 複数のコマンドを同時に開始
start "task1" cmd /c "echo タスク1 & timeout /t 3"
start "task2" cmd /c "echo タスク2 & timeout /t 5"
start "task3" cmd /c "echo タスク3 & timeout /t 1"
echo 全タスクを開始しました。
start により各コマンドは別ウィンドウで並列に実行され、元のプロセスは即座に次へ進みます。cmd /c により引数のコマンドが1回だけ実行され、終了します。
※ start の最初の引数("task1" など)は「ウィンドウタイトル」であり、コマンドラインの一部ではありません。スペースを含むコマンドを実行する際は、この引数に空文字列("")を指定するなど、何かしらを明示的に指定する必要があります。
非表示ウィンドウでの並列実行: start /B
start /B を使えば、新しいウィンドウを開かずに同一ウィンドウ内で並列実行が可能です。例えばバックグラウンド処理を非同期で処理したい場合などに適しています。
@echo off
start /B cmd /c "echo タスクA & timeout /t 3"
start /B cmd /c "echo タスクB & timeout /t 5"
echo 並列実行を開始しました(ウィンドウは増えません)。
※ start /B を使うと出力が混在したり、親の標準出力と干渉することがあります。そのため、ログ出力やバックグラウンド処理など単純な用途には便利ですが、出力の制御や同期が必要な場面では start の通常形式を使う方が安全です。
補足: コマンドの区切り記号
| 記号 | 意味 |
|---|---|
& | すべてのコマンドを順に実行 |
&& | 前のコマンドが成功したときに次を実行 |
|| | 前のコマンドが失敗したときに次を実行 |
| | パイプ(出力を次の入力として渡す) ※ 2つのコマンドを続けて実行するだけの用途には使いません |
注意点
startによる並列処理はウィンドウが増えるため、非表示化やウィンドウ抑制が必要な場合は追加オプションが必要です(例:/min)。start /Bは非表示だが標準出力が混在するため、使いどころに注意が必要です。- 並列で処理した結果を順番に集約したい場合は、一時ファイルやログファイルなどを活用するとよいでしょう。