連載
» 2018年02月15日 05時00分 公開

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

バッチファイルなどで実行を一時停止したい場合、Linuxなどではsleepというコマンドを使う。Windows OSには標準のsleepコマンドはないが、代わりにtimeoutやPowerShellのSleepコマンドが利用できる。

[打越浩幸,デジタルアドバンテージ]

対象OS:Windows 7/Windows 8.1/Windows 10/Windows Server 2008 R2/Windows Server 2012/Windows Server 2012 R2/Windows Server 2016


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

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

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

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

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

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

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

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

 Windows Vista/Windows Server 2003以降のWindows OSには「timeout.exe」というコマンドが用意されている。

timeoutコマンドのヘルプ timeoutコマンドのヘルプ
一定時間待つコマンドとして、timeoutコマンドが用意されている。

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

 timeoutに数値の引数を指定するとその秒数だけ待つが(引数なしはエラー)、同時に画面に残り待ち時間も表示される。途中で何らかのキー入力を行うと、すぐに終了する。

 例えば、5秒待ってからメッセージを表示させるには次のようにする。

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

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

 途中でユーザーのキー操作による中断をさせず、必ず最後までカウントダウンさせるには、/nobreakオプションを付ける。ただしこの場合でも、[Ctrl]+[C](もしくは[Ctrl]+[Break])キーを押せば中断できる。

timeout /nobreakでキー入力を無視させる timeout /nobreakでキー入力を無視させる
timeoutの実行中に何かのキーを押すと休止を中断するが、それを抑止するには/nobreakを付ける。すると、必ず指定した秒数だけ待つようになる。

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

timeoutのカウントダウン表示を抑止する timeoutのカウントダウン表示を抑止する
1秒ごとのカウントダウン表示を抑止するには、「>nul」を付けて、メッセージを出力させないようにすればよい。

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

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

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

PowerShellのsleepコマンドレットで休止させる PowerShellのsleepコマンドレットで休止させる
PowerShellのStart-Sleep(Sleep)コマンドレットはtimeoutコマンドよりもシンプルで、LinuxやUNIXのsleepコマンドに近い。先頭に「powershell 〜」もしくは「powershell -command 〜」を付けると、コマンドプロンプトやバッチファイルからも簡単にPowerShellのコマンドを実行できる。

■更新履歴

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

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


Copyright© 1999-2018 Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。