如何在批处理脚本中等待?

190

我正在尝试编写一个批处理脚本,并且想要在两个函数调用之间等待10秒。命令如下:

sleep 10
不会让批处理文件等待10秒钟。
我正在运行Windows XP。
注意:这不是Sleeping in a batch file的完全重复,因为另一个问题还涉及Python,而这个问题是关于Windows批处理文件的。

相关帖子 - Windows批处理:睡眠 - RBT
另请参见超时 - djvg
6个回答

288

您可以ping一个不存在的地址并指定所需的超时时间:

ping 192.0.2.2 -n 1 -w 10000 > nul

由于地址不存在,它会等待10000毫秒(10秒)并返回。

  • -w 10000 部分指定所需的超时时间(以毫秒为单位)。
  • -n 1 部分告诉 ping 仅尝试一次(通常它会尝试4次)。
  • > nul 部分被添加以使 ping 命令不向屏幕输出任何内容。

您可以通过在PATH中创建一个 sleep.bat 文件并使用上述技术轻松制作自己的 sleep 命令:

rem SLEEP.BAT - sleeps by the supplied number of seconds

@ping 192.0.2.2 -n 1 -w %1000 > nul

注意(2020年9月):根据RFC 3330,192.0.2.x地址是保留地址,因此在现实世界中绝对不存在。从规范中引用:

192.0.2.0/24 - 这个地址块被指定为“TEST-NET”,用于文档和示例代码。它通常与域名example.com或example.net一起在供应商和协议文档中使用。此地址块内的地址不应出现在公共互联网上。


80
黑客 -2 天才 +3 - ojblass
2
ping 127.0.0.1 -n 5 -w 1000 > nul 必须这样做,因为另一种方法会立即完成。 - Thomaschaaf
16
我添加了实际函数,它叫做timeout。http://www.ss64.com/nt/timeout.html 至少我知道其他人也不知道 :) - Thomaschaaf
3
无法正常工作,ping 命令的响应为:PING: transmit failed. General failure. 可能是因为我处于 10.x.x.x 的网段内。 - huysentruitw
2
我一直很愉快地使用 ping 0.0.0.0 -n 1 -w 10000 > nul,直到Windows 10,在没有任何等待的情况下立即返回此特定IP地址。@ping 1.0.0.0 -n 1 -w 3000 > nul 可以工作。 - Vlastimil Ovčáčík
显示剩余4条评论

151

你最好ping一下127.0.0.1。Windows ping命令在每次ping之间会暂停一秒,所以如果你想等待10秒钟,请使用:

ping -n 11 127.0.0.1 > nul

这种方式可以避免意外的早期返回(例如,没有默认路由并且123.45.67.89立即被认为无法访问)。


27
我更喜欢这个解决方案,而不是标记为答案的那个,因为这个更为简洁,我们不需要确保我们的脚本具有不存在的 IP 地址。因此,我们可以编写一次脚本,然后在任何 Windows 系统上的任何网络中使用它,而无需再次编辑脚本。 - Susam Pal
4
自从RFC 3330被废弃后,我采用了这个解决方案。 - Reyno
4
或者使用本地主机名以避免在仅支持IPv6的计算机上出现问题。 - Oliver Bock

139

2
另一种选择是chakrits http://www.ss64.com/nt/sleep.html - Thomaschaaf
8
不是Windows XP命令... - Rômulo Ceccon
4
随着Windows XP的退出,似乎这才是未来的正确之路。 - djangofan
8
这可能不是2009年XP系统的正确答案,但适用于Windows 7及以上版本! - Kristopher
5
2016年,这应该成为正确的答案。 - TTT
2
如https://dev59.com/PHI-5IYBdhLWcg3wy7wd#1672375所述,“timeout 5”实际上会在4到5秒之间睡眠。因此,“timeout 1”可能在半秒钟内完成,也可能是10毫秒等。Timeout只会睡眠直到下一个完整的秒数到来。 - Rauni Lillemets

49

我使用了这个

:top
cls
type G:\empty.txt
type I:\empty.txt
timeout /T 500
goto top

1
超时是一个不错的解决方案。实际上,它比休眠更好,因为它告诉你剩余时间! - Manish
8
timeout 命令在 Windows XP 上不可用,但在 Windows 2003 和 Windows 7 上可以正常工作。 - Susam Pal
3
秒?毫秒?分钟?它使用的是哪种单位? - Itay Levin
1
@ItayLevin:单位是秒。 - A.L

7

怎么样:

@echo off
set wait=%1
echo waiting %wait% s
echo wscript.sleep %wait%000 > wait.vbs
wscript.exe wait.vbs
del wait.vbs

2
这似乎是唯一一个即使对于 <1000ms 的延迟也非常准确的解决方案。 - Lynn

6

在您的Windows XP机器上,sleep命令是否存在?根据这篇文章:http://malektips.com/xp_dos_0002.htmlsleep在Windows XP上不可用,您需要下载Windows 2003资源工具包才能获取它。

另外,Chakrit的答案也给出了另一种暂停的方法。

尝试从命令提示符中运行sleep 10


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接