Windows批处理:睡眠[重复]

Posted

技术标签:

【中文标题】Windows批处理:睡眠[重复]【英文标题】:Windows batch: sleep [duplicate] 【发布时间】:2011-05-18 01:13:30 【问题描述】:

如何让 Windows 批处理脚本等待几秒钟?

sleepwait 似乎不起作用(无法识别的命令)。

【问题讨论】:

【参考方案1】:

你可以试试

ping -n XXX 127.0.0.1 >nul

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

【讨论】:

Clay Calvert 提供了对这种技术的解释。注意-n用来表示请求的数量。 ping 默认为每个回复等待一秒钟,即使它在更短的时间内到达。 请记住,您需要在秒数上加一,因为 ping 不会在第一个请求之前等待。 哈哈,如此简单却又如此天才 :-) 正是我想要的。 +1 我能找到的唯一能在普通 XP 上工作的东西。 当我需要一个脚本来自动释放计算机的 IP 地址时,我遇到了一个有趣的问题,我需要等待几分钟,然后重新配置交换机端口,然后更新 IP 地址。在交换机端口关闭期间,网络连接丢失并且 ping 出错并显示 hardware error 消息,并且在预期时间的一小部分内完成了所谓的 1 秒长的 ping。【参考方案2】:

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

timeout <delay in seconds>

【讨论】:

我安装了普通的 Windows XP。我认为“睡眠”是您必须安装的附加功能。不过,timeout 效果很好,谢谢! 哦!我不知道超时。不幸的是,它在 Windows 2000 中不可用,尽管现在这可能不是问题。如果是,则选择也适用于以前的版本(即使在 DOS 中)。 我没用过这个命令——我只是在ss64找到的。您可能还想看看lukuluku's solution。 这适用于 Windows 7 The TIMEOUT command was introduced in Windows Vista.【参考方案3】:
timeout /t 10 /nobreak > NUL

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

/nobreak 不会在你按下某个键时中断超时(CTRL-C 除外)

&gt; NUL 将抑制命令的输出

【讨论】:

天哪!我不知道这是在那里。 SO 需要按等级对这些答案进行排序。我差点错过了。 这是我一直在寻找的,但在任何地方都找不到。 +1 TIMEOUT 命令在 Windows XP 上不起作用; it was introduced in Windows Vista.. 在我的 XP 机器上我有它。 @PeterMortensen 它是通过更新进入的吗? @Heberda /t 等待时间,以秒为单位,/nobreak 不会在按下按钮时中断超时(CTRL-C 除外),&gt; NUL 将抑制命令的输出【参考方案4】:

等待 10 秒:

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

【讨论】:

我将使用它和&gt; NUL 来抑制所有输出。 哇,实际上我正在使用的这个 xp 安装既没有超时也没有选择......真的很奇怪。 ping 是。 CHOICE 命令在 Windows XP 上不起作用; it was introduced in Windows 2003 and Windows Vista.. @PeterMortensen 原来Choice 可用于 Windows XP,但默认情况下未安装。不过,它并未在 Windows 2003 中引入,因为它存在于 Windows 的 earlier consumer versions (95, 98) 甚至 MSDOS 6.0 中。当他们将消费者版本与从 Windows 2000 开始的 NT 版本结合起来时,他们可能只是忘记了这一点。;-)【参考方案5】:

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

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

您可以只说 sleep 1,例如在批处理脚本中休眠 1 秒。

IMO Ping 是这个用例的一个小技巧。

【讨论】:

"C:\Documents and Settings\User>sleep 'sleep' 未被识别为内部或外部命令、可运行程序或批处理文件。"对于这个用例,Windows 有点小题大做。哈哈 我可以在我的机器上使用“睡眠”(Windows 7)。 PowerShell 还是普通的 cmd.exe? PowerShell 确实如此。不错的@RandomInsano! 确认 - 这是一个 POWER SHELL 命令,而不是常规命令行 (cmd.exe)【参考方案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 信息。

【讨论】:

但这是一个“忙等待”循环,会不必要地消耗 CPU 时间。在我看来,调用等待的命令更好。请在 SO 考虑this link 以了解更多信息。为了在脚本中缓解这种情况,您可以在 :wait 标签之后插入 timeout x &gt;nul(将 x 替换为等待的秒数)【参考方案7】:

嘿,Windows 嗯……很有趣。这有效:

choice /T 1 /d y > NUL

choice 会提示您是或否。 /d y 让它选择是。 /t 1 让它在输入之前等待一秒钟。 &gt; NUL 压缩输出。

【讨论】:

是的,但是您需要有一个询问是或否的 Windows。在我的荷兰语 Windows 上,它询问 Ja 或 Nee,因此 Y 不起作用。这就是为什么我在上面的答案中指定了确切的选择。您可以添加 /N 以防止显示提示。 @GolezTrol:仍然需要“> NUL”来禁止显示“X”。啊,我没有意识到“/C”的重要性,我在网上找到的例子有它 CHOICE 命令在 Windows XP 上不起作用; it was introduced in Windows 2003 and Windows Vista..【参考方案8】:

Windows 2003 Resource Kit 有一个sleep 批处理文件。如果你升级到PowerShell,你可以使用:

Start-Sleep -s <time to sleep>

或者类似的东西。

【讨论】:

...或powershell -command "Start-Sleep -Milliseconds 5000"&gt;nul【参考方案9】:

我依赖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

【讨论】:

【参考方案10】:

我刚刚写了我自己的 sleep 叫 Win32 Sleep API function。

【讨论】:

/* 用 ms vc6 编译,cl.exe Sleep.c,例如Sleep.exe 100 .. 睡眠 100 毫秒 */ #include int main(int argc, char *argv[]) Sleep(argc 【参考方案11】:

RJLsoftware 有一个名为DelayExec.exe 的小实用程序。有了它,您可以批量执行任何程序的延迟启动和 Windows 注册表(在 ...Windows/.../Run 注册表中最有用)。

使用示例:

delayexec "C:\WINDOWS\system32\notepad.exe" 10

或作为睡眠命令:

delayexec "nothing" 10

【讨论】:

【参考方案12】:

我个人使用Perl one-liner:

perl -e "sleep 10;"

等待 10 秒。作为 git 安装的一部分,您可能已经在开发机器上安装了 Perl;如果不是,您将不得不安装它,例如,从 ActiveState 或 Strawberry,但它是我安装的其中之一。

或者,您可以从GnuWin32 安装睡眠命令。

【讨论】:

啊这不是我安装的东西之一 =P。我什至不想安装“sleep.exe”实用程序,所以这有点多。 Ruby 也可以:ruby -e "sleep 10" -- 并且少了一个字符 :) @Roy:实际上,perl 可以不用分号。如果你能在 9 秒而不是 10 秒内逃脱,甚至可以少两个字符:perl -e "sleep 9" :-) 你也可以这样使用php:php -r sleep(5); 这是另一个解释器:node -e "setTimeout(a=&gt;, 500)"

以上是关于Windows批处理:睡眠[重复]的主要内容,如果未能解决你的问题,请参考以下文章

将传递的参数重定向到 Windows 批处理文件 [重复]

从 Windows 批处理文件向控制台回显空白(空)行 [重复]

Windows 是不是进入睡眠模式或使用 C++ 休眠? [复制]

用于复制和保留重复项的 Windows 批处理文件

使用管道将 Windows 命令解析为批处理文件中的变量 [重复]

在 Windows 中运行批处理文件时显示 %variables% 为空白/丢失 [重复]