如何在批处理文件中睡眠?


132

如何在命令和下一个命令之间的Windows批处理文件中暂停执行一段时间?


是否打算成为规范?如果是这样,那么一些解释性文字可能是适当的。
John Gardeniers 2012年

2
“解释性文字”为何?
Massimo 2012年

2
我见过的大多数(即使不是全部)规范问题都包括描述该问题意图的文字。
John Gardeniers 2012年

或一些解释情况的文字……主要是为了帮助SEO,但也有助于制定潜在的答案。
克里斯S

2
SEO工作正常。在Google搜索上对我来说是第一击。
jbo5112

Answers:


194

在批处理文件中进行睡眠的正确方法是使用timeoutWindows 2000中引入的命令。

等待29到30秒之间的某个时间

timeout /t 30

如果用户按下任何键,超时将被中断;但是,该命令还接受可选的switch /nobreak,它有效地忽略了用户可能按下的任何命令,但显式的除外CTRL-C

timeout /t 30 /nobreak

另外,如果您不希望该命令在屏幕上显示其倒数,则可以将其输出重定向到NUL

timeout /t 30 /nobreak > NUL

6
即使安装了2003 Resource Kit,该timeout命令也不适用于Windows XP,并且Windows 7中的sleep命令也不起作用,因此,如果您同时在Win7和WinXP上使用批处理文件,则ping命令仍然可以很好地使用。

12
超时在非交互式脚本中不起作用:“错误:不支持输入重定向,立即退出进程。” 因此,有时最好将hack与“ ping”一起使用。
iMysak

14

由于它也适用于此,因此我将从另一个站点复制我的答案

如果要使用ping,则有更好的方法。您需要对不存在的地址执行ping操作,因此可以指定毫秒精度的超时时间。幸运的是,这样的地址是在标准(RFC 3330)中定义的,并且是192.0.2.x。这不是伪造的,它实际上是一个不存在的唯一目的的地址(可能不清楚,但即使在本地网络中也适用):

192.0.2.0/24-此块分配为“ TEST-NET”,用于文档和示例代码。它通常与供应商和协议文档中的域名example.com或example.net结合使用。此块中的地址不应出现在公共Internet上。

要睡眠123毫秒,请使用 ping 192.0.2.1 -n 1 -w 123 >nul


3
请不要那样做,即使是稍微比ping一台真正的地址更好。Ping仅仅是工作的错误工具。
Massimo 2014年

1
@Massimo这很可能不是它打算做的事情:)但是我认为它仍然是一个很好的解决方案-在某些情况下(特别是高分辨率),它的工作效果比超时更好。而且,它已经广为人知,因此,大多数人在批处理文件中看到它时不会感到惊讶(即困惑)。
mafu 2014年

2
@Massimo好吧!我想我们只是有不同的看法。如果您不介意的话,我仍然会保留此答案,因为它似乎比平时描述的ping N次本地主机更好。
mafu 2014年

7
超时是适用于其工作的操作系统的正确解决方案。ping是从5.1-6.3开始工作的唯一解决方案。在25%的系统仍处于5.1的情况下,超时不是“正确的方法”。
Wyrmwood 2014年

3
超时对于任何操作系统来说都是错误的解决方案,因为即使在Windows 10中,它也可能致命。
哈里·约翰斯顿

8

您还可以将ping插入localhost。这将需要4秒钟完成(默认情况下)。某些人认为它是垃圾,但效果却很好。

命令:
ping 127.0.0.1


6
埃姆...这个Q / A的整个目的是准确地纠正它具有这是他们接受的回答另外两个问题,但无法再进行修正,因为他们的OP不再身边。
Massimo 2012年

6
虽然可以正常工作,但这相当于用锤子打螺丝。错误的工具可能有效,但仍然错误。
voretaq7 2012年

1
@MarkAllen换句话说,Windows NT4、95、98,ME和更早版本?
克里斯·麦肯

5
@MarkAllen-从技术上讲,您必须担心ping您的操作系统是否随附。如果你担心有足够的了解'95 '98或ME,那么你应该为同样担心的6.22哪些没有被ping任何
马克·亨德森

4
@MarkHenderson(对我来说)记住特定版本的OS是否支持TCP / IP比记住它是否包含我以前从未听过的命令要容易得多。你懂?
Mark Allen

2

免责声明:这不是“理想”的解决方案,所以不要像推荐那些人那样打扰我ping

如果可能,请timeout确保使用。但是,正如评论中指出的那样,这并不总是一种选择(例如,在非交互模式下)。在那之后,我同意ping“纠缠”也许是次之,因为它非常简单。也就是说,我提供了另一个选择...嵌入一些VB脚本

该解决方案的基础除此以外还有各种应用。VBS通常可以执行批处理无法完成的事情,或者至少可以更轻松地完成批处理。使用此处说明的技术,您可以将两者混合(不是“无缝”,而是“功能上” ...)。

这是一个班轮,创建临时脚本,执行它,然后将其删除。该脚本为您执行睡眠操作(在此示例中为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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.