連載
» 2022年03月09日 05時00分 公開

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

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

[デジタルアドバンテージ,著]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「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秒)単位で休止時間を指定できる(実際にはコマンドのロードタイムなどが必要なので、あまりシビアな待ち時間制御はできない)。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

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

メールマガジン登録

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