如何在批处理/cmd中让程序休眠五秒钟

872

Windows的截图工具可以捕捉屏幕,但有时候我想在五秒后捕捉屏幕,比如拍摄通过网络摄像头显示的图像(例如运行脚本并对着摄像头微笑)。

我如何在批处理文件中等待五秒钟?


27
针对来到这里的人的快速回答:自Windows Vista起,有一种本地解决方案:TIMEOUT。参考文献:SS64Rob van der Woude - Gras Double
3
有一个名为“timeout”的命令,可以等待若干秒。如果需要毫秒级别的睡眠,可以使用PowerShell的“Start-Sleep”命令。在CMD中休眠50毫秒的方法是:powershell Start-Sleep -m 50 - Pavel P
@Pavel:你也可以滥用ping命令来让程序休眠数毫秒。 - Joey
12
尝试这个:timeout /t 5 /nobreak >nul。它会等待5秒钟,然后静默结束,不会有任何输出。 - user9556248
如果你安装了Node.js,可以使用node -e 'setTimeout(a => a, 5000)'来玩一下。它适用于Mac上的Node v12.14.0,可能在Windows上也适用。 - nonopolarity
显示剩余2条评论
30个回答

1795
我非常惊讶没有人提到:
C:\> timeout 5

请注意(感谢Dan!),timeout 5的意思是:

休眠时间在4到5秒之间

可以通过将以下内容放入批处理文件中,重复运行并计算第一个和第二个echo之间的时间差来进行实证验证:

@echo off
echo %time%
timeout 5 > NUL
echo %time%

请注意,根据评论所述: 在非交互式脚本中,timeout命令无效:"ERROR: Input redirection is not supported, exiting the process immediately." Daniel

37
“timeout”不被识别为内部或外部命令,可执行程序或批处理文件。(在我的Windows XP SP3上) - noctonura
102
它能在Win 7上运行,但不能在Win XP上运行。 - nonopolarity
9
我很确信我曾在Server 2003上使用过它(与XP相同的代码库),所以很奇怪它为什么不在XP上... - asveikau
54
超时功能实现不佳。如果执行“timeout 1”命令,它会等待到“下一秒”,这可能发生在0.1秒内。尝试多次执行“timeout 1”,观察延迟差异。对于5秒或更长的时间,这可能不是什么大问题,但对于1秒的延迟来说效果很差。 - Dan
92
“timeout”在非交互式脚本中无法工作:“错误:不支持输入重定向,立即退出进程。” - Daniel
显示剩余20条评论

998

一个技巧是(滥用)ping命令:

ping 127.0.0.1 -n 6 > nul

说明:

  • ping 是一个发送 ping 请求的系统实用程序。在所有版本的 Windows 上都可以使用 ping
  • 127.0.0.1localhost 的 IP 地址。此 IP 地址保证始终能够解析、可达并立即响应 ping。
  • -n 6 指定要发送 6 个 ping。每个 ping 之间有 1 秒的延迟,因此要进行 5 秒的延迟,需要发送 6 个 ping。
  • > nulping 的输出 redirectingnul,从而抑制其输出。

8
这对我来说不起作用(可能是网络问题)?当我尝试上述命令(没有管道到 nul)时,立即从网关服务器收到“目标主机不可达”的消息,并且 ping 命令立即退出。 - Ian Renton
133
在我的经验中,使用“ping 127.0.0.1 -n 10 > nul”更加简洁可靠——每个ping等待1秒,所以将次数更改为您想要延迟的秒数即可。 - Cybergibbons
42
一个更正 - 1.1.1.1是一个完全有效的公共IP地址。从理论上讲,它可以被访问到。现在它已经离线了,因为我怀疑它们的所有者放弃了除了来自世界各地的ping之外的所有用途 :) 关于这个IP的更多细节,请参见http://serverfault.com/a/339782。建议使用127.0.0.1,如Cybergibbons所建议的,或者使用您网络中不存在的_私有_地址(例如10.1.1.1等),这样更安全。 - Alex
40
注意防止“栅栏柱错误”(fence-post error)。这里每个ping之间有1秒的延迟,因此要进行11次ping才能得到10秒的延迟。即执行命令“ping 127.0.0.1 -n 11 > nul”。 - gb96
8
我建议使用127.0.0.1(本地主机),如果我的互联网出现问题,它就不会工作 :/ - barwnikk
显示剩余12条评论

92
以下的代码可以让你休眠5秒钟。
ping -n 6 127.0.0.1 > nul

因为ping命令在每次发送请求后会等待一秒钟,所以你需要指定比你实际需要的次数多一次。


37
应该使用“-n 6”,否则您需要等待4秒。请记住,“ping”在发送每个请求之间等待1秒,因此您始终需要指定比所需尝试次数多一个。 - Joey
5
与假定的不存在的 IP 进行ping相比,这是一个更好的解决方案。而且在网络断开时,ping 该 IP 会失败。几乎总是可以ping通本地主机。 - rustyx
如果您正在使用PowerShell,则应为“> null”。 - Brent

81

尝试使用Choice命令。它从MSDOS 6.0开始存在,应该可以解决问题。

使用/T参数指定超时时间(以秒为单位),使用/D参数指定默认选择并忽略所选的选择。

可能会出现的一个问题是,如果用户在超时时间到期之前键入了其中一个选择字符,则可能会出现问题。部分解决方法是混淆情况--使用/N参数隐藏有效选择列表,并且只有1个字符在选择集中,这样用户在超时到期之前键入有效选择的可能性就较小。

以下是Windows Vista上的帮助文本。我认为XP上的帮助文本是相同的,但请查看XP计算机上的帮助文本以进行验证。

C:\>CHOICE /?

CHOICE [/C choices] [/N] [/CS] [/T timeout /D choice] [/M text]

Description:
    This tool allows users to select one item from a list
    of choices and returns the index of the selected choice.

Parameter List:
   /C    choices       Specifies the list of choices to be created.
                       Default list is "YN".

   /N                  Hides the list of choices in the prompt.
                       The message before the prompt is displayed
                       and the choices are still enabled.

   /CS                 Enables case-sensitive choices to be selected.
                       By default, the utility is case-insensitive.

   /T    timeout       The number of seconds to pause before a default
                       choice is made. Acceptable values are from 0 to
                       9999. If 0 is specified, there will be no pause
                       and the default choice is selected.

   /D    choice        Specifies the default choice after nnnn seconds.
                       Character must be in the set of choices specified
                       by /C option and must also specify nnnn with /T.

   /M    text          Specifies the message to be displayed before
                       the prompt. If not specified, the utility
                       displays only a prompt.

   /?                  Displays this help message.

   NOTE:
   The ERRORLEVEL environment variable is set to the index of the
   key that was selected from the set of choices. The first choice
   listed returns a value of 1, the second a value of 2, and so on.
   If the user presses a key that is not a valid choice, the tool
   sounds a warning beep. If tool detects an error condition,
   it returns an ERRORLEVEL value of 255. If the user presses
   CTRL+BREAK or CTRL+C, the tool returns an ERRORLEVEL value
   of 0. When you use ERRORLEVEL parameters in a batch program, list
   them in decreasing order.

Examples:
   CHOICE /?
   CHOICE /C YNC /M "Press Y for Yes, N for No or C for Cancel."
   CHOICE /T 10 /C ync /CS /D y
   CHOICE /C ab /M "Select a for option 1 and b for option 2."
   CHOICE /C ab /N /M "Select a for option 1 and b for option 2."

12
它在XP上也不行。 - nonopolarity
15
很有意思。这个网站http://www.computerhope.com/choicehl.htm上说,CHOICE命令可用于Windows 95、Windows 98、Windows Vista和Windows 7,但不适用于Windows XP。我猜微软收到了很多关于在XP中取消CHOICE命令的投诉,所以他们在Vista中将其重新引入了。 - Adam Porad
我正在Vista上使用CHOICE。工作正常。 - Hot Licks
2
哦,老兄……那些制作批处理故事游戏的好时光。 - Anoyz
该命令非常好,但不幸的是在Windows XP中不是本地命令。但是您可以从Windows 98系统目录中简单地复制choice.com,它在Windows XP中可以正常工作。 - Radon8472

59

如果您的系统中安装了PowerShell,您可以执行以下命令:

如果您的系统中安装了PowerShell,您可以执行以下命令:
powershell -command "Start-Sleep -s 5"

编辑:有人提出了一个问题,即PowerShell启动所需的时间与您尝试等待的时间相比显著。如果等待时间的准确性很重要(即一两秒钟的额外延迟是不可接受的),则可以使用此方法:


powershell -command "$sleepUntil = [DateTime]::Parse('%date% %time%').AddSeconds(5); $sleepDuration = $sleepUntil.Subtract((get-date)).TotalMilliseconds; start-sleep -m $sleepDuration"

这会获取Windows命令发出的时间,然后PowerShell脚本会休眠,直到超过该时间5秒。只要PowerShell启动所需的时间少于您设置的休眠时间,此方法就可以起作用(在我的机器上大约为600毫秒)。


28
启动PowerShell需要几秒钟。 - Synetech
4
我最终自己使用了这个。在我的电脑上,运行普通的5秒睡眠大约需要5.5秒至5.6秒才能完成。使用我发布的第二个脚本可将不准确性降至约20-30毫秒左右。如果你需要比这更高的精度,我怀疑你也无法从ping方法中得到它。 - Niall Connaughton
2
@NiallConnaughton 你能试试加上-NoProfile参数,看看速度会受到多大影响吗?这样可以避免加载用户的配置文件,从而防止磁盘搜索和文件访问,以及任何添加到用户配置文件中的“插件/模块/等等”。 - dragon788
1
显然,如果您不传递-NoProfile参数,PowerShell将尝试加载6个潜在的配置文件。https://blogs.technet.microsoft.com/heyscriptingguy/2012/05/21/understanding-the-six-powershell-profiles/ - dragon788
1
在我的当前系统上,启动PowerShell需要150毫秒的时间成本,而-noprofile并没有改善这一点。然而,这台机器没有加入漫游配置文件等企业域。你的情况可能会有所不同。好建议。 - Niall Connaughton
显示剩余3条评论

49

你可以使用 timeout 命令来实现:

这个会显示: timeout 5

这个不会显示: timeout 5 >nul


在Windows 7中有“timeout”命令,但在Windows XP中没有。 - rashok
2
请注意,即使不可见,如果用户按键,它仍将被取消。添加/NOBREAK选项以防止这种情况发生。 - Matthew

40

我们不能使用waitfor /T 180吗?

waitfor /T 180 pause会导致"ERROR: Timed out waiting for 'pause'."

waitfor /T 180 pause >nul将会掩盖这个"错误"

waitfor命令应该在Win95之后的Windows操作系统中都存在。

过去,我下载了一个名为sleep的可执行文件,可以在将其放入路径后在命令行上运行它。

例如:sleep shutdown -r -f /m \\yourmachine虽然现在的shutdown已经内置了-t选项。


1
我的XP Pro SP3机器上没有出现过这个问题,但在Win7 Ultimate机器上出现了。 - Josh Heitzman
waitfor 是用于等待信号的。不确定如何使用它,但似乎并不适合此情况。 - jfritz42
这不是我在这里寻找的,但还是谢谢你提供这个 - 它以后会很有用。 - Kevin Shea
2
"waitfor /T 10 pause" 运行得非常好。 - Jürgen Steinblock
@SchlaWiener,这对我有效,我直接将其添加到答案中。 - Chris Marisic
15
你可以使用2>来吞噬错误,例如:waitfor /T 5 pause 2>NUL - Archimedes Trajano

36

Timeout /t 1 >nul

这相当于暂停1秒,你可以将时间延长到近100,000(99,999)秒。如果你连接到互联网,最好的解决方案是:

ping 1.1.1.1 -n 1 -w 1000 >nul

当你ping时,计算的是毫秒,所以一秒就是1000毫秒。但是ping命令有点棘手,在离线机器上不起作用。问题在于机器因为离线而感到困惑,它想要ping一个网站/服务器/主机/IP,但是它做不到。所以我建议使用timeout。祝你好运!

11
Ping 1.1.1.1并不是一个好的,也不是最好的解决方案。这会导致网络流量增加。建议改为ping本地主机。 - harper
1
对于无法到达的IP地址进行ping的目的是使命令等待响应并在指定时间后超时。在大多数系统上,“localhost”可能会回复而不是超时。 - Ivan
2
@user3070485 但是1.1.1.1并不是无法访问。为什么不使用类似于192.0.2.1这样的地址,这个地址保证是无法访问的呢? - Lena
1.1.1.1曾经被认为是无法到达的地址,Tijmen也多次将其作为“无法到达”的极端例子。 - bzlm
3
当Cloudflare开始在1.1.1.1上响应ping时,我不敢想象所有突然中断的脚本。 - mwfearnley

35

SLEEP 5 被包含在一些 Windows 资源工具包中。

TIMEOUT 5 被包含在一些 Windows 资源工具包中,但现在已成为 Windows 7 和 8 的标准命令(不确定 Vista 是否包含)。

PING 1.1.1.1 -n 1 -w 5000 >NUL 对于任何带有 TCP/IP 客户端的 MS-DOS 或 Windows 版本,都可以使用 PING 命令来延迟执行若干秒。

NETSH badcommand(仅适用于 Windows XP/Server 2003)或 CHOICE

这个链接可以帮助你更多


3
抱歉,但我必须对假设1.1.1.1无法访问的答案进行负投票。 - mwfearnley

28
有的!
SLEEP <seconds>

如果您想使用毫秒模式:

SLEEP -m <time in milliseconds>

这比TIMEOUT更有用,因为TIMEOUT可以通过按键或CTRL + C(对于TIMEOUT /t <secs> /nobreak)来中止。 SLEEP无法被任何东西中止(除了关闭按钮:p)

另一个是PING。但是PING需要互联网连接,因为您将记录站点的连接。


3
Windows操作系统中确实存在"sleep"命令,但它的可用性取决于你使用的Windows版本。该命令在Windows 7专业版/企业版、Windows 10专业版/企业版以及所有的Windows Server 2008+版本中都可以使用。我已经点赞表示认同该解决方案是有效的。 - Timothy Wood
4
@TimothyWood 我正在运行 Server 2012 R2,但 SLEEP 功能不可用。请提供准确的信息,说明该功能适用于哪些版本的 Windows。 - bobroxsox
5
有些版本没有可用的SLEEP命令,但是可以使用TIMEOUT命令。TIMEOUT /T <秒数> /NOBREAK。 - bobroxsox
2
@bobroxsox 睡眠是一种本地命令。它取决于您在服务器配置中包含了哪些功能和角色。要特别访问睡眠命令,请安装2003 Windows资源工具包。这可以通过在服务器管理器中启用其中一个需要它的功能来自动安装。它也是Visual Studio附带的先决条件。答案是准确的。没有睡眠命令并不意味着不知道可以使用哪些命令,因此这是一个完全不同的问题。 - Timothy Wood
5
Windows 10拥有“TIMEOUT”功能(顺便提一下,可以通过按键缩短等待时间),但没有“SLEEP”功能。 - Frank N
Win11 上也不能睡眠 - mxmissile

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