検索
連載

【Windows 11対応】Windowsの「timeout」「sleep」コマンドでバッチファイルの実行を一時停止するTech TIPS

バッチファイルなどで実行を一時停止(休止、スリープ)したい場合、Linuxなどではsleepというコマンドを使う。Windows OSには標準のsleepコマンドはないものの、代わりに「timeout」コマンドやPowerShellの「Start-Sleep」コマンドレットが利用できる。

Share
Tweet
LINE
Hatena
「Tech TIPS」のインデックス

連載目次

Windowsの設定を変えると、pingに応答するようになる! Windowsのファイアウォールで「ping」コマンドへの応答を許可する

対象OS:Windows 8.1/Windows 10/Windows 11、Windows Server 2012/Windows Server 2012 R2/Windows Server 2016/Windows Server 2019/Windows Server 2022


スクリプトの実行を一時的に休止させるsleepコマンド

 バッチファイルでコマンドを実行する場合、バッチの各行は連続して順番に実行される。その際、いくらか時間待ち(休止、スリープ)をさせたいことがある。そのような場合、UNIXやLinuxなどには「sleep」というコマンドが用意されており、例えば「sleep 60」とするとスクリプトの実行がそこで60秒間休止する。

 sleepの代表的な用途としては、次のようなものが考えられる。

  • 起動したプログラムの作業が完了するのを待つ――アプリケーションによっては、起動後にさまざまな作業を行うためにいくらかの時間を必要とするものがあるため、その準備が整うまで後続の作業を一時休止させる
  • 遅延起動させる――あるコマンドを今すぐ実行するのではなく、例えば1時間後に実行したいのなら、先に「sleep 3600」というコマンドを実行させればよい
  • 一定間隔ごとに起動させる――例えば「sleep 600」と「ping」コマンド(Tech TIPS「pingコマンドでネットワークトラブルの原因を調査する」参照)などを組み合わせて連続実行させると、10分ごとにネットワークの到達可能性チェックが行える。Windows OSのpingコマンドは、1秒に1回という高い頻度でパケットを送出する。だが、sleepと組み合わせることにより、より長い間隔で送信が可能になる。ping以外にも、例えば「wget」コマンドを使ってサーバの応答時間を調べたり(「Wgetとメールを使ったお手軽サーバ死活監視」参照)、ネットワークの帯域(ダウンロード速度)などを調べたりすることもできる
  • システムやネットワークの負荷テストなどにおいて、実行頻度を抑制する――休止なしで実行すると、システムやネットワークに対して常に最大負荷がかかることになる。適宜休止時間を挟むことにより、現実に即した負荷を与えられる

 実際に使用すると例えば次のようになるだろう。


sleepを使ったバッチファイルの例

 例えばバッチファイルで10分ごとにあるコマンドを繰り返し実行したい場合は、コマンドとsleep(と同等のコマンド。この例では「powershell sleep 〜」)、ループ(goto文)などを組み合わせて利用する。この例では、10分に1回pingコマンドを実行し、結果をログファイルに追記している。ログファイルの内容は、Tech TIPS「tailコマンドでログファイルをリアルタイムに監視する」のような方法を使えばリアルタイムで確認できる。

 Windows OSにはsleepコマンドは標準では用意されていない。だが、その代替となる方法は幾つかある。インターネットなどで検索すればWindows OS向けのsleepプログラムも多数見つかる。とはいえ、OSの標準機能だけでsleepと同等の機能を実現できると、いつでもどの環境でも利用できて便利だ。本Tech TIPSではそれを紹介する。

Windows OS標準のtimeout.exeコマンドを使う

 Windows OSには「timeout.exe」という一定時間待つコマンドが標準で用意されている。Windows Vista/Windows Server 2003以降であれば、インストールなどの事前作業なしですぐ実行できる。


timeoutコマンドのヘルプ

 timeoutコマンドは、単に指定された時間を待つだけでなく、途中で何らかのキー入力をすると、そこで終了する(休止を中断する)。sleepコマンドというよりは、最大待ち時間制限付きのpauseコマンドという感じのコマンドである。timeoutという名前からも分かるように、主にユーザーのキー入力待ちのために作られたコマンドだ。

 timeoutに数値の引数を指定すると、その秒数だけ待つ(引数なしはエラー)。例えば、5秒待ってからメッセージを表示させるには次のようにする。

timeout 5




timeoutコマンドの基本的な使用例

 timeoutとechoコマンドの間にある「&&」は、左側のコマンドの実行が正常終了したら、右側のコマンドを続いて実行するという意味である。ここではインタラクティブに実行するためにこのようにしている。バッチファイル中なら、2行に分けて書いてもよい。

 さてtimeoutコマンドでは、1秒ごとに残り待ち時間を知らせるメッセージが表示される。途中で何らかのキーを押すとそこで中断し(timeoutが終了し)、この場合ならechoコマンドが実行される。

●キーを入力してもtimeoutコマンドを続行させるには

 途中でユーザーのキー操作による中断をさせず、必ず最後までカウントダウンさせるには、「/nobreak」オプションを付ける。

timeout 5 /nobreak




timeoutコマンドで「/nobreak」オプションを指定してキー入力を無視させる

 ただしこの場合でも、[Ctrl]+[C](または[Ctrl]+[Break])キーを押せば中断できる。

●timeoutコマンドのカウントダウンメッセージを非表示にするには

 Linuxなどのsleepコマンドと違い、timeoutコマンドでは前述のようにカウントダウンのメッセージが表示される。バッチファイルなどでは、こうしたメッセージが邪魔になることも多い。その場合は標準出力を「nul」デバイスへリダイレクトする(「>nul」を付ける)と非表示にできる。

timeout 5 /nobreak >nul




timeoutコマンドのカウントダウン表示を抑制する

PowerShellのStart-Sleepコマンドレットを使う

 PowerShellには「Start-Sleep」というコマンドレットがあり、引数で指定した秒数だけ休止するという機能を持っている。例えば「Start-Sleep 60」とすると、60秒間休止する。「Start-Sleep -Milliseconds <ミリ秒>」または「Start-Sleep -m <ミリ秒>」とすれば、1ミリ秒(1000分の1秒)単位で休止時間を指定できる(実際にはコマンドのロードタイムなどが必要なので、あまりシビアな待ち時間制御はできない)。


Start-Sleepコマンドレットのヘルプ

 Start-Sleepコマンドレットは「Sleep」というエイリアス(別名)としても定義されている。コマンドプロンプトやバッチファイル中で「sleep 5」を実行したいなら、その前に「powershell」を付ける。

powershell sleep 5




PowerShellのsleep(Start-Sleep)コマンドレットで休止させる

 Start-Sleepコマンドレットに限らず、上記のように先頭に「powershell 〜」または「powershell -command 〜」を付けると、コマンドプロンプトやバッチファイルからも簡単にPowerShellのコマンドレットを実行できる。

 PowerShellのStart-Sleep(Sleep)コマンドレットはtimeoutコマンドよりもシンプルで、LinuxやUNIXのsleepコマンドに近い。Linux/UNIXに慣れているなら、こちらの方が使いやすいだろう。

■更新履歴

【2022/03/09】Windows 11などに対応しました。

【2018/02/15】最新状況を反映して更新しました。

【2012/06/08】初版公開。


「Tech TIPS」のインデックス

Tech TIPS

Copyright© Digital Advantage Corp. All Rights Reserved.

ページトップに戻る