it-swarm.cn

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

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

141
Massimo

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

等待 介于29到30秒之间

timeout /t 30

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

timeout /t 30 /nobreak

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

timeout /t 30 /nobreak > NUL
209
Massimo

由于它也适用于此,因此我将复制 我从其他站点获得的答案

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

16
mafu

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

命令:
ping 127.0.0.1

8
acolyte

免责声明:这不是“理想”的解决方案,所以不要像推荐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%
3
BuvinJ