Stackoverflowの以下の記事がはてブで話題になっていたので取り上げる。
Windowsには*nixで言うところのsleep
コマンドが存在せず、バッチ等で一定時間(例えば5秒だけ)ウェイトさせることができない。
このためにいくつかハックがある。
-
ping
を利用する -
timeout
を利用する -
choice
を利用する
pingを利用する
ping
はパケットを送信する試行回数やタイムアウト時間を調整できる。これを利用して無意味なping
をsleep代わりに利用するハックである。
タイムアウトで停止時間を制御する場合は、以下のように無効なIPアドレスにpingすれば良い。-n
で試行回数1回として、-W
で5000ミリのタイムアウトが発生するように期待する。
ping 1.1.1.1 -n 1 -W 5000 > nul
逆に、ローカルホストにping
して試行回数により停止時間を制御する方法もある。これは127.0.0.1が必ず応答し、かつpingの送信間隔が1秒であることを応用したものだ。
ping 127.0.0.1 -n 5 > nul
個人的には後者の方がシンプルで好きである。
timeoutを利用する
これは非常にシンプルだ。Windows7であればtimeout
コマンドが利用できる。Windowsが新しいならぜひ利用したい。
timeout 5
choiceを利用する
choice
はユーザに選択をさせるコマンドである。このコマンドはユーザに選択肢を提示し、一定時間入力がなければ、デフォルトが選択されたものとみなす。
choice
は/T
スイッチでタイムアウトを設定できるため、これをsleep代わりに利用しようというものだ。5秒のウェイトであれば以下のとおり。
choice /C YN /D Y /t 5
しかしなぜマイクロソフトはsleepをDOSに組み込んでおかなかったのか、理解に苦しむ。せめてもう少し気が利いていれば、2013年にもなって未だこんな話題が出てくる事態にはならなかっただろう。