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

関連ページ