Windowsでバッチファイルやスクリプトを作成していると、「特定の処理が終わるまで待ちたい」「複数のコンピュータの処理を同期したい」という場面に遭遇することがあります。
そんなとき便利なのが、WindowsのWAITFORコマンドです。
この記事では、WAITFORコマンドの基本的な使い方から、実践的な活用例、注意点まで詳しく解説します。
WAITFORコマンドとは

WAITFORコマンドは、Windowsに標準搭載されているコマンドラインツールです。
基本的な役割
WAITFORコマンドは、「シグナル」と呼ばれる信号を送受信することで、複数のプロセスやコンピュータを同期させる機能を持っています。
簡単に言えば、以下のようなことができます。
- シグナルを待つ: 特定のシグナルが届くまで処理を停止
- シグナルを送る: 他のプロセスやコンピュータに信号を送信
この機能により、バッチファイル間での連携や、ネットワーク上の複数コンピュータの同期が可能になります。
利用可能な環境
WAITFORコマンドは、以下のWindowsバージョンで使用できます。
- Windows Server 2003以降
- Windows Vista以降
- Windows 7、8、10、11
- Windows Server 2008、2012、2016、2019、2022、2025
つまり、比較的新しいWindowsであれば、ほぼすべての環境で使用可能です。
内部的な仕組み
WAITFORコマンドは、内部的に「mailslot」というIPCメカニズムを使用しています。
mailslotの名前は以下の形式です。
\\<コンピュータ名>\mailslot\WAITFOR.EXE\<シグナル名>
シグナル受信時は「.」が、送信時にコンピュータ名を指定しない場合は「*」が使用されます。
基本的な構文
WAITFORコマンドには、2つの主要な使い方があります。
シグナルを待つ構文
waitfor [/t タイムアウト秒数] <シグナル名>
この構文で、指定したシグナルが届くまで待機します。
パラメータの説明
- /t タイムアウト秒数: 待機する最大時間(1〜99999秒)
- 省略した場合は無期限に待機
- シグナル名: 待つシグナルの名前(大文字小文字は区別されない)
シグナルを送る構文
waitfor [/s コンピュータ名] [/u ユーザー名] [/p パスワード] /si <シグナル名>
この構文で、指定したシグナルを送信します。
パラメータの説明
- /s コンピュータ名: 送信先のコンピュータ名またはIPアドレス
- 省略した場合は同じドメイン内の全コンピュータにブロードキャスト
- /u ユーザー名: 認証用のユーザー名
- ドメイン指定は「ドメイン名\ユーザー名」の形式
- /p パスワード: 認証用のパスワード
- /si: シグナル送信を示すオプション(必須)
- シグナル名: 送信するシグナルの名前
シグナル名の制約
シグナル名には以下の制約があります。
- 最大225文字まで
- 使用可能な文字: a-z、A-Z、0-9、ASCII文字(128-255)
- 大文字小文字は区別されない
基本的な使用例
実際の使用例を見ていきましょう。
例1: 同じコンピュータ内での待機と送信
最もシンプルな使用例です。
手順1: シグナルを待つ
コマンドプロンプトを開いて、以下のコマンドを実行します。
waitfor BuildComplete
このコマンドを実行すると、プロンプトは「BuildComplete」というシグナルが届くまで待機状態になります。
手順2: シグナルを送る
別のコマンドプロンプトを開いて、以下のコマンドを実行します。
waitfor /s 127.0.0.1 /si BuildComplete
または、自分のコンピュータ名を指定します。
waitfor /s %COMPUTERNAME% /si BuildComplete
シグナルが送信されると、待機していたコマンドプロンプトの処理が再開されます。
重要: 自分自身のコンピュータにシグナルを送る場合は、必ず「/s」オプションでコンピュータ名またはIPアドレスを指定する必要があります。
例2: タイムアウト付きの待機
シグナルが届かない場合に備えて、タイムアウトを設定できます。
waitfor /t 60 DataReady
このコマンドは、60秒間「DataReady」シグナルを待ちます。
60秒経過してもシグナルが届かない場合は、タイムアウトエラーで終了します。
例3: ネットワーク経由での送信
他のコンピュータにシグナルを送ることもできます。
waitfor /s ServerB /u Domain\User /p Password /si TestComplete
このコマンドは、「ServerB」というコンピュータに「TestComplete」シグナルを送信します。
認証情報(ユーザー名とパスワード)が必要な場合は、/uと/pオプションで指定します。
実践的な活用例
実際の業務でWAITFORコマンドをどのように活用できるか見ていきましょう。
活用例1: ビルドプロセスの同期
ソフトウェアのビルドが完了したら、複数のテストサーバーに通知する例です。
ビルドサーバー側(build.bat)
@echo off
echo ビルドを開始します...
REM ビルド処理(実際のビルドコマンド)
msbuild Solution.sln /p:Configuration=Release
echo ビルドが完了しました
echo テストサーバーに通知を送信します...
REM テストサーバーAに通知
waitfor /s TestServerA /si BuildDone
REM テストサーバーBに通知
waitfor /s TestServerB /si BuildDone
echo すべてのテストサーバーに通知しました
テストサーバー側(test.bat)
@echo off
echo ビルド完了通知を待機しています...
REM ビルド完了シグナルを待つ
waitfor BuildDone
echo ビルド完了通知を受信しました
echo テストを開始します...
REM テスト実行処理
run_tests.exe
echo テストが完了しました
活用例2: データコピーの完了待ち
大量のファイルコピーが完了するまで待機する例です。
コピー処理側(copy_process.bat)
@echo off
echo データのコピーを開始します...
REM ファイルコピー処理
xcopy /s /e /y "\\SourceServer\Data\*.*" "C:\LocalData\"
echo コピーが完了しました
echo 処理完了シグナルを送信します...
waitfor /s %COMPUTERNAME% /si CopyDone
echo シグナルを送信しました
待機側(wait_process.bat)
@echo off
echo データコピーの完了を待機しています...
REM タイムアウト付きで待機(最大30分)
waitfor /t 1800 CopyDone
if %ERRORLEVEL% equ 0 (
echo コピーが完了しました
echo 次の処理を開始します...
REM 次の処理
process_data.exe
) else (
echo タイムアウト: コピーが時間内に完了しませんでした
)
活用例3: 複数プロセスの順次実行制御
複数のバッチファイルを順番に実行する例です。
メイン制御スクリプト(main.bat)
@echo off
echo 処理を開始します
REM プロセス1を別ウィンドウで実行
start "Process1" cmd /c process1.bat
REM プロセス1の完了を待つ
waitfor Process1Done
echo プロセス1が完了しました
REM プロセス2を実行
start "Process2" cmd /c process2.bat
REM プロセス2の完了を待つ
waitfor Process2Done
echo プロセス2が完了しました
echo すべての処理が完了しました
プロセス1(process1.bat)
@echo off
echo プロセス1を実行中...
REM 実際の処理
timeout /t 5 /nobreak
echo プロセス1完了
waitfor /s %COMPUTERNAME% /si Process1Done
プロセス2(process2.bat)
@echo off
echo プロセス2を実行中...
REM 実際の処理
timeout /t 5 /nobreak
echo プロセス2完了
waitfor /s %COMPUTERNAME% /si Process2Done
活用例4: サーバー起動の確認
サーバーが起動完了するまで待機する例です。
サーバー起動スクリプト(server_start.bat)
@echo off
echo サーバーを起動しています...
REM サーバー起動コマンド
start_server.exe
REM 起動処理(実際には数秒〜数十秒かかる)
timeout /t 30 /nobreak
echo サーバーが起動しました
echo 起動完了シグナルを送信...
waitfor /s %COMPUTERNAME% /si ServerReady
echo クライアントに通知完了
クライアント側(client.bat)
@echo off
echo サーバーの起動を待機しています...
:WaitLoop
waitfor /t 10 ServerReady
if %ERRORLEVEL% equ 0 (
echo サーバーが起動しました
goto ProcessStart
) else (
echo まだサーバーが起動していません。待機中...
goto WaitLoop
)
:ProcessStart
echo 処理を開始します
client_app.exe
エラー処理とERRORLEVEL

WAITFORコマンドの実行結果は、ERRORLEVELで確認できます。
ERRORLEVELの値
- 0: シグナルを正常に受信(または送信)
- 1: タイムアウトまたはエラーが発生
エラー処理の実装例
@echo off
echo シグナルを待機しています...
waitfor /t 60 MySignal
if %ERRORLEVEL% equ 0 (
echo シグナルを受信しました
REM 正常処理
call next_process.bat
) else (
echo エラー: タイムアウトまたは受信失敗
REM エラー処理
echo エラーログを記録します
echo [%date% %time%] シグナル受信失敗 >> error.log
exit /b 1
)
制限事項と注意点
WAITFORコマンドを使用する際の重要な注意点です。
制限事項1: 同じシグナル名の重複不可
同じコンピュータ上で、同じシグナル名を待つWAITFORを複数実行することはできません。
悪い例:
REM 同じシグナルを2つのプロセスで待つ(エラーになる)
start waitfor TestSignal
start waitfor TestSignal ← これはエラー
良い例:
REM 異なるシグナル名を使用
start waitfor TestSignal1
start waitfor TestSignal2
制限事項2: ドメイン内のコンピュータのみ
シグナルを受信できるのは、送信元と同じドメイン内のコンピュータに限られます。
異なるドメインのコンピュータ間では、WAITFORコマンドでの通信はできません。
制限事項3: タイムアウトの範囲
タイムアウトに指定できる値は、1〜99999秒(約27.7時間)です。
それ以上の時間を指定することはできません。
注意点1: エラーメッセージの抑制
タイムアウト時にエラーメッセージが表示されます。
バッチファイル内でこれを抑制したい場合は、以下のようにリダイレクトします。
waitfor /t 10 MySignal >nul 2>&1
ただし、ERRORLEVELが1になるため、必要に応じてリセットします。
waitfor /t 10 MySignal >nul 2>&1 & verify>nul
verify>nulコマンドでERRORLEVELを0に戻せます。
注意点2: 自分自身への送信時は/sが必須
自分のコンピュータにシグナルを送る場合は、必ず/sオプションが必要です。
REM 正しい
waitfor /s %COMPUTERNAME% /si MySignal
waitfor /s 127.0.0.1 /si MySignal
REM 間違い(自分には届かない)
waitfor /si MySignal
/sを省略すると、シグナルはドメイン内の他のコンピュータにブロードキャストされますが、自分自身には届きません。
代替手段との比較
WAITFORコマンド以外にも、待機処理を実現する方法があります。
TIMEOUTコマンドとの違い
TIMEOUTコマンドは、単純に指定秒数だけ待機します。
REM 10秒待機
timeout /t 10
WAITFORとの違い:
- TIMEOUT: 時間ベースの待機(無条件に指定秒数待つ)
- WAITFOR: イベントベースの待機(シグナルが来るまで待つ)
TIMEOUTは他のプロセスと同期できませんが、シンプルな時間待ちには便利です。
PINGコマンドを使った待機
古い方法として、PINGコマンドで待機する方法もあります。
REM 約10秒待機(11回実行)
ping -n 11 127.0.0.1 >nul
ただし、この方法は以下の問題があります。
- 正確な待機時間にならない
- 実際の待ち時間は「指定回数-1」
- ERRORLEVELが1になる副作用がある
現在は、TIMEOUTコマンドを使う方が推奨されます。
セキュリティ上の注意
WAITFORコマンドは正規のWindowsツールですが、セキュリティ上の注意点があります。
悪用の可能性
WAITFORコマンドは、マルウェアに悪用される可能性があります。
悪用例:
- 攻撃の同期: 複数のマルウェアが連携して攻撃を実行
- 実行遅延: 特定のシグナルを待ってから悪意のある処理を実行
- サンドボックス回避: 永遠に待機して解析を妨害
セキュリティ対策
組織のネットワークでは、以下の対策を検討してください。
- ファイアウォールルール
不要なWAITFORトラフィック(mailslot通信)をブロック - 実行監視
WAITFORコマンドの不審な実行を監視 - 最小権限の原則
必要のないユーザーには実行権限を与えない - ログ記録
WAITFORコマンドの使用をログに記録
ただし、正規の業務で使用している場合は、過度な制限は避けましょう。
トラブルシューティング
よくある問題と解決方法です。
問題1: シグナルが届かない
症状:
WAITFORで待機しているが、シグナルを送っても届かない。
原因と解決方法:
- 自分自身への送信時に/sを忘れている
→ /s オプションでコンピュータ名を指定 - 異なるドメインのコンピュータに送信している
→ 同じドメイン内のコンピュータであることを確認 - ファイアウォールでブロックされている
→ ファイアウォール設定を確認 - シグナル名が間違っている
→ 送信側と受信側のシグナル名が一致しているか確認
問題2: 「ERROR: Invalid signal name」エラー
症状:
シグナル名が無効だというエラーが表示される。
原因と解決方法:
シグナル名に使用できない文字が含まれています。
使用可能な文字は、a-z、A-Z、0-9、ASCII(128-255)のみです。
以下の文字は使用できません:
- スペース
- 記号(一部例外あり)
- 日本語などの全角文字
正しい例:
waitfor BuildComplete
waitfor Test_Signal_01
間違った例:
waitfor Build Complete ← スペースが含まれている
waitfor ビルド完了 ← 日本語が含まれている
問題3: タイムアウトエラーが頻繁に発生
症状:
WAITFORがタイムアウトで終了してしまう。
原因と解決方法:
- タイムアウト時間が短すぎる
→ /t オプションで十分な時間を指定 - 送信側の処理が完了していない
→ 送信側のログを確認 - ネットワーク遅延
→ ネットワーク状況を確認
タイムアウトを長めに設定するか、ループ処理で何度か試みる方法もあります。
:RetryLoop
waitfor /t 30 MySignal
if %ERRORLEVEL% neq 0 (
echo リトライします...
goto RetryLoop
)
echo シグナルを受信しました
まとめ
WAITFORコマンドについて解説しました。
主な特徴
- シグナルを送受信してプロセスやコンピュータを同期
- Windows Server 2003以降で標準搭載
- ネットワーク経由での通信が可能
- タイムアウト設定が可能
基本的な構文
REM シグナルを待つ
waitfor [/t 秒数] <シグナル名>
REM シグナルを送る
waitfor [/s コンピュータ] /si <シグナル名>
主な用途
- ビルドプロセスの同期
- データコピーの完了待ち
- 複数プロセスの順次実行
- サーバー起動の確認
注意点
- 同じシグナル名の重複不可
- 同じドメイン内のみ通信可能
- 自分自身への送信には/sオプションが必須
- セキュリティ上の配慮が必要
WAITFORコマンドは、バッチファイルでの高度な制御を可能にする強力なツールです。
適切に使用すれば、自動化処理の信頼性と柔軟性を大きく向上させることができます。
ただし、使用する際はセキュリティ面にも注意を払い、適切な権限管理とログ記録を行いましょう。


コメント