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


151

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リソースキットは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)

Windows 2003 Resource Kit のMicrosoft ダウンロードページは、XPでも動作することを示しています。私は他に選択肢がないのではないかと考えています。「外部」ユーティリティを使用して待機することです。XPコマンドプロセッサに組み込まれているこのようなものはありません。
GerG 2008年

2003サーバーリソースキットは、Windows XP(およびおそらくw2k)で動作します
Martin Beckett

私は過去に同じ問題に直面し、自分自身にpingを使用しました(上記のコメントで、これが愚かであることを明確に文書化しています:))。
Jack Leow、2009


2
いくつかのオプションがあります- pingコマンドでスリープをエミュレートするか、sleepコマンドを含むWindowsリソースキットをダウンロードします。詳細はこちら:バッチファイルSLEEPコマンド
Rudu

回答:


14

更新

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追加でき.PYます。Windows XPでは、次の場所で編集できます。

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


32
バッチスクリプト可能なソリューションが要求されたときに、なぜPythonでスクリプトを記述する必要があるのですか?パス拡張機能は、WindowsユーザーにPythonインタープリターがインストールされていないという問題をどのように解決できますか?ありがとう。
Val

6
移植性のために、完全にすばらしいネイティブの代替手段があるため、このソリューションは避けるべきだと思います。
Gras Double

1
このアプローチは過去に回避策を提供した可能性がありますが、@ Blorgbeardによって記述されたネイティブソリューションは間違いなく進むべき道です。
マイク

227

この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.

8
コンソールなしの使用では機能しません:「エラー:入力リダイレクトはサポートされていないため、プロセスをすぐに終了します。」
simpleuser 2013

バッチファイルが他のプロセスからのフォーク、cygwin crontab、またはリモートsshコマンドなどを介してバックグラウンドで実行される場合など、コンソールがまったくない場合を意味しました
simpleuser

1
そうそうそう。私が示した例は、エラーを示すためだけのもの
でした

3
@Cristian Ciupituによって追加されたのドキュメントへのリンクtimeoutは部分的に間違っています-Windows XPにはこのコマンドがありません。
martineau 14

1
HelloWorldが

21

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

あなたはそこにはない何かをpingし、使用する必要があり-w、それはその時間後に失敗したように、何かにpingない、フラグです(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

すぐに戻るPING: transmit failed. General failure.
huysentruitw 2013年

IP 1.1.1.1はCloudFlareによって取得されるため、これは15秒ではなく数ミリ秒待機します。
dhcgn

16

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

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

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

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


15
これは正確でなければなりませんが、CPUを集中的に使用する方法です。通常は、プロセスが待機中にCPUサイクルを消費しないように、割り込み駆動型の実装が必要です。ほとんどのバッチ状況ではおそらくそうであるように、これは、まれな短い待機では問題になりません。ただし、長時間待機して継続的に実行されるプロセスは、システムパフォーマンスに悪影響を及ぼす可能性があります。
dbenham 2012

4
システムクロックを使用するため、精度は1秒です。2秒が指定されている場合、遅延は2秒から3秒の間(実際には2.99999 ...秒)になります。
Peter Mortensen 2012

時刻が現在7:59:59であり、7秒間待機したい場合はどうなりますか?これは考慮されていないようです。
ashes999 2012

これは、システム時間をカウントするよりも多くのCPU時間を消費します。また、10より小さい分と秒はTIMEコマンドの先頭に0が表示されるため、8進数で算術演算を行っています。
Andreas

2
@mrt:問題は%TIME%、ポイントではなくコンマを使用してセンチ秒を区切ることです。DELIMS=:.,"...にカンマを追加するだけです
Aacini、2015年

13

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

#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;
}

10

Server Faultで同様の質問が行われ、解決策は次のとおりでした。

choice /d y /t 5 > nul

7
参考:Windows XPには選択肢は含まれていません。これはWindows 9xにあり、XPから削除され、Vista以降に追加されました。
デヴィンバーク

7
これはお勧めしません。少なくともCHOICE私が知っているすべてのバージョンでは、誰かが待つ間にボタンを押すと、せっかちな人が時々そうします、そして選択は入力を登録し、悪い入力に対してシステムビープ音を鳴らし、カウントダウンタイマーを停止します、それはハングすることを意味しますそれらがNまたはYをプッシュしない限り、そこにあります。それらがたまたま2つのうちの1つをプッシュした場合、選択は5を待つのではなく、すぐに終了します。また、この選択は非常に奇妙なVista構文を使用しています。代わりに、すべての通常の選択コマンドが代わりに使用CHOICE /T:Y,5 > NULします。/D古いバージョンにはフラグはありません。
スタイルを使用したコーディング'25

1
それを締めくくるために、少なくとも私が知っているCHOICEコマンドには、それが入った言語に基づいて異なるデフォルトのはい/いいえボタンがありますので、明示的に/C:YNまたは単に/C:Y、誰かがたまたまスウェーデンの選択コマンドを持っている場合、これは機能しないでしょう。たとえば、おそらくデフォルトで[J、N]を実行します。だから、これはあらゆる種類のトラブルに巻き込まれています。
スタイルを使用したコーディング

1
@CodingはこれをWin7でテストしました。ユーザーがボタンを押すとビープ音が鳴りますが、ユーザーがボタンを押してからさらに5秒後にタイムアウトします。したがって、ユーザーがキーを押し続けると、タイムアウトすることはありません。また、私の場合、これを使用すると、コンソールが非表示になり、ユーザーがボタンを押すことができなくなります。このシステムでは、Pythonへのアクセスがありませんでした。他の回答で提案されているように、自分のexeをシステムにドロップするアクセスがありませんでした。できることにはかなり制限がありました。それで、あなたは何を勧めますか?
mlsteeves

@mlsteevesすべての異なるWindows、DOSなどには異なる選択コマンドがあり、前述のように、通常、Xpでは使用できません。多くの選択コマンドは微​​妙に異なる動作をしており、一部は異なる構文を持っています。私は、スリープが必要なときに一般的にpingコマンドを使用します。醜いですが、信頼できます。
スタイル付きのコーディング

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");

1
ただし、Windows Scripting Hostはグループポリシーを使用して無効にすることができます。
ジョーイ

8

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

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

たとえば、5秒待つには、

ping -n 6 localhost >nul 2>&1

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

timeout 6 >nul

2
-wミリ秒単位であり、-npingの回数であり、ping間のデフォルトの時間は1秒です。
Joey

8

pingを使用できます。

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

10秒待ちます。

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

の目的は-w1秒待つことではないことに注意してください。ネットワークの問題が発生した場合に、1秒以上待たないようにする必要があります。pingそれ自体が1秒あたり1つのICMPパケットを送信します。おそらくlocalhostには必要ありませんが、古い習慣はなかなか死にません。


重要なリアルタイム処理にこれを使用することは推奨されません。PINGコマンドが使用されているため、このWAITバッチファイルが数ミリ秒以上実行される可能性があります
Wael Dalloul 09

12
@ Wael、1秒の境界で待機する場合は、数ミリ秒は関係ありません。そして、リアルタイムのものにcmd.exeを使用している場合、あなたが得るすべてのものに値する:-)
paxdiablo

-wはタイムアウト値です。これは、応答を待機するミリ秒数です... ping 間の待機時間ではありません
quux 2011

@quux、どこ-wにもタイムアウトがなかったと明言したことはありませんが(私の明快さの欠如のために、一部は推測できるかもしれませんが)、実際には、各サイクルが割り当てられた時間より多くかかるネットワーク問題があるサイクル時間を制限するために使用されます第二。これを明確にするために、最後に段落を追加しました。
paxdiablo 2011

問題は、pingの戻りが速い場合、pingの間に1秒間待機しない可能性があることです。したがって、待機ループは思ったよりも早く終了します
キュー08

7

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


はい、このように書くとすることよりも理解しやすいものを追加する-nパラメータ。
Peter Mortensen

しかし、私はそれを測定しました(100 pingを使用)。-n 3 -w 124を使用すると、実際の時間は正確に(3 + 1)*(124 + 1)= 4 * 125 = 500 msになります。タイミングは驚くほど安定しており、読み出しの10ミリ秒の精度に正確です(時間を伴うCMDプロンプトによる)-基礎となる解像度は10ミリ秒よりも確実に優れています(通常の16ミリ秒のティックの解像度の影響を受けません)。
Peter Mortensen

@mafu 192.0.2.0/24を使用するべきではないということは、それが使用できないことを意味しないので、エコー要求に応答がないことは実際には保証されません。たとえば、任意のWindows PCに静的IPv4アドレス192.0.2.1およびサブネットマスク255.255.255.0を構成し、ネットワークアダプターを他のデバイスに接続します。何も接続されていない単純なスイッチで十分です。次にping 192.0.2.1、このWindows PCで実行すると、Windows TCP / IPスタックがエコー要求に応答することがわかります。192.0.2.0/24を静的IPv4アドレスに使用してはならないことを知っている人は何人いますか?
Mofi

1
ここのコメントでの議論によると、192.0.2.1は完全なものではなく、127.255.255.255がより良い選択であると示唆している人もいます。考え?
JLRishe

上記の投稿で言及されたコメントは削除されました(おそらくNLNとして)。ただし127.255.255.255、デフォルトで既に割り当てられているWindowsのブロードキャストループバックアドレスであることによる変更に同意します(これを確認するにroute printは、 cmdとそれが出力するIPv4ルートテーブルを調べます)。
Hoppeduppeanut

6

システムに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の起動時間がスリープ時間よりも短い限り、このアプローチは機能します(私のマシンでは約600ミリ秒です)。


6
timeout /t <seconds> <options>

たとえば、スクリプトが無停止で2秒間待機するようにするには、次のようにします。

timeout /t 2 /nobreak >NUL

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

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

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


2
どうやらこのコマンドはWindows 7/2008とXPリソースキット(そしておそらく8 / 8.1)でのみ利用可能です。情報筋はまた、このpingアプローチはより少ないプロセッサ時間を使用すると主張しています。
martineau 2014年

5

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

@ping 127.0.0.1 -n 11 -w 1000 > null

これはpaxdiabloの回答とどう違うのですか?
Peter Mortensen

2
違いはありませんが、ここでの回答は複数の質問を統合したものであるため、私が返信したときにすべての回答が存在するわけではありません。
ブレントスチュワート

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>

それは繰り返しpingを実行し、各pingの間に1秒待機してから、呼び出し元のプログラムに戻ります。無限ループは表示されませんが、自分でテストしました。
SuperKael 2013年

私の間違い、無限ループはありません。1で述べたようにしかし、他の回答、それはより良いですpingものではありません一度だけ、そして使用-w Timeoutするのではなく、ミリ秒単位で遅延時間のためのオプションが-n Count全体数の-再試行オプション。
martineau 2013年

-w Timeout良いかもしれませんが、入力した時間よりも1回多くpingすることを確認しました。
SuperKael 2013年

4

リソースキットには、常にこれを含めています。少なくともWindows 2000以降。

また、CygwinパッケージにはsleepPATHに含まれるplopが含まれており、cygwin.dll(またはそれが何と呼ばれていても)含まれていて、行く方法が含まれています!


2
cygwin1.dllは、それ自体の異なるバージョンと平和的に共存しないことに注意してください。マシンにcygwin1.dllが1つだけあると、奇妙なエラーが発生します。
JesperE 2008年

どのリソースキットですか?複数あるようです。回答を更新できますか?
Peter Mortensen

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

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");
            }
        }
    }
}

3

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

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

perl -e "sleep 7"

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

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

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



2

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つの宣言のようにミリ秒単位ではなく、秒単位で引数を取ります。


1
スリープは.netフレームワークで利用できます-スレッドクラスを見てください。例:System.Threadingを使用する; .... Thread.Sleep(1000);
ジョンシブル

2
「ping 127.0.0.1」が失敗した場合は、「スリープ」よりも深刻な問題があります。これはループバックインターフェースであり、RPCはおそらく狂っています。
Piskvorが建物を去った'04

2

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

timeout numbersofseconds /nobreak > nul

XP Proでは動作しません...'timeout' is not recognized as an internal or external command, operable program or batch file.
martineau

1

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

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

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

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

技術的には、choiceコマンドにyのみを受け入れるように指示しています。デフォルトはyで、5秒でそれを実行し、プロンプトを表示せず、NULに対して発言することをすべてダンプします(Linuxのnullターミナルなど)。


3
私はここに自分自身をエコーし​​ます。これはまったくお勧めしません。CHOICE私が知っているバージョンでは、誰かが待機中にキーを押すと、せっかちな人が時々そうしますが、選択は入力を読み取り、悪い入力に対してシステムのビープ音を鳴らし、カウントダウンを停止するので、Yを押さないとハングします。そして、彼らがたまたまYを押した場合、選択は5を待つのではなく、そこですぐに終わります。また、この選択は、非常に奇妙なVista構文を使用しています。その代わりに、通常の選択コマンドが代わりに使用CHOICE /T:Y,5 > NULします。(古いバージョンには/ Dフラグはありません。)そして、Vistaをお持ちの場合は、TIMEOUT代わりに使用してください。
スタイルを使用したコーディング

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 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

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

ここにスリープの代替案の概要があります(pingアプローチはすべてのWindowsマシンで機能するため、最も一般的です)が、(少なくとも)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

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);
}

1

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

私の好きなもの:

TIMEOUT /NOBREAK 5 >NUL 2>NUL

これにより、何も出力されずにコンソールが5秒間停止します。

最も使用:

ping localhost -n 5 >NUL 2>NUL

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

最後の変種:

ping 1.1.1.1 -n 5 >nul

このスクリプトには、前回のスクリプトと比較していくつかの違いがあります。これはを呼び出そうとしませんlocalhost。代わりに、1.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)を好みます。


0

タイトルバーに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

これは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

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

デプロイメントの2つのオプション:

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

CoreUtilsをデプロイする利点の1つは、スクリプト作成に役立つ他のプログラムのホストを追加で入手できることです(Windowsバッチでは多くのことが望まれます)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.