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

评论

是否打算成为规范?如果是这样,那么一些说明性文字可能是适当的。

“解释性文字”如?

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

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

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

#1 楼

在批处理文件中进行睡眠的正确方法是使用Windows 2000中引入的timeout命令。要等待29到30秒之间的某个时间:

timeout /t 30


如果用户按下任意键,超时将被中断;但是,该命令还接受可选开关/nobreak,该开关实际上会忽略用户可能按的任何按钮,但显式CTRL-C除外:

timeout /t 30 /nobreak

命令在屏幕上显示其倒计时,您可以将其输出重定向到NUL

timeout /t 30 /nobreak > NUL


评论


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

–user178627
13年6月20日在22:55

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

– iMysak
15-10-26在11:08

作为记录,如果关闭标准输入,则此命令将立即退出!

– andras.tim
20年1月23日,下午2:22

#2 楼

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

如果您想使用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

评论


请不要这样做,即使比对真实地址执行ping操作要好一些。 Ping只是完成这项工作的错误工具。

–马西莫
2014年7月17日在12:39



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

–马夫
2014年7月18日在8:15

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

–马夫
2014年7月18日在11:25

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

–苦艾酒
2014年7月23日在1:42

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

–哈里·约翰斯顿(Harry Johnston)
19年4月28日在0:22

#3 楼

您也可以将ping插入本地主机。这将需要4秒钟完成(默认情况下)。某些人认为它很笨拙,但效果都很好。
命令:
ping 127.0.0.1


评论


嗯...这个问题的全部目的就是纠正其他两个以该问题为已被接受答案的问题,但由于其操作不再存在而无法纠正。

–马西莫
2012年9月26日20:13在

虽然可以正常工作,但这相当于用锤子打螺丝。错误的工具可能会起作用,但仍然错误。

–voretaq7
2012年9月26日20:16在

@MarkAllen换句话说,Windows NT4、95、98,ME和更早版本?

–克里斯·麦克肯(Chris McKeown)
2012-09-26 23:44

@MarkAllen-从技术上讲,您必须担心操作系统是否附带ping。如果您对'95 '98或ME感到足够担心,那么您也应该同样担心6.22或ping都没有

–马克·亨德森(Mark Henderson)
2012年9月27日20:36

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

–马克·艾伦(Mark Allen)
2012年9月28日在0:01

#4 楼

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

尽可能使用timeout。但是,正如评论中指出的那样,这并不总是一种选择(例如,在非交互模式下)。之后,我同意ping“ kludge”可能是次之,因为它非常简单。就是说,我提供了另一个选择...嵌入一些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%


最后,像ping一样,CScript本身也具有超时选项!因此,如果您在脚本中输入无限循环,则可以让解释器强制执行持续时间。请注意,这是一个“忙碌”的操作,会占用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中执行此操作,而无需编写文件。

–哈里·约翰斯顿(Harry Johnston)
19年4月28日在0:20

是的,这可能是另一个不错的解决方案,尽管我认为该解决方案与旧版本的Windows更向后兼容。

– BuvinJ
19年4月28日在1:03

#5 楼

您可以使用powershell批量睡眠:
毫秒
powershell -nop -c "& {sleep -m Milliseconds}"


powershell -nop -c "& {sleep seconds}"


评论


奇迹般有效。

–罗纳·阿莫德(Rune Aamodt)
20 Dec 14 '20:38