Windows-sleepコマンドの実現
Windowsでのsleepコマンド
バッチ処理において一定時間処理を停止したい場合、UNIX系OSではsleepコマンドを使いますが、Windows OSには標準のsleepコマンドは存在しないため、デフォルトの環境では実現できません。
最も簡単なのはWebからWindows用sleepコマンドを取得することですが、環境や構成管理の都合により新規コマンドを追加できないこともあります。
そのような場合にも、一定時間の待ち合わせ処理を実現するための工夫を以下に記載します。
timeoutコマンドでの待ち合わせ
Windowsでは一定時間待ち合わせる処理を実現するために、timeoutコマンドが利用できます。
(timeout.exeは、Windows Vista/Windows Server 2003以降ではOSの標準コマンドとなっています。)
例えば、30秒待ち合わせる場合には以下のコマンドを実行します。
> TIMEOUT /T 60 /NOBREAK
ただし、timeoutコマンドを利用する場合には、実際に動作を検証する必要があります。
なぜなら、timeoutコマンドでは「/nobreak」オプションを指定しても、標準入力を待ち合わせる動作を行います。
スケジューラ系ミドルウェアなどからtimeoutコマンドを実行した場合には、プロセスをkillされてしまい、正しく時間待ち合わせ処理が行えないといった場合があります。
pingコマンドでの待ち合わせ
よく使われるWindowsの時刻待ち方法として、pingコマンドを指定回数実行する方法があります。
宛先にlocalhostを指定して、自分自身にpingを行います。
例えば、30秒待ち合わせる場合には以下のコマンドを実行します。
> ping -n 30 localhost
PowerShellを利用した待ち合わせ
PowerShellの「Start-Sleep」を利用することで、sleepコマンドそのものの動作を再現できます。
例えば、30秒待ち合わせる場合には以下のコマンドを実行します。
powershell -Command Start-Sleep -s 30
応答まで待ち合わせ
バッチファイルにおいて、キー入力が行われるまで無限に待ち合わせる場合には、pauseコマンドを利用します。
一定時間待ち合わせるといった動作は行えません。
pause
VBSでsleepコマンドを作成する
vbscriptでsleepコマンドを作成する方法もあります。
下記のスクリプト「sleep.vbs」を作成します。
Option Explicit
main()
Function initialize(args)
' 引数の数を確認する
if args.count = 0 then
WScript.Echo("ERROR: too few arguments.")
exit Function
end if
' 引数の型を確認する
if IsNumeric(WScript.Arguments(0)) = false then
WScript.Echo("ERROR: Invalid argument: " & WScript.Arguments(0))
exit Function
end if
initialize = true
end Function
Function exec_sleep(msec)
dim sec
' ミリ秒から秒に変換する。
sec = msec * 1000
WScript.Echo("sleep start: " & now)
WScript.Sleep(sec)
WScript.Echo("sleep end : " & now)
exec_sleep = true
end Function
Sub main()
dim rc
rc = initialize(WScript.Arguments)
if rc = false then WScript.Quit(-1)
rc = exec_sleep(WScript.Arguments(0))
if rc = false then WScript.Quit(-1)
WScript.Quit(0)
end Sub
あわせて、vbsファイルをcscriptで呼び出すための以下のようなバッチファイル「sleep.bat」を作成します。
@echo off
if "%~1" == "" (
echo usage: %0 second
exit /b 0
)
set time_val=%~1
cscript //nologo %CD%\sleep.vbs "%time_val%"
exit /b %ERRORLEVEL%
バッチファイルの引数に数値を指定することで、指定秒を待ち合わせることができます。
> sleep.bat 30