如何在 Windows 批处理文件中的某个命令和下一个命令之间暂停执行一段时间?
答案1
在批处理文件中休眠的正确方法是使用timeout
命令,在 Windows 2000 中引入。
等待大约 29 到 30 秒:
timeout /t 30
如果用户按下任意键,超时就会中断;但是,该命令还接受可选的开关/nobreak
,它可以有效地忽略用户可能按下的任何内容,除了明确的CTRL-C
:
timeout /t 30 /nobreak
此外,如果您不想让命令在屏幕上打印其倒计时,您可以将其输出重定向到NUL
:
timeout /t 30 /nobreak > NUL
答案2
因为这也适用于这里,所以我将复制我在另一个网站上的回答。
如果您想使用 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
您可以使用 powershell 在 Batch 中休眠:
毫秒
powershell -nop -c "& {sleep -m Milliseconds}"
秒
powershell -nop -c "& {sleep seconds}"
答案4
免责声明:这不是“理想”的解决方案,所以不要像对待那些推荐者那样来敲我的头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%
最后,像 一样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%