連載
» 2012年06月08日 00時00分 公開

Tech TIPS:Windowsのtimeout/sleepコマンドで実行を一時停止する

スクリプト・ファイルなどで実行を一時停止したい場合、通常はsleepを使う。Windows OSには標準のsleepコマンドはないが、代わりにtimeoutが利用できる。

[打越浩幸,デジタルアドバンテージ]
「Tech TIPS」のインデックス

連載目次

対象OS:Windows XP/Windows Vista/Windows 7/Windows Server 2003/Windows Server 2008/Windows Server 2008 R2



解説

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

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

  • 起動したプログラムの作業が完了するのを待つ――アプリケーションによっては、起動後にさまざまな作業を行うためにいくらかの時間を必要とするものがあるため、その準備が整うまで後続の作業を一時休止する。ほかにも例えば、CDメディアやネットワーク・ドライブをマウントするような処理なら、その作業が確実に完了してから先に進めるように、いくらか時間待ちをする(実際にどのくらい待つかは環境依存。十分な待ち時間を見込むようにすること)。
  • 遅延起動させる――あるコマンドを今すぐ実行するのではなく、例えば1時間後に実行したいのなら、先にsleep 3600というコマンドを実行させればよい。
  • 一定間隔ごとに起動させる――例えばsleep 60とpingなどを組み合わせて連続実行させると、1分ごとにネットワークの到達可能性チェックが行える。Windows OSのpingコマンドは、1秒に1回という高い頻度でパケットを送出するが、sleepと組み合わせることにより、より長い間隔で送信が可能になる。
  • システムやネットワークの負荷テストなどにおいて、実行頻度を抑制する――休止なしで実行すると、システムやネットワークに対して常に最大負荷がかかることになる。適宜休止時間を挟むことにより、現実に即した負荷を与えられる。

 Windows OSにはsleepコマンドは標準では用意されていないが、その代替となる方法はいくつかある。本TIPSではそれを紹介する。

操作方法

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

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

C:\>timeout /? ……ヘルプの表示

TIMEOUT [/T] タイムアウト [/NOBREAK]

説明:
    このユーティリティでは、タイムアウトのパラメーターを指定して、一定の時間 (秒)
    が経過するまで、またはユーザーが任意のキーを押すまで、プログラムを待機
    させることができます。
    キー入力を無視するためのパラメーターを指定することもできます。

パラメーター一覧:
    /T        タイムアウト  待機する時間 (秒) を指定します。
                            有効な範囲は -1 から 99999 秒までです。

    /NOBREAK                キーが押されても無視し、指定時間待ちます。

    /?                      このヘルプを表示します。

注意: タイムアウト値 -1 は、キーが押されるまで無限に待機することを意味します。

例:
    TIMEOUT /?
    TIMEOUT /T 10
    TIMEOUT /T 300 /NOBREAK
    TIMEOUT /T -1

C:\>



 timeout.exeは、元々はWindows 2000のResource Kitに含まれていたツールだが、Windows Vista/Windows Server 2003以降ではOSの標準コマンドとなっている。それ以前のWindows OSでは(標準状態では)使えないので、バッチ・ファイルなどを作成する場合は注意する。

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

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

 例えば、5秒待ってからメッセージを表示させるには次のようにする。timeoutとechoコマンドの間にある「&&」は、左側のコマンドの実行が正常終了したら、右側のコマンドを続いて実行するという意味である(バッチ・ファイル中なら、2行に分けて書いてもよいが、ここではインタラクティブに実行するためにこのようにしている)。

C:\>timeout 5 && echo ※※※コマンド実行中※※※

5 秒待っています。続行するには何かキーを押してください ... ……残り待ち時間表示。このログでは複数行並んでいるが、実際には1秒ごとに上書きで表示される
4 秒待っています。続行するには何かキーを押してください ...
3 秒待っています。続行するには何かキーを押してください ...
2 秒待っています。続行するには何かキーを押してください ...
1 秒待っています。続行するには何かキーを押してください ...
0 秒待っています。続行するには何かキーを押してください ...
※※※コマンド実行中※※※ ……echoコマンドの結果
C:\>



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

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

C:\>timeout 5 /nobreak && echo ※※※コマンド実行中※※※ ……/nobreakオプション付き

5 秒待っています。終了するには CTRL+C を押してください ... ……残り待ち時間表示。少しメッセージが異なる
……(中略)……
0 秒待っています。終了するには CTRL+C を押してください ...
※※※コマンド実行中※※※

C:\>



 sleepコマンドと違い、timeoutコマンドではこのようなメッセージが表示されるが、バッチ・ファイルなどではこれは不要なことが多い。その場合は標準出力をNULデバイスへリダイレクトすればよい。

C:\>timeout 5 /nobreak >nul && echo ※※※コマンド実行中※※※  ……>nulで表示を抑制
※※※コマンド実行中※※※ ……待ち時間表示なしで、echoが実行されている

C:\>



 引数として「-1」を付けると、何kキーを押すか中断させるまでずっと待ち続けるが、これはpauseコマンドと同じ意味になる。

●リソースキットのsleep.exeコマンドを使う

 timeout.exeコマンドは利用できるOSが限られるし、UNIXのsleepコマンドとは少し異なるので、そもそも必要なときにコマンド名を思い出せない可能性もある。そこで、UNIXのsleepと同じ名前/機能のコマンドを用意しておくと便利である。

 入手可能なsleepコマンドはいくつかあるが、ここではリソースキットに含まれるsleep.exeコマンドを紹介しておく(リソースキットについてはTIPS「Windows OS向けリソースキット・ツールを入手する」参照)。リソースキットにはいくつかバージョンがあるが、一番新しいsleep.exeはWindows Server 2003 Resource Kit Toolsに含まれている。このリソースキットをいったんWindows Serer 2003かWindows XP上にインストールして、sleep.exeを取り出せばよい。

 このsleep.exeの使い方は次の通りである。

C:\>sleep ……引数なしでヘルプ表示
Usage:  sleep      time-to-sleep-in-seconds
        sleep [-m] time-to-sleep-in-milliseconds
        sleep [-c] commited-memory ratio (1%-100%)



 引数として単に数字を付けるとその秒数だけ待つが、「-m <ミリ秒>」とするとミリ秒単位で待ち時間を指定できる。

C:\>sleep 5 && echo ※※※コマンド実行中※※※ ……5秒スリープしてからechoを実行
※※※コマンド実行中※※※

C:\>



●そのほかの環境におけるsleep機能

 これ以外にも、UNIX環境を実現するSUAを利用すると(TIPS「UNIX互換環境を実現するSUAを利用する」参照)、当然sleepコマンドはそのまま利用できる。

 WSHの場合は、WScriptオブジェクトにあるSleepメソッドを呼べばよい。具体的な使い方については、連載「Windows管理者のためのWindows Script Host入門」の第4回「WScriptオブジェクトの詳細(2)」 を参照していただきたい。

 PowerShellの場合は、Start-Sleepというコマンドレットを利用する(TIPS「PowerShellで進ちょく状況をプログレス・バーで表示する」参照)。

「Tech TIPS」のインデックス

Tech TIPS

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

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

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

メールマガジン登録

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