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

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

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

【问题讨论】:

    标签: windows shell batch-file scripting


    【解决方案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
    【解决方案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;如果不是,您将不得不安装它,例如,从 ActiveStateStrawberry,但它是我安装的其中之一。

        或者,您可以从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)"
        猜你喜欢
        • 2012-03-03
        • 2016-12-20
        • 2011-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-08
        • 2011-11-22
        相关资源
        最近更新 更多