バッチファイルでスリープする方法


132

コマンドと次のコマンドの間のWindowsバッチファイルで実行を一時停止する方法


これは標準になることを意図していますか?もしそうなら、いくつかの説明テキストが適切かもしれません。
ジョンガーデニアーズ

2
「説明文」のように?
マッシモ

2
すべてではないにしても、ほとんどの正規の質問には、その質問の意図を説明するテキストが含まれています。
ジョンガーデニアーズ

または状況を説明するテキスト...これは主にSEOを支援するためですが、潜在的な回答を組み立てるのにも役立ちます。
クリスS

2
SEOは正常に動作しています。Google検索で最初にヒットしました。
jbo5112

回答:


194

バッチファイルでスリープする正しい方法はtimeout、Windows 2000で導入されたコマンドを使用することです。

29〜30秒の間に待機するには:

timeout /t 30

ユーザーがいずれかのキーを押すと、タイムアウトが中断されます。ただし、このコマンドはオプションのswitchも受け入れます/nobreak。これは、明示的な場合を除き、ユーザーが押す可能性のあるものをすべて無視しますCTRL-C

timeout /t 30 /nobreak

さらに、コマンドのカウントダウンを画面に表示したくない場合は、出力をNUL次の場所にリダイレクトできます。

timeout /t 30 /nobreak > NUL

6
2003リソースキットがインストールされていてもWindows XPではtimeoutコマンドは機能せず、Windows 7ではsleepコマンドが機能しないため、Win7とWinXPの両方でバッチファイルを使用している場合、pingコマンドは引き続き有効です。

12
タイムアウトは、非対話型スクリプトでは機能しません。「エラー:入力リダイレクトはサポートされていません。プロセスをすぐに終了します。」そのため、時々「ping」でハックを使用することが推奨されます。
iMysak

14

ここでも適用されるため、別のサイトから回答をコピーします。

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


3
実際のアドレスにpingを送るよりもわずかに優れている場合でも、そうしないでください。Ping単に仕事にとって間違ったツールです。
マッシモ14

1
@Massimoそれはおそらくそれが意図したものではないでしょう:)しかし、私はそれはまだ良い解決策だと思います-それはいくつかのシナリオ(特により高い解像度)でタイムアウトよりもうまく機能します。また、それは非常によく知られるようになったので、ほとんどの人はバッチファイルでそれを見て驚くことはありません。
マフ14

2
@Massimo Alright!私たちは異なる見解を持っているだけだと思います。気にしない場合は、ほとんどの場合説明されているようにlocalhostにpingをn回実行するよりも良いと思われるので、この回答はそのままにします。
マフ14

7
タイムアウトは、動作するオペレーティングシステムに適したソリューションです。pingは、5.1〜6.3で機能する唯一のソリューションです。システムの25%がまだ5.1であるため、タイムアウトは「正しい方法」ではありません。
ワイムウッド14

3
タイムアウトは、Windows 10でも致命的に壊れているため、どのオペレーティングシステムでも間違ったソリューションです。入力がリダイレクトされただけで失敗するコマンドはどのような用途ですか?
ハリージョンストン

8

localhostにpingを挿入することもできます。これは完了するまでに4秒かかります(デフォルト)。それは一部の人にとっては汚点と考えられていますが、まったく同じようにうまく機能します。

コマンド:
ping 127.0.0.1


6
EHM ...このQ / Aの全体の目的でした正確に自分の受け入れ答えとしてこれを持っている他の二つの質問を修正するために、彼らのOPは約もはやないので、もはや修正することはできません。
マッシモ

6
動作しますが、ハンマーでネジを打つのと同じです。間違ったツールが機能する場合もありますが、それでもまだ間違っています。
voretaq7

1
@MarkAllenつまり、Windows NT4、95、98、ME、およびそれ以前のバージョンですか?
クリスマッキーン

5
@MarkAllen-技術的にpingは、OSが付属しているかどうかを心配する必要があります。'95 '98またはMEについて十分に心配している場合は、6.22についても同様に心配する必要があります。pingどちらもありません
マークヘンダーソン

4
@MarkHenderson OSの特定のリリースがTCP / IPをサポートしているかどうかを覚える方が、これまで聞いたことのないコマンドが含まれているかどうかを覚えるよりも(私にとって)簡単です。ええと?
マークアレン

2

免責事項:これは「理想的な」解決策ではありませんので、推奨する人たちに行われているようなことで頭を痛めつけないでくださいping...

可能であれば、timeout必ず使用してください。しかし、コメントで述べたように、それは常にオプションではありません(たとえば、非インタラクティブモード)。その後、ping非常に単純なので、「クラッジ」はおそらく次善の選択肢であることに同意します。とはいえ、別のオプションを提供しています... VB Scriptを埋め込みます。

このソリューションの基礎には、これ以外にもあらゆる種類のアプリケーションがあります。多くの場合、VBSはバッチでは不可能なことを実行できますが、少なくとも非常に簡単に実行できます。ここに示した手法を使用して、2つを混在させることができます(「シームレス」ではなく「機能的に」...)。

一時スクリプトを作成し、実行してから削除する1つのライナーを次に示します。スクリプトは自動的にスリープを実行します(この例では3秒間)。

echo WScript.Sleep 3000 > %temp%\sleep.vbs & cscript %temp%\sleep.vbs %sleepMs% //B & del %temp%\sleep.vbs

これは基本的に同じもので、少し異なって記述されています。

set sleepMs=3000 & set sleepVbs=%temp%\sleep.vbs & echo WScript.Sleep WScript.Arguments(0) > %sleepVbs% & cscript %sleepVbs% %sleepMs% //B & del %sleepVbs%

そして最後に、のようにpingCScriptそれ自体にタイムアウトオプションがあります!そのため、スクリプトに無限ループを入力した場合、インタープリターに継続時間を強制させることができます。これは「ビジー」操作であり、CPUを消費するため、WScript.Sleep手順を使用できる場合はお勧めしませんが、完全を期すために概念的なオプションとして提示します。

set sleepSec=3 & set sleepVbs=%temp%\sleep.vbs & echo While True > %sleepVbs% & echo Wend >> %sleepVbs% & cscript %sleepVbs% //B //T:%sleepSec% & del %sleepVbs%

ご存知のように、ファイルを書き込むことなく、PowerShellでこれを行うことができます。
ハリージョンストン

ええ、それは別の良い解決策である可能性が高いですが、これは古いバージョンのWindowsとの下位互換性があると私は考えています。
BuvinJ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.