Windows批处理:睡眠

134
我该如何让Windows批处理脚本等待数秒钟?
使用“sleep”和“wait”命令似乎无效(出现“未识别的命令”提示)。
12个回答

183

你可以尝试

ping -n XXX 127.0.0.1 >nul

其中XXX是等待的秒数加一。


3
Clay Calvert提供了这个技术的解释。注意,-n用于指示请求的数量。即使回复可能在更短的时间内到达,ping默认每次等待一个回复1秒钟。 - Jaime Soto
请记得将秒数加一,因为ping在第一个请求之前不会等待。 - lunixbochs
3
哈哈,如此简单而又如此精妙 :-) 恰好是我正在寻找的。+1 - Simon
当我需要一个脚本自动释放计算机的IP地址,等待几分钟来重新配置交换机端口,然后更新IP地址时,我在使用该方法时遇到了一个有趣的问题。在交换机端口关闭的这段时间里,网络连接会丢失,ping命令会出现“硬件错误”的消息,并以比预期时间短得多的时间运行所谓的1秒钟的ping命令。 - Wes Larson
是的,SLEEP命令对我也不起作用。Windows 10。很棒的技巧。 - peterb
显示剩余3条评论

179

我不知道为什么这些命令对你不起作用,但你也可以尝试使用timeout

(注:此段话是在回答一个问题时提供建议的。)

timeout <delay in seconds>

我安装了纯净的Windows XP。我认为“睡眠”是需要安装的附加功能。不过,“timeout”很好用,谢谢! - Claudiu
我没有使用过这个命令 - 我只是在 ss64 上找到它。你可能还想看看 lukuluku 的解决方案 - Jaime Soto
1
这在Windows 7中有效。 - James Gardner
2
TIMEOUT命令是在Windows Vista中引入的。 - Peter Mortensen
请注意,如果您不想在控制台中显示“等待x秒钟,请按任意键”消息,则可以使用“timeout delayInSecs >nul”,然后它会静默等待并在时间到达后继续执行。请记住,它仍然会响应任何键(这意味着如果批处理运行的控制台是活动窗口,则按键可能会中断脚本的等待)。 - Matt
显示剩余3条评论

170
timeout /t 10 /nobreak > NUL

/t 指定等待的时间,单位为秒

/nobreak 如果你按下一个键(除了CTRL-C),不会中断超时

> NUL 将抑制命令的输出


8
天啊!我完全不知道这里面还有这个。SO 应该按照评分排列这些答案。我差点错过了这个。 - RandomInsano
2
这正是我一直在寻找却无处可寻的东西。+1 - Registered User
3
TIMEOUT 命令在 Windows XP 上无法使用;它是在 Windows Vista 中引入的。(参见:http://en.wikipedia.org/wiki/Batch_file#Sleep_or_scripted_delay) - Peter Mortensen
3
在我的XP机器上,我有它。@PeterMortensen 它是通过更新进来的吗? - Riscie
2
@Heberda /t 等待时间(秒),/nobreak 不会在按下按钮时中断超时(除了 CTRL-C),> NUL 将抑制命令的输出。 - lukuluku
显示剩余3条评论

14

等待10秒钟:

choice /T 10 /C X /D X /N

1
我将使用> NUL来抑制所有输出。 - Claudiu
哇,实际上我在使用这个安装的XP系统时既没有超时也没有选择...真的很奇怪。只能用ping命令了。 - Claudiu
2
CHOICE命令在Windows XP上不起作用;它是在Windows 2003和Windows Vista中引入的。 - Peter Mortensen
2
@PeterMortensen 发现 Choice 在 Windows XP 上是可用的,但默认情况下未安装。它并没有在 Windows 2003 中引入,因为它存在于 Windows 的早期消费版本(95、98)甚至 MSDOS 6.0 中。当他们从 Windows 2000 开始将消费者版本与 NT 版本结合时,他们可能只是忘记了它。;-) - GolezTrol

13

微软提供了一个可以直接调用的睡眠函数。

    Usage:  sleep      time-to-sleep-in-seconds
            sleep [-m] time-to-sleep-in-milliseconds
            sleep [-c] commited-memory ratio (1%-100%)

你可以在批处理脚本中使用 sleep 1 命令来让程序休眠1秒。

我认为对于这种情况来说,ping 命令有点不太合适。


10
"C:\Documents and Settings\User>sleep 'sleep' is not recognized as an internal or external command, operable program or batch file." 这段文字意思是:在Windows系统下,运行“sleep”指令时出现错误提示:“sleep不是内部或外部命令,也不是可运行的程序或批处理文件。”听起来Windows系统对于这种情况有点欠缺啊。。哈哈 - Claudiu
我可以在我的机器(Windows 7)上使用“sleep”。 - Rejeev Divakaran
4
PowerShell 还是纯 cmd.exe? - RandomInsano
1
PowerShell确实很好。很棒的发现@RandomInsano! - Domi
2
确认 - 它是一个 POWER SHELL 命令,而不是常规命令行 (cmd.exe) 命令。 - jave.web
在我的Win8 CMD中运行良好。 - Hashbrown

6

对于一个纯的cmd.exe脚本,您可以使用以下代码来返回以百分之一秒为单位的当前时间。

:gettime
set hh=%time:~0,2%
set mm=%time:~3,2%
set ss=%time:~6,2%
set cc=%time:~-2%
set /A %1=hh*360000+mm*6000+ss*100+cc
goto :eof

您可以像这样在等待循环中使用它。
:wait
call :gettime wait0
:w2
call :gettime wait1
set /A waitt = wait1-wait0
if !waitt! lss %1 goto :w2
goto :eof

将所有的部分组合在一起:

@echo off
setlocal enableextensions enabledelayedexpansion

call :gettime t1
echo %t1%
call :wait %1
call :gettime t2
echo %t2%
set /A tt = (t2-t1)/100
echo %tt%
goto :eof

:wait
call :gettime wait0
:w2
call :gettime wait1
set /A waitt = wait1-wait0
if !waitt! lss %1 goto :w2
goto :eof

:gettime 
set hh=%time:~0,2%
set mm=%time:~3,2%
set ss=%time:~6,2%
set cc=%time:~-2%
set /A %1=hh*360000+mm*6000+ss*100+cc
goto :eof

如果需要更详细的命令描述,请查看HELP SETHELP CALL信息。


6
但这是一个“繁忙等待”循环,会不必要地消耗CPU时间。在我看来,调用一个等待命令会更好。请查看此链接以了解更多信息。为了在您的脚本中缓解此问题,您可以在“:等待”标签后插入timeout x >nul(将x替换为要等待的秒数)。 - Matt
这在国际版的Windows上是不可靠的,因为它与日期和时间本地化有关。 - risingballs

4

嘿,Windows 呃... 很有趣。这个可以:

choice /T 1 /d y > NUL

choice 提供一个提示,询问您是否是肯定的答复。 /d y 使其选择“是”。/t 1 使其在键入之前等待一秒钟。> NUL 压制输出。


8
是的,但你需要有一个询问“是”或“否”的Windows。在我的荷兰语Windows上,它会问Ja或Nee,所以Y无法使用。这就是为什么我在上面的回答中指定了确切的选择。你只需添加“/N”即可防止提示框被显示。 - GolezTrol
@GolezTrol:仍需要“> NUL”来抑制“X”的显示。啊,我没有意识到“/C”的重要性,我在网上找到的例子中有它。 - Claudiu
CHOICE命令在Windows XP上不起作用;它是在Windows 2003和Windows Vista中引入的。 - Peter Mortensen

4

...或者 powershell -command "Start-Sleep -Milliseconds 5000">nul - Mister Henson

4

我依赖于 JScript。我有一个像下面这样的 JScript 文件:

// This is sleep.js
WScript.Sleep( WScript.Arguments( 0 ) );

在批处理文件中,我使用CScript运行它(通常是%SystemRoot%\system32\cscript.exe)。

rem This is the calling inside a BAT file to wait for 5 seconds
cscript /nologo sleep.js 5000

3

1
/* 使用ms vc6编译此代码,cl.exe Sleep.c,例如Sleep.exe 100..休眠100毫秒 */ #include <WinSock.h> int main(int argc, char *argv[]) { Sleep(argc<2?1000:atoi(argv[1])); return 0; } - mosh

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