バッチファイルなどで実行を一時停止(休止、スリープ)したい場合、Linuxなどではsleepというコマンドを使う。Windows OSには標準のsleepコマンドはないものの、代わりに「timeout」コマンドやPowerShellの「Start-Sleep」コマンドレットが利用できる。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
対象OS:Windows 8.1/Windows 10/Windows 11、Windows Server 2012/Windows Server 2012 R2/Windows Server 2016/Windows Server 2019/Windows Server 2022
バッチファイルでコマンドを実行する場合、バッチの各行は連続して順番に実行される。その際、いくらか時間待ち(休止、スリープ)をさせたいことがある。そのような場合、UNIXやLinuxなどには「sleep」というコマンドが用意されており、例えば「sleep 60」とするとスクリプトの実行がそこで60秒間休止する。
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 Vista/Windows Server 2003以降であれば、インストールなどの事前作業なしですぐ実行できる。
timeoutコマンドは、単に指定された時間を待つだけでなく、途中で何らかのキー入力をすると、そこで終了する(休止を中断する)。sleepコマンドというよりは、最大待ち時間制限付きのpauseコマンドという感じのコマンドである。timeoutという名前からも分かるように、主にユーザーのキー入力待ちのために作られたコマンドだ。
timeoutに数値の引数を指定すると、その秒数だけ待つ(引数なしはエラー)。例えば、5秒待ってからメッセージを表示させるには次のようにする。
timeout 5
timeoutとechoコマンドの間にある「&&」は、左側のコマンドの実行が正常終了したら、右側のコマンドを続いて実行するという意味である。ここではインタラクティブに実行するためにこのようにしている。バッチファイル中なら、2行に分けて書いてもよい。
さてtimeoutコマンドでは、1秒ごとに残り待ち時間を知らせるメッセージが表示される。途中で何らかのキーを押すとそこで中断し(timeoutが終了し)、この場合ならechoコマンドが実行される。
途中でユーザーのキー操作による中断をさせず、必ず最後までカウントダウンさせるには、「/nobreak」オプションを付ける。
timeout 5 /nobreak
ただしこの場合でも、[Ctrl]+[C](または[Ctrl]+[Break])キーを押せば中断できる。
Linuxなどのsleepコマンドと違い、timeoutコマンドでは前述のようにカウントダウンのメッセージが表示される。バッチファイルなどでは、こうしたメッセージが邪魔になることも多い。その場合は標準出力を「nul」デバイスへリダイレクトする(「>nul」を付ける)と非表示にできる。
timeout 5 /nobreak >nul
PowerShellには「Start-Sleep」というコマンドレットがあり、引数で指定した秒数だけ休止するという機能を持っている。例えば「Start-Sleep 60」とすると、60秒間休止する。「Start-Sleep -Milliseconds <ミリ秒>」または「Start-Sleep -m <ミリ秒>」とすれば、1ミリ秒(1000分の1秒)単位で休止時間を指定できる(実際にはコマンドのロードタイムなどが必要なので、あまりシビアな待ち時間制御はできない)。
Start-Sleepコマンドレットは「Sleep」というエイリアス(別名)としても定義されている。コマンドプロンプトやバッチファイル中で「sleep 5」を実行したいなら、その前に「powershell」を付ける。
powershell sleep 5
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】初版公開。
Copyright© Digital Advantage Corp. All Rights Reserved.