web-dev-qa-db-ja.com

バッチファイルでのスリープ

Windowsボックスで何かを自動化するバッチファイルを作成するとき、その実行を数秒間停止する必要がありました(通常はテスト/待機ループで、プロセスの開始を待機しています)。当時、私が見つけることができる最良の解決策は、目的の効果を達成するためにpingを使用します(私はあなたが子供ではありません)。私はそれのより良い記事を見つけました here 、これは以下のように実装された呼び出し可能な「wait.bat」を記述しています:

@ping 127.0.0.1 -n 2 -w 1000 > nul
@ping 127.0.0.1 -n %1% -w 1000> nul

その後、独自のバッチファイルにwait.batの呼び出しを含めて、スリープする秒数を渡すことができます。

どうやらWindows 2003リソースキットはUnixに似たスリープコマンドを提供しているようです (ついに!)それまでの間、まだWindows XP、Windows 2000または(悲しいことに) Windows NT を使用している私たちにとって、より良い方法はありますか?

受け入れられた回答sleep.pyスクリプトを変更し、コマンドラインで引数が渡されない場合のデフォルトが1秒になるようにしました。

import time, sys

time.sleep(float(sys.argv[1]) if len(sys.argv) > 1 else 1)
142
Jason Etheridge

Pythonがインストールされている場合、またはインストールを気にしない場合(他の用途もあります:)、次のコードを作成してくださいsleep.pyスクリプトを作成し、PATHのどこかに追加します。

import time, sys

time.sleep(float(sys.argv[1]))

必要に応じて、1秒未満の一時停止(たとえば、1.5秒、0.1など)が許可されます。 sleep.pyではなくsleepとして呼び出す場合は、.PY拡張をPATHEXT環境変数に追加できます。 Windows XPでは、次の場所で編集できます。

マイコンピュータ→プロパティ(メニュー)→詳細設定(タブ)→環境変数(ボタン)→システム変数(フレーム)

更新:Windows Vista以降で使用可能なtimeoutコマンドは、別の answer で説明されているように、使用するコマンドである必要があります。

13
tzot

timeout コマンドは、Windows Vista以降で利用可能です。

c:\> timeout /?

TIMEOUT [/T] timeout [/NOBREAK]

Description:
    This utility accepts a timeout parameter to wait for the specified
    time period (in seconds) or until any key is pressed. It also
    accepts a parameter to ignore the key press.

Parameter List:
    /T        timeout       Specifies the number of seconds to wait.
                            Valid range is -1 to 99999 seconds.

    /NOBREAK                Ignore key presses and wait specified time.

    /?                      Displays this help message.

NOTE: A timeout value of -1 means to wait indefinitely for a key press.

Examples:
    TIMEOUT /?
    TIMEOUT /T 10
    TIMEOUT /T 300 /NOBREAK
    TIMEOUT /T -1

注:入力リダイレクトでは機能しません-簡単な例:

C:\>echo 1 | timeout /t 1 /nobreak
ERROR: Input redirection is not supported, exiting the process immediately.
217
Blorgbeard

pingメソッドを概説したように使用すると、実行可能ファイルを追加したり、他のソフトウェアをインストールしたりできない(またはしたくない)ときに、それを行うことができます。

そこにないものをpingし、-wフラグを使用して、その時間後に失敗するようにします。isがある(localhostなど)-n回。これにより、1秒未満の時間を処理でき、わずかに正確であると思います。

例えば.

(1.1.1.1が使用されていないことをテスト)

ECHO Waiting 15 seconds

PING 1.1.1.1 -n 1 -w 15000 > NUL
  or
PING -n 15 -w 1000 127.1 >NUL
21
daniel

SLEEP.exeは、ほとんどのリソースキットに含まれています。 Windows Server 2003リソースキット これはWindows XPにもインストールできます。

Usage:  sleep      time-to-sleep-in-seconds
        sleep [-m] time-to-sleep-in-milliseconds
        sleep [-c] commited-memory ratio (1%-100%)
15
Luk

ここで見つけた答えに同意しません。

Windows XPの機能に完全に基づいた次の方法を使用して、バッチファイルで遅延を実行します。

DELAY.BAT:

@ECHO OFF
REM DELAY seconds

REM GET ENDING SECOND
FOR /F "TOKENS=1-3 DELIMS=:." %%A IN ("%TIME%") DO SET /A H=%%A, M=1%%B%%100, S=1%%C%%100, ENDING=(H*60+M)*60+S+%1

REM WAIT FOR SUCH A SECOND
:WAIT
FOR /F "TOKENS=1-3 DELIMS=:." %%A IN ("%TIME%") DO SET /A H=%%A, M=1%%B%%100, S=1%%C%%100, CURRENT=(H*60+M)*60+S
IF %CURRENT% LSS %ENDING% GOTO WAIT

また、遅延間隔が真夜中を過ぎたときにメソッドが機能するように、計算に日を挿入することもできます。

15
Aacini

同様の問題に直面しましたが、同じことをするために非常に短いC++コンソールアプリケーションをノックアップしました。 MySleep.exe 10を実行するだけです-リソースキット全体をダウンロード/インストールするよりもおそらく簡単です。

#include <tchar.h>
#include <stdio.h>
#include "Windows.h"

int _tmain(int argc, _TCHAR* argv[])
{
    if (argc == 2)
    {
        _tprintf(_T("Sleeping for %s ms\n"), argv[1]);
        Sleep(_tstoi(argv[1]));
    }
    else
    {
        _tprintf(_T("Wrong number of arguments.\n"));
    }
    return 0;
}
13
John Sibly

サーバーフォールトで 同様の質問が行われました で、解決策は次のとおりです。

choice /d y /t 5 > nul
10
mlsteeves

Windows cscript WSHレイヤーとこのwait.js JavaScriptファイルを使用できます。

if (WScript.Arguments.Count() == 1)
    WScript.Sleep(WScript.Arguments(0)*1000);
else
    WScript.Echo("Usage: cscript wait.js seconds");
9
Blake7

互換性のニーズに応じて、pingを使用します。

ping -n <numberofseconds+1> localhost >nul 2>&1

例えば5秒待つには、

ping -n 6 localhost >nul 2>&1

または、Windows 7以降ではtimeoutを使用します。

timeout 6 >nul
8
Joey

Pingを使用できます。

ping 127.0.0.1 -n 11 -w 1000 >nul: 2>nul:

10秒間待機します。

11を使用する必要があるのは、1秒後にではなく、最初のpingがすぐに送信されるためです。数値は常に、待機する秒数よりも1多い必要があります。

-wの目的は1秒間待つことではないことに注意してください。ネットワークの問題が発生した場合に、1秒以内にmoreを待たないようにします。 pingは、それ自体で毎秒1つのICMPパケットを送信します。おそらくローカルホストには必要ありませんが、古い習慣は一生懸命死にます。

8
paxdiablo
timeout /t <seconds> <options>

たとえば、スクリプトに中断のない2秒間の待機を実行させるには:

timeout /t 2 /nobreak >NUL

つまり、スクリプトは続行する前に2秒待機します。

デフォルトでは、キーストロークによってタイムアウトが中断されるため、ユーザーが待機を中断(キャンセル)できるようにしたくない場合は、/nobreakスイッチを使用します。さらに、タイムアウトは秒単位の通知を提供して、ユーザーに待機時間を通知します。これは、コマンドをNULにパイプすることで削除できます。

edit:As @ martineaコメントで指摘timeoutコマンドWindows 7以降でのみ利用可能です。さらに、pingコマンドは、timeoutよりも少ないプロセッサー時間を使用します。ただし、timeout 'hack'よりも読みやすいため、可能な場合はpingを使用することを信じています。続きを読む こちら

6
mgthomas99

Pingを使用してスリープするより良い方法があります。存在しないアドレスにpingを実行する必要があるため、ミリ秒の精度でタイムアウトを指定できます。幸いなことに、そのようなアドレスは標準(RFC 3330)で定義されており、192.0.2.xです。これは構成されておらず、実際には存在しないという唯一の目的を持つアドレスです(明確ではないかもしれませんが、ローカルネットワークでも適用されます)。

192.0.2.0/24-このブロックは、ドキュメントおよびサンプルコードで使用するために「TEST-NET」として割り当てられています。多くの場合、ベンダーおよびプロトコルのドキュメントでexample.comまたはexample.netのドメイン名と組み合わせて使用​​されます。このブロック内のアドレスは、パブリックインターネットに表示されるべきではありません。

123ミリ秒スリープするには、ping 192.0.2.1 -n 1 -w 123 >nulを使用します

6
mafu

待ちたい場所にバッチファイルでこれを配置します。

@ping 127.0.0.1 -n 11 -w 1000 > null
5
Brent Stewart

システムに PowerShell がある場合は、次のコマンドを実行できます。

powershell -command "Start-Sleep -s 1"

編集: 同様のスレッドでの私の答え から、人々はあなたが待っている時間と比較してpowershellの開始にかかる時間がかなり長いという問題を提起しました。待機時間の精度が重要な場合(つまり、1〜2秒の余分な遅延は許容されません)、このアプローチを使用できます。

powershell -command "$sleepUntil = [DateTime]::Parse('%date% %time%').AddSeconds(5); $sleepDuration = $sleepUntil.Subtract((get-date)).TotalMilliseconds; start-sleep -m $sleepDuration"

これにはwindowsコマンドが発行された時間がかかり、powershellスクリプトはその時間の後5秒までスリープします。したがって、PowerShellがスリープ時間よりも起動にかかる時間が短い限り、このアプローチは機能します(私のマシンでは約600msです)。

5

メモ帳で、次のように記述します。

@echo off
set /a WAITTIME=%1+1
PING 127.0.0.1 -n %WAITTIME% > nul
goto:eof

ここで、フォルダーC:\ WINDOWS\System32にwait.batとして保存し、待機する場合はいつでも使用します。

CALL WAIT.bat <whole number of seconds without quotes>
4
SuperKael

Resource Kit には常にこれが含まれています。少なくともWindows 2000以降。

また、Cygwinパッケージにはsleepがあります。これをPATHに挿入し、cygwin.dll(またはそれが呼び出されたもの)とその方法を含めます!

4
Daren Thomas

Aaciniの応答 が好きです。 1日を処理するために追加し、 centiseconds%TIME%出力H:MM:SS.CC)を処理できるようにしました:

:delay
SET DELAYINPUT=%1
SET /A DAYS=DELAYINPUT/8640000
SET /A DELAYINPUT=DELAYINPUT-(DAYS*864000)

::Get ending centisecond (10 milliseconds)
FOR /F "tokens=1-4 delims=:." %%A IN ("%TIME%") DO SET /A H=%%A, M=1%%B%%100, S=1%%C%%100, X=1%%D%%100, ENDING=((H*60+M)*60+S)*100+X+DELAYINPUT
SET /A DAYS=DAYS+ENDING/8640000
SET /A ENDING=ENDING-(DAYS*864000)

::Wait for such a centisecond
:delay_wait
FOR /F "tokens=1-4 delims=:." %%A IN ("%TIME%") DO SET /A H=%%A, M=1%%B%%100, S=1%%C%%100, X=1%%D%%100, CURRENT=((H*60+M)*60+S)*100+X
IF DEFINED LASTCURRENT IF %CURRENT% LSS %LASTCURRENT% SET /A DAYS=DAYS-1
SET LASTCURRENT=%CURRENT%
IF %CURRENT% LSS %ENDING% GOTO delay_wait
IF %DAYS% GTR 0 GOTO delay_wait
GOTO :EOF
3
Hossy

私はこのC#スリーププログラムを使用しています。 C#が優先言語である場合、より便利な場合があります。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace sleep
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args.Length == 1)
            {
                double time = Double.Parse(args[0]);
                Thread.Sleep((int)(time*1000));
            }
            else
            {
                Console.WriteLine("Usage: sleep <seconds>\nExample: sleep 10");
            }
        }
    }
}
3
Liam

Windows 2000以降のすべてのWindowsバージョンで動作する最適なソリューションは次のとおりです。

timeout numbersofseconds /nobreak > nul
2
Tato

ping を使用するのは、「ちょっと待って」だけであれば良いです。これは、ネットワークの機能や127.0.0.1に応答するものがないなど、他の機能に依存しているためです。 ;-)たぶんそれは失敗する可能性は非常に低いですが、不可能ではありません...

指定した時間を正確に待機していることを確認したい場合は、sleep機能を使用する必要があります(CPUパワーを使用しないか、ネットワークの準備が整うまで待機するという利点もあります)。

すでに作成されたスリープ用の実行可能ファイルを見つけることが最も便利な方法です。 Windowsフォルダまたは標準パスの他の部分にドロップするだけで、いつでも利用できます。

それ以外の場合、コンパイル環境がある場合は、自分で簡単に作成できます。 Sleep関数はkernel32.dllで使用できるため、使用する必要があります。 :-) VB/VBAの場合、ソースの先頭で次を宣言して、スリープ関数を宣言します。

private Declare Sub Sleep Lib "kernel32" Alias "Sleep" (byval dwMilliseconds as Long)

C#の場合:

[DllImport("kernel32.dll")]
static extern void Sleep(uint dwMilliseconds);

この機能(Windows 2000以降で使用可能)の詳細については、スリープ機能(MSDN)を参照してください。

標準Cでは、sleep()は標準ライブラリに含まれており、MicrosoftのVisual Studio Cでは、メモリが私に役立つ場合、関数の名前はSleep()です。 ;-)これらの2つの引数は、前の2つの宣言のようにミリ秒単位ではなく、秒単位で引数を取ります。

2
Tooony

Pythonソリューションよりもさらに軽量なのは、Perlのワンライナーです。

7秒間スリープするには、これをBATスクリプトに追加します。

Perl -e "sleep 7"

このソリューションは、1秒の解像度のみを提供します。

より高い解像度が必要な場合は、CPANのTime :: HiResモジュールを使用してください。マイクロ秒でスリープするusleep()およびナノ秒でスリープするnanosleep()を提供します(両方の関数は整数引数のみを取ります)。 Stack Overflowの質問Perlで1ミリ秒スリープする方法を参照してください。

ActivePerl を長年使用しました。インストールはとても簡単です。

2
Peter Mortensen

または、コマンドラインPython、たとえば6秒半:

python -c "import time;time.sleep(6.5)"
2
Alex Robinson

私はこれに感銘を受けました:

http://www.computerhope.com/batch.htm#02

choice /n /c y /d y /t 5 > NUL

技術的には、choiceコマンドにyのみを受け入れるように指示しています。デフォルトはyで、5秒でこれを行い、プロンプトを表示せず、NULに表示する内容をダンプします(Linuxのヌル端末など)。

1
Chris Moschini

Windows Vistaには TIMEOUT および SLEEP コマンドがありますが、Windows XPまたはWindows Serverで使用するには2003では、 Windows Server 2003リソースツールキットが必要です

ここで 睡眠の代替案の良い概要があります(すべてのWindowsマシンで動作するため、pingアプローチが最も人気があります)が、(少なくとも)言及されていないものがあります( ab) W32TM (Time Service)コマンドを使用します:

w32tm /stripchart /computer:localhost /period:1 /dataonly /samples:N  >nul 2>&1

Nを一時停止する秒に置き換える場所。また、前提条件なしですべてのWindowsシステムで動作します。

Typeperfも使用できます。

typeperf "\System\Processor Queue Length" -si N -sc 1 >nul
1
npocmaka

Pathping.exeは1秒未満でスリープできます。

@echo off
setlocal EnableDelayedExpansion 
echo !TIME! & pathping localhost -n -q 1 -p %~1 2>&1 > nul & echo !TIME!

> sleep 10
17:01:33,57
17:01:33,60

> sleep 20
17:03:56,54
17:03:56,58

> sleep 50
17:04:30,80
17:04:30,87

> sleep 100
17:07:06,12
17:07:06,25

> sleep 200
17:07:08,42
17:07:08,64

> sleep 500
17:07:11,05
17:07:11,57

> sleep 800
17:07:18,98
17:07:19,81

> sleep 1000
17:07:22,61
17:07:23,62

> sleep 1500
17:07:27,55
17:07:29,06
1
Andry

.vbsファイルを使用して、特定のタイムアウトを実行することもできます。

以下のコードは、.vbsファイルを作成します。これをrbatchコードの一番上に置きます:

echo WScript.sleep WScript.Arguments(0) >"%cd%\sleeper.vbs"

次のコードは、.vbsを開き、待機する時間を指定します。

start /WAIT "" "%cd%\sleeper.vbs" "1000"

上記のコードでは、「1000」はミリ秒単位で.vbsファイルに送信される時間遅延の値です(例:1000 ms = 1 s)。必要に応じてこの部分を変更できます。

以下のコードは、作業が完了した後に.vbsファイルを削除します。これをバッチファイルの最後に追加します。

del /f /q "%cd%\sleeper.vbs"

そして、ここにすべて一緒にコードがあるので、簡単にコピーできます:

echo WScript.sleep WScript.Arguments(0) >"%cd%\sleeper.vbs"
start /WAIT "" "%cd%\sleeper.vbs" "1000"
del /f /q "%cd%\sleeper.vbs"
1
EpicNinjaCheese

他の人がサードパーティのプログラム(Python、Perl、カスタムアプリなど)を提案しているため、別のオプションは http://gnuwin32.sourceforge.net/packages/coreutilsで利用可能なGNU CoreUtils for Windowsです。 .htm

展開の2つのオプション:

  1. 完全なパッケージ(CoreUtils、依存関係、ドキュメントなどの完全なスイートが含まれます)をインストールします。
  2. 'sleep.exe'バイナリと必要な依存関係のみをインストールします(depends.exeを使用して依存関係を取得します)。

CoreUtilsを展開する利点の1つは、スクリプト作成に役立つ他のプログラムのホストを追加で取得できることです(Windowsバッチには多くの要望があります)。

0
codesniffer

タイトルバーにPAUSEメッセージを入れることで空想を得ることができます:

@ECHO off
SET TITLETEXT=Sleep
TITLE %TITLETEXT%
CALL :sleep 5
GOTO :END
:: Function Section
:sleep ARG
ECHO Pausing...
FOR /l %%a in (%~1,-1,1) DO (TITLE Script %TITLETEXT% -- time left^
 %%as&PING.exe -n 2 -w 1000 127.1>NUL)
EXIT /B 0
:: End of script
:END
pause
::this is EOF
0
djangofan

これは、Windows XP SP3およびWindows 7でテストされ、CScriptを使用しています。 del ""プロンプトを回避するために、いくつかの安全ガードを設置しました。 (/qは危険です)

1秒待ちます:

sleepOrDelayExecution 1000

500ミリ秒待ってから以下を実行します:

sleepOrDelayExecution 500 dir \ /s

sleepOrDelayExecution.bat:

@echo off
if "%1" == "" goto end
if NOT %1 GTR 0 goto end
setlocal
set sleepfn="%temp%\sleep%random%.vbs"
echo WScript.Sleep(%1) >%sleepfn%
if NOT %sleepfn% == "" if NOT EXIST %sleepfn% goto end
cscript %sleepfn% >nul
if NOT %sleepfn% == "" if EXIST %sleepfn% del %sleepfn%
for /f "usebackq tokens=1*" %%i in (`echo %*`) DO @ set params=%%j
%params%
:end
0