158

Windows ボックスで何かを自動化するためにバッチ ファイルを作成するとき、その実行を数秒間一時停止する必要がありました (通常はテスト/待機ループで、プロセスの開始を待機します)。当時、私が見つけることができた最善の解決策は、目的の効果を達成するために ping を使用することでした (冗談ではありません)。次のように実装された呼び出し可能な「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 Resource Kit は Unix ライクなスリープ コマンドを(ついに!) 提供するようです。それまでの間、まだ Windows XP、Windows 2000、または (悲しいことに) Windows NTを使用している私たちにとって、より良い方法はありますか?

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

import time, sys

time.sleep(float(sys.argv[1]) if len(sys.argv) > 1 else 1)
4

32 に答える 32

236

この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.
于 2011-03-30T08:38:43.610 に答える
21

概説されている方法を使用するpingことは、実行可能ファイルを追加したり、他のソフトウェアをインストールしたりできない (またはしたくない) 場合の方法です。

そこにないものにpingを実行し、フラグを使用して、そこにあるもの(localhostなど)に-wpingを実行するのではなく、その時間後に失敗するようにする必要があります。これにより、1 秒未満の時間を処理できるようになり、少し正確になったと思います。-n

例えば

(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
于 2011-07-28T00:20:12.243 に答える
18

アップデート

この質問に対する別の回答timeoutで説明されているように、Windows Vista 以降で使用できるコマンドは、使用するコマンドである必要があります。ここに続くのは古い答えです。

古い答え

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

import time, sys

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

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

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

于 2008-10-03T10:42:19.897 に答える
16

SLEEP.exeほとんどのリソースキットに含まれています。たとえば、 WindowsXPにもインストールできるWindowsServer2003リソースキットです。

Usage:  sleep      time-to-sleep-in-seconds
        sleep [-m] time-to-sleep-in-milliseconds
        sleep [-c] commited-memory ratio (1%-100%)
于 2008-10-03T09:15:39.260 に答える
15

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

バッチ ファイルで遅延を実行するために、完全に 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

計算に日を挿入して、遅延間隔が真夜中を過ぎたときにもこの方法が機能するようにすることもできます。

于 2011-07-24T10:10:43.117 に答える
13

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

#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;
}
于 2008-10-03T09:35:43.543 に答える
10

ping を使用できます。

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

10 秒待ちます。

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

の目的は、パケットの送信頻度を制御することではなく、ネットワークに問題が発生した場合に、ある程度の時間だけ-w待機するようにすることであることに注意してください。127.0.0.1 に ping を実行している場合、問題が発生する可能性は低いため、これはおそらく意味がありません。

コマンド自体は、通常、ping1 秒あたり 1 パケットを送信します。これは実際には Windows のドキュメントには記載されていませんが、Linux バージョン (記載されている場所) と同じ規則に従っているようです。

于 2009-08-20T08:28:55.757 に答える
10

Server Fault で、同様の質問がありましたが、解決策は次のとおりです。

choice /d y /t 5 > nul
于 2009-11-28T01:29:47.380 に答える
9

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");
于 2009-11-28T02:00:40.420 に答える
8

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

更新: コメントによると、 もあり127.255.255.255ます。

于 2014-02-21T17:24:23.267 に答える
8

互換性のニーズに応じて、次のいずれかを使用しますping

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

たとえば、5 秒間待機するには、次を使用します。

ping -n 6 localhost >nul 2>&1

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

timeout 6 >nul
于 2011-03-25T21:04:54.050 に答える
7
timeout /t <seconds> <options>

たとえば、スクリプトが中断不可能な 2 秒間の待機を実行するようにするには、次のようにします。

timeout /t 2 /nobreak >NUL

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

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

編集: @martineauがコメントで 指摘しているように、このtimeoutコマンドは Windows 7 以降でのみ使用できます。さらに、このpingコマンドは よりも少ないプロセッサ時間を使用しますtimeout。ただし、 「ハック」timeoutよりも読みやすいので、可能な限り使用することを今でも信じています。ping詳細はこちらをご覧ください

于 2014-06-03T18:55:46.113 に答える
5

これを、待機したいバッチファイルに入れるだけです。

@ping 127.0.0.1 -n 11 -w 1000 > null
于 2011-03-25T19:35:09.460 に答える
4

リソースキットには常にこれが含まれています。少なくともWindows2000以降。

また、Cygwinパッケージには、sleepPATHに-plopがあり、cygwin.dll(またはそれが呼ばれるものは何でも)そして進むべき道が含まれています!

于 2008-10-03T09:13:05.803 に答える
4

メモ帳に次のように書きます。

@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>
于 2013-01-18T17:35:21.017 に答える
3

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

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

perl -e "sleep 7"

このソリューションは、1秒の解像度しか提供しません。

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

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

于 2009-07-29T18:12:24.757 に答える
3

私はこの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");
            }
        }
    }
}
于 2009-07-07T14:39:09.053 に答える
3

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 以降で使用可能) の詳細については、Sleep 関数(MSDN) を参照してください。

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

于 2008-10-03T10:08:15.957 に答える
3

私はAaciniの反応が好きです。日を処理し、センチ秒を処理できるようにするために追加しました(%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
于 2013-01-29T02:30:37.333 に答える
2

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

python -c "import time;time.sleep(6.5)"
于 2012-01-08T05:39:12.237 に答える
2

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

timeout numbersofseconds /nobreak > nul
于 2014-02-05T19:30:27.417 に答える
2

cmd/batch で「スリープ」を実現する方法はたくさんあります。

私のお気に入り:

TIMEOUT /NOBREAK 5 >NUL 2>NUL

これにより、出力なしでコンソールが 5 秒間停止します。

最も使用:

ping localhost -n 5 >NUL 2>NUL

localhostこれで5回接続を試みます。コンピューターでホストされているため、常にホストに到達するため、毎秒新しいものを試します。フラグは、-nスクリプトが接続を試行する回数を示します。この場合は 5 なので、5 秒間続きます。

最後のもののバリアント:

ping 1.1.1.1 -n 5 >nul

このスクリプトには、最後のスクリプトと比較していくつかの違いがあります。これは を呼び出そうとしませんlocalhost1.1.1.1代わりに、非常に高速な Web サイトである に接続しようとします。このアクションは、アクティブなインターネット接続がある場合にのみ 5 秒間続きます。それ以外の場合、アクションを完了するまでに約 15 時間かかります。この方法の使用はお勧めしません。

ping 127.0.0.1 -n 5 >nul

これは、例 2 (最も使用される) とまったく同じです。また、次のものも使用できます。

ping [::1] -n 5 >nul

これは代わりに、IPv6 のlocalhostバージョンを使用します。

このアクションを実行する方法はたくさんあります。ただし、Windows Vista 以降のバージョンでは方法 1 を、それ以前のバージョンの OS では最もよく使用される方法 (方法 2) をお勧めします。

于 2020-06-23T00:47:06.710 に答える
1

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

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

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

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

于 2011-04-28T17:15:08.887 に答える
1

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

以下のコードは、.vbs ファイルを作成します。これを rbatch コードの先頭近くに配置します。

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

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

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

上記のコードで、「1000」はミリ秒単位で .vbs ファイルに送信される時間遅延の値です。たとえば、1000 ms = 1 秒です。この部分は好きな長さに変更できます。

以下のコードは、.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"
于 2014-01-21T08:28:47.237 に答える
0

Windows Vista からはTIMEOUTコマンドとSLEEPコマンドがありますが、Windows XP または Windows Server 2003 でそれらを使用するには、Windows Server 2003 リソース ツール キットが必要です。

ここでは、スリープの代替手段の概要を説明しています (すべての Windows マシンで動作するため、ping アプローチが最も一般的です)。ただし、(少なくとも) W32TM(Time Service) コマンドを (ab) 使用する言及されていないものがあります。

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

mshta と javascript の場合 (1 秒未満のスリープに使用できます):

start "" /wait /min /realtime mshta "javascript:setTimeout(function(){close();},5000)"

これはさらに正確なはずです(1秒未満で待機するため)-依存する自己コンパイル実行可能ファイル.net

@if (@X)==(@Y) @end /* JScript comment
@echo off
setlocal
::del %~n0.exe /q /f
::
:: For precision better call this like
:: call waitMS 500
:: in order to skip compilation in case there's already built .exe
:: as without pointed extension first the .exe will be called due to the ordering in PATEXT variable
::
::
for /f "tokens=* delims=" %%v in ('dir /b /s /a:-d  /o:-n "%SystemRoot%\Microsoft.NET\Framework\*jsc.exe"') do (
   set "jsc=%%v"
)

if not exist "%~n0.exe" (
    "%jsc%" /nologo /w:0 /out:"%~n0.exe" "%~dpsfnx0"
)


%~n0.exe %*

endlocal & exit /b %errorlevel%


*/


import System;
import System.Threading;

var arguments:String[] = Environment.GetCommandLineArgs();
function printHelp(){
    Console.WriteLine(arguments[0]+" N");
    Console.WriteLine(" N - milliseconds to wait");
    Environment.Exit(0);    
}

if(arguments.length<2){
    printHelp();
}

try{
    var wait:Int32=Int32.Parse(arguments[1]);
    System.Threading.Thread.Sleep(wait);
}catch(err){
    Console.WriteLine('Invalid Number passed');
    Environment.Exit(1);
}
于 2014-01-08T11:50:43.363 に答える
-2
ping -n X 127.0.0.1 > nul

X を秒数 + 1 に置き換えます。

たとえば、10 秒待つ場合は、X を 11 に置き換えます。5 秒待つ場合は、6 を使用します。

以前の回答をミリ秒読みます。

于 2014-07-28T07:51:43.573 に答える