LinuxなどUnix系OSなら、シェルスクリプト内で「sleep 秒数」を実行すれば、指定した秒数だけ進行を止めることができます。
スクリプトの進行を止めることで、たとえばループ処理で負荷がかかりすぎることを防いだり、任意の時刻まで待機させたりといったことが可能です。
しかしWindowsのコマンドプロンプトでは、標準で「sleep」コマンドが使えません。そのため、バッチファイルの進行を休止させるためには、別の手段が必要となります。
そこで、このページではWindowsのバッチファイルで「sleep」を実現する方法をまとめて紹介します。
「timeout」コマンドを使う
Windows Vista以降のWindowsでは「timeout.exe」というコマンドが使えます。ただし、デフォルトではユーザーがキー入力を行うと、すぐに終了してしまいます。キー入力を無視する場合は、「/nobreak」というオプションを指定して実行します。以下は3秒休止する場合の例です。
timeout /nobreak 3
timeoutコマンドはLinuxなどのsleepコマンドと異なり、以下のようにメッセージを出力します。
Linuxのsleepコマンドのように何も出力されないほうが良い場合は、以下のように「> nul」にリダイレクトしましょう。
PowerShellの「sleep」を使う
Windows 7以降に搭載されている「PowerShell」では「sleep 秒数」コマンドが使えます。そこで、バッチファイルで以下のように記述すれば、Unix系OSと同じようにスリープさせることが可能です。ただし、PowerShellをロードすることから、上述のtimeoutコマンドより余分な時間(ほとんどの環境で1秒未満)がかかります。以下は3秒休止する場合の例です。
powershell sleep 3
「-m」オプションを使って「ミリ秒」を指定することもできます。ただし、たとえば「-m 10」のようにごく短い時間を指定しても、前述の通りPowerShellのロードに時間がかかるので、正確に休止させることはできません。
なお「sleep」は、「Start-Sleep」というコマンドレットを短縮した別名(エイリアス)です。なので、「powershell Start-Sleep 秒数」と実行することもできます。
「ping」コマンドを使う
timeout.exeもPowershellも提供されていなかった頃のWindowsでは、「ping」コマンドを使って休止させる方法がよく使われていました。以下は「5秒休止」する場合の例です。
ping 127.0.0.1 -n 5 > nul
この例では、ローカルホスト(127.0.0.1)に5回pingを打っています。pingを打つ間隔は1秒なので、約5秒後にコマンドが終了して次の処理に進む、というわけです。
まとめ
Windows XP以前は「ping」を使った方法が定番でしたが、2020年現在、バッチファイルでスリープするなら「timeout」コマンドを使うのが最も良い方法でしょう。
履歴
2020-02-22 Windows 10 Pro バージョン 1909 ビルド 18363.657 で内容が正しいことを確認
2020-02-22 Windows 10 Home バージョン 1909 ビルド 18363.657 で内容が正しいことを確認
コメント