【问题标题】:Sleeping in a batch file在批处理文件中休眠
【发布时间】:2011-07-23 04:08:53
【问题描述】:

在编写批处理文件以在 Windows 机器上自动执行某些操作时,我需要暂停其执行几秒钟(通常在测试/等待循环中,等待进程启动)。当时,我能找到的最佳解决方案是使用 ping (我不骗你)来达到预期的效果。我发现了一个更好的写法here,它描述了一个可调用的“wait.bat”,实现如下:

@ping 127.0.0.1 -n 2 -w 1000 > nul
@ping 127.0.0.1 -n %1% -w 1000> nul

然后,您可以在自己的批处理文件中包含对 wait.bat 的调用,并传入休眠的秒数。

Apparently the Windows 2003 Resource Kit provides a Unix-like sleep command(终于!)。与此同时,对于我们这些仍在使用 Windows XP、Windows 2000 或(可悲)Windows NT 的人,有没有更好的方法?

我修改了accepted answer中的sleep.py脚本,这样如果命令行没有传入参数则默认为一秒:

import time, sys

time.sleep(float(sys.argv[1]) if len(sys.argv) > 1 else 1)

【问题讨论】:

  • Windows 2003 Resource Kit 的 Microsoft download page 表明它也适用于 XP。恐怕除了使用“外部”实用程序来等待之外别无选择:XP 命令处理器中没有内置这样的功能。
  • 2003 服务器资源工具包适用于 Windows XP(可能适用于 w2k)
  • 我过去也遇到过同样的问题,我自己也用过 ping (上面的注释清楚地表明我意识到这是愚蠢的:))。
  • 您有两个选择 - 使用 ping 命令模拟睡眠,或下载包含 sleep 命令的 Windows 资源工具包。更多细节在这里:Batch file SLEEP Command

标签: python batch-file


【解决方案1】:

timeout 命令可从 Windows Vista 开始使用:

c:\> timeout /?

TIMEOUT [/T] timeout [/NOBREAK]

Description:
    This utility accepts a timeout parameter to wait for the specified
    time period (in seconds) or until any key is pressed. It also
    accepts a parameter to ignore the key press.

Parameter List:
    /T        timeout       Specifies the number of seconds to wait.
                            Valid range is -1 to 99999 seconds.

    /NOBREAK                Ignore key presses and wait specified time.

    /?                      Displays this help message.

NOTE: A timeout value of -1 means to wait indefinitely for a key press.

Examples:
    TIMEOUT /?
    TIMEOUT /T 10
    TIMEOUT /T 300 /NOBREAK
    TIMEOUT /T -1

注意:它不适用于输入重定向 - 简单示例:

C:\>echo 1 | timeout /t 1 /nobreak
ERROR: Input redirection is not supported, exiting the process immediately.

【讨论】:

  • 在无控制台使用中不起作用:“错误:不支持输入重定向,立即退出进程。”
  • 我指的是根本没有控制台的情况,例如当批处理文件通过来自其他进程的 fork、cygwin crontab 或远程 ssh 命令在后台运行时,等等
  • 哦,是的,我知道。我给出的示例只是为了演示错误:)
  • @Cristian Ciupitu 添加的timeout 文档中的link 部分错误——Windows XP 没有此命令。
  • @HelloWorld 这听起来像是您的 %PATH% 的问题
【解决方案2】:

当我不能(或不想)添加更多可执行文件或安装任何其他软件时,我会使用上述ping 方法。

您应该 ping 不存在的东西,并使用 -w 标志,以便在这段时间后失败,而不是 ping 存在 的东西(如本地主机)@987654323 @时代。这使您可以处理不到一秒的时间,而且我认为它稍微准确一些。

例如

(测试 1.1.1.1 没有被占用)

ECHO Waiting 15 seconds

PING 1.1.1.1 -n 1 -w 15000 > NUL
  or
PING -n 15 -w 1000 127.1 >NUL

【讨论】:

  • 立即返回PING: transmit failed. General failure.
  • IP 1.1.1.1 被 CloudFlare 占用,所以这不会等待 15 秒,而是大约几毫秒。
  • ...这就是为什么你不选择一些“肯定没有被占用”的 IP 地址 x)
【解决方案3】:

更新

timeout 命令(可从 Windows Vista 及更高版本获得)应该是所使用的命令,如该问题的另一个 answer 中所述。下面是一个的答案。

旧答案

如果您安装了 Python,或者不介意安装它(它也有其他用途:),只需创建以下 sleep.py 脚本并将其添加到 PATH 中的某处:

import time, sys

time.sleep(float(sys.argv[1]))

如果您有这样的需要,它将允许亚秒级的暂停(例如,1.5 秒、0.1 秒等)。如果您想将其称为sleep 而不是sleep.py,则可以将.PY 扩展名添加到PATHEXT 环境变量中。在 Windows XP 上,您可以在以下位置进行编辑:

我的电脑→属性(菜单)→高级(选项卡)→环境变量(按钮)→系统变量(框架)

【讨论】:

  • 当需要批处理脚本解决方案时,为什么要在 python 中编写脚本?路径扩展如何解决Windows用户没有安装python解释器的问题?谢谢。
  • 为了便携性,我认为应该避免这种解决方案,因为有非常好的原生替代方案。
  • 这种方法在过去可能提供了一种解决方法,但@Blorgbeard 描述的本机解决方案绝对是可行的方法。
【解决方案4】:

SLEEP.exe 包含在大多数资源工具包中,例如The Windows Server 2003 Resource Kit 也可以安装在 Windows XP 上。

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

【讨论】:

    【解决方案5】:

    我不同意我在这里找到的答案。

    我使用以下完全基于 Windows XP 功能的方法对批处理文件进行延迟:

    DELAY.BAT:

    @ECHO OFF
    REM DELAY seconds
    
    REM GET ENDING SECOND
    FOR /F "TOKENS=1-3 DELIMS=:." %%A IN ("%TIME%") DO SET /A H=%%A, M=1%%B%%100, S=1%%C%%100, ENDING=(H*60+M)*60+S+%1
    
    REM WAIT FOR SUCH A SECOND
    :WAIT
    FOR /F "TOKENS=1-3 DELIMS=:." %%A IN ("%TIME%") DO SET /A H=%%A, M=1%%B%%100, S=1%%C%%100, CURRENT=(H*60+M)*60+S
    IF %CURRENT% LSS %ENDING% GOTO WAIT
    

    您也可以在计算中插入日期,这样当延迟间隔超过午夜时该方法也可以工作。

    【讨论】:

    • 这应该是准确的,但这是一种 CPU 密集型方式。通常,您需要一个中断驱动的实现,以便该进程在等待时不会消耗 CPU 周期。对于不频繁的短暂等待,这应该不是问题,大多数批处理情况可能就是这种情况。但是,持续运行且等待时间较长的进程可能会对系统性能产生负面影响。
    • 因为它使用系统时钟,所以精度为一秒。如果指定 2 秒,则延迟可以是 2 秒到 3 秒之间的任何值(实际上是 2.99999... 秒)。
    • 如果现在时间是 7:59:59,你想等待 7 秒怎么办?这似乎没有考虑到这一点。
    • 这消耗的 CPU 时间比它计算的系统时间多。此外,您正在使用八进制数进行算术运算,因为在 TIME 命令中,小于 10 的分钟和秒会以前导 0 显示。
    • @mrt:问题是您的%TIME% 使用逗号分隔厘秒,而不是点!只需在DELIMS=:.," 中添加一个逗号...
    【解决方案6】:

    我遇到了类似的问题,但我只是打开了一个非常短的 C++ 控制台应用程序来做同样的事情。只需运行 MySleep.exe 1000 - 可能比下载/安装整个资源包更容易。

    #include <tchar.h>
    #include <stdio.h>
    #include "Windows.h"
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        if (argc == 2)
        {
            _tprintf(_T("Sleeping for %s ms\n"), argv[1]);
            Sleep(_tstoi(argv[1]));
        }
        else
        {
            _tprintf(_T("Wrong number of arguments.\n"));
        }
        return 0;
    }
    

    【讨论】:

      【解决方案7】:

      在服务器故障,a similar question was asked,解决方案是:

      choice /d y /t 5 > nul
      

      【讨论】:

      • 仅供参考:Windows XP 中不包含选项。它在 Windows 9x 中,从 XP 中删除,并在 Vista 以后重新添加。
      • 我完全不推荐这个。至少在我所知道的所有CHOICE 版本中,如果有人在等待时按下按钮,不耐烦的人有时会这样做,那么选择将注册一个输入,为输入错误发出系统哔声,并停止倒数计时器,这意味着除非他们按 N 或 Y,否则它将挂在那里。如果他们碰巧按了这两个中的一个,那么选择就在那里结束,而不是等待 5。此外,这个选择使用了非常奇怪的 Vista 语法。所有正常的选择命令都将使用 CHOICE /T:Y,5 &gt; NUL 。旧版本没有/D标志。
      • 最重要的是,至少我知道的 CHOICE 命令根据输入的语言有不同的默认是/否按钮,所以如果你碰巧依赖默认的 [Y,N] 选项而不是用/C:YN 或只是/C:Y 明确指定它,当有人碰巧有一个瑞典选择命令时,这将不起作用,例如,默认情况下可能会执行[J,N]。所以这陷入了各种麻烦。
      • @Coding 在 Win7 中测试过,如果用户按下按钮,它会发出蜂鸣声,但是在用户按下按钮后再过 5 秒后它仍然会超时。因此,如果用户一直按键,它永远不会超时。另外,就我而言,当我使用它时,我相信隐藏控制台,以便用户无法按下按钮。在这个系统上,无法访问 Python,无法在系统上删除我自己的 exe(如其他一些答案中所建议的那样),我能做的事情非常有限。那么,你会推荐什么?
      • @mlsteeves 每个不同的 Windows、DOS 等都有不同的选择命令,如前所述,它通常在 Xp 中不可用。许多选择命令的行为略有不同,有些甚至有不同的语法。我,我一般在需要睡觉的时候使用ping命令。它很丑,但很可靠。
      【解决方案8】:

      你可以使用ping:

      ping 127.0.0.1 -n 11 -w 1000 >nul: 2>nul:
      

      它将等待 10 秒。

      您必须使用 11 的原因是因为第一个 ping 会立即消失,而不是在一秒钟后。该数字应始终比您要等待的秒数多一。

      请记住,-w 的目的不是控制发送数据包的频率,而是确保在出现网络问题时您等待的时间不超过更多 .如果你 ping 127.0.0.1 不太可能有问题,所以这可能没有实际意义。

      ping 命令本身通常会每秒发送一个数据包。这实际上并没有记录在 Windows 文档中,但它似乎遵循与 Linux 版本相同的规则(记录的地方)。

      【讨论】:

      • 不建议将其用于关键实时处理。因为正在使用 PING 命令,所以这个 WAIT 批处理文件可能会运行几毫秒
      • @Wael,如果您说的是等待一秒的界限,那么几毫秒将是无关紧要的。而且,如果您使用 cmd.exe 进行实时处理,那么您应得的一切:-)
      • -w 是一个超时值。这是等待回复的毫秒数……不是等待次ping之间的时间。
      • @quux,我没有在任何地方声明-w 是超时(虽然我承认有些人可能会因为我的不清楚而推断),它实际上是用来限制有网络问题的周期时间这将导致每个周期花费 more 而不是其分配的秒数。我在末尾添加了一段来澄清这一点。
      • @djvg,你是对的,它不在文档中。仅基于观察。
      【解决方案9】:

      您可以使用 Windows cscript WSH 层和这个 wait.js JavaScript 文件:

      if (WScript.Arguments.Count() == 1)
          WScript.Sleep(WScript.Arguments(0)*1000);
      else
          WScript.Echo("Usage: cscript wait.js seconds");
      

      【讨论】:

      • 不过,可以通过组策略禁用 Windows 脚本主机。
      【解决方案10】:

      根据您的兼容性需求,使用ping:

      ping -n <numberofseconds+1> localhost >nul 2>&1
      

      例如要等待 5 秒,请使用

      ping -n 6 localhost >nul 2>&1
      

      或在 Windows 7 或更高版本上使用 timeout:

      timeout 6 >nul
      

      【讨论】:

      • -w 以毫秒为单位,-n 只是 ping 的次数,ping 之间的默认时间是一秒。
      【解决方案11】:

      使用 ping 有更好的睡眠方式。您需要 ping 一个不存在的地址,因此您可以指定毫秒精度的超时。幸运的是,这样的地址是在标准(RFC 3330)中定义的,它是192.0.2.x。这不是虚构的,它确实是一个不存在的唯一目的的地址。需要明确的是,这甚至适用于本地网络。

      192.0.2.0/24 - 此块被分配为“TEST-NET”以用于 文档和示例代码。它经常与 供应商和协议中的域名 example.com 或 example.net 文档。此块内的地址不应出现在 公共互联网。

      要休眠 123 毫秒,请使用 ping 192.0.2.1 -n 1 -w 123 &gt;nul

      更新:根据 cmets,还有127.255.255.255

      【讨论】:

      • 是的,这比在-n参数中加一个更容易编写和理解。
      • 但是,我已经测量过了(使用 100 ping)。如果我使用 -n 3 -w 124,实际时间正好是 (3+1)*(124+1) = 4*125 = 500 ms。时间出奇地稳定,精确到读数中的 10 毫秒分辨率(通过 CMD 提示时间) - 基础分辨率肯定优于 10 毫秒(不受通常的 16 毫秒刻度分辨率的影响)。
      • @mafu 不应该使用 192.0.2.0/24 并不意味着它不能使用,因此不能真正保证回显请求没有回复。例如,为任何 Windows PC 配置静态 IPv4 地址 192.0.2.1 和子网掩码 255.255.255.0 并将网络适配器连接到任何其他设备。一个简单的开关就足够了,没有任何其他连接。然后在这台 Windows PC 上运行ping 192.0.2.1,可以看到 Windows TCP/IP 堆栈对回显请求进行了回复。有多少人知道 192.0.2.0/24 不应该用于静态 IPv4 地址?
      • 根据 cmets here 中的讨论,似乎 192.0.2.1 并非万无一失,有些人认为 127.255.255.255 是更好的选择。想法?
      • 上面帖子中提到的 cmets 现在已被删除(可能是 NLN),但我同意对 127.255.255.255 的更改,因为它是 Windows 中已分配的广播环回地址默认为(您可以通过在 cmd 中运行 route print 并查看它打印的 IPv4 路由表来确认这一点)。
      【解决方案12】:

      如果你的系统上有PowerShell,你可以执行这个命令:

      powershell -command "Start-Sleep -s 1"
      

      编辑:来自my answer on a similar thread,人们提出了一个问题,即与您尝试等待的时间相比,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 毫秒)。

      【讨论】:

      • 如果您添加 powershell 参数 -noprofile,无论您在用户配置文件中添加了多少额外内容,您的 powershell 都会很快启动。
      【解决方案13】:
      timeout /t <seconds> <options>
      

      例如,让脚本执行不可中断的 2 秒等待:

      timeout /t 2 /nobreak >NUL
      

      这意味着脚本将在继续之前等待 2 秒。

      默认情况下,击键会中断超时,因此如果您不希望用户能够中断(取消)等待,请使用/nobreak 开关。此外,超时将提供每秒通知,以通知用户还需要等待多长时间;这可以通过将命令传递给NUL 来删除。

      编辑: 作为@martineau points out in the commentstimeout 命令仅适用于 Windows 7 及更高版本。此外,ping 命令使用的处理器时间少于timeout。不过,我仍然相信在可能的情况下使用timeout,因为它比ping 'hack' 更具可读性。阅读更多here

      【讨论】:

      • Apparently 此命令仅在 Windows 7/2008 和 XP Resource Kit(可能还有 8/8.1)中可用。消息来源还声称ping 方法使用更少的处理器时间。
      【解决方案14】:

      只需将其放入您想要等待的批处理文件中即可。

      @ping 127.0.0.1 -n 11 -w 1000 > null
      

      【讨论】:

      • 这与 paxdiablo 的回答有何不同?
      • 并没有什么不同,但是这里的答案来自多个合并的问题,所以我回复的时候并不是所有的答案都存在。
      【解决方案15】:

      在记事本中,写:

      @echo off
      set /a WAITTIME=%1+1
      PING 127.0.0.1 -n %WAITTIME% > nul
      goto:eof
      

      现在在文件夹 C:\WINDOWS\System32 中另存为 wait.bat, 然后每当您想等待时,请使用:

      CALL WAIT.bat <whole number of seconds without quotes>
      

      【讨论】:

      • 它反复 ping 自己,每次 ping 之间等待一秒钟,然后返回调用程序,我没有看到无限循环,但我自己测试过。
      • 我的错,没有无限循环。但是,正如other answers 之一所述,最好ping 不止一次,并使用-w Timeout 选项作为延迟时间(以毫秒为单位)而不是-n Count 整数重试次数选项.
      • -w Timeout 可能会更好,但我确保它比输入的时间多 ping 一次。
      【解决方案16】:

      Resource Kit 一直包含此内容。至少从 Windows 2000 开始。

      此外,Cygwin 软件包有一个 sleep - 将其放入您的 PATH 并包含 cygwin.dll(或其他任何名称)和方法!

      【讨论】:

      • 请注意,cygwin1.dll 不会与自身的不同版本和平共存。你的机器上最好只有一个 cygwin1.dll,否则你会遇到奇怪的故障。
      • 哪个资源包?好像不止一个。你能更新你的答案吗?
      【解决方案17】:

      ping的用法很好,只要你只是想“稍等一下”。这是因为您依赖于下面的其他功能,例如您的网络工作以及在 127.0.0.1 上没有任何响应的事实。 ;-) 也许它不太可能失败,但也不是不可能......

      如果您想确保您正在等待指定的时间,您应该使用sleep 功能(它还有一个优点是它不使用 CPU 电源或等待网络准备好)。

      找到一个已经生成的可执行文件用于睡眠是最方便的方法。只需将其放入您的 Windows 文件夹或标准路径的任何其他部分,它就始终可用。

      否则,如果您有一个编译环境,您可以轻松地自己制作一个。 Sleep 函数在kernel32.dll 中可用,所以你只需要使用那个函数。 :-) 对于 VB/VBA,在源代码的开头声明以下内容以声明睡眠功能:

      private Declare Sub Sleep Lib "kernel32" Alias "Sleep" (byval dwMilliseconds as Long)
      

      对于 C#:

      [DllImport("kernel32.dll")]
      static extern void Sleep(uint dwMilliseconds);
      

      您可以在 Sleep function (MSDN) 中找到有关此功能(自 Windows 2000 起可用)的更多信息。

      在标准 C 中,sleep() 包含在标准库中,而在 Microsoft 的 Visual Studio C 中,函数名为 Sleep(),如果我没记错的话。 ;-) 这两个参数以秒为单位,而不是像前面两个声明那样以毫秒为单位。

      【讨论】:

      • Sleep 在 .net 框架中可用 - 查看线程类,例如:使用 System.Threading; .... Thread.Sleep(1000);
      • 如果“ping 127.0.0.1”失败,你有比“sleep”更严重的事情要担心——这是loopback接口,任何RPC都可能发疯。
      【解决方案18】:

      我喜欢Aacini's response。我添加了它来处理这一天,还使它能够处理centiseconds%TIME% 输出H:MM:SS.CC):

      :delay
      SET DELAYINPUT=%1
      SET /A DAYS=DELAYINPUT/8640000
      SET /A DELAYINPUT=DELAYINPUT-(DAYS*864000)
      
      ::Get ending centisecond (10 milliseconds)
      FOR /F "tokens=1-4 delims=:." %%A IN ("%TIME%") DO SET /A H=%%A, M=1%%B%%100, S=1%%C%%100, X=1%%D%%100, ENDING=((H*60+M)*60+S)*100+X+DELAYINPUT
      SET /A DAYS=DAYS+ENDING/8640000
      SET /A ENDING=ENDING-(DAYS*864000)
      
      ::Wait for such a centisecond
      :delay_wait
      FOR /F "tokens=1-4 delims=:." %%A IN ("%TIME%") DO SET /A H=%%A, M=1%%B%%100, S=1%%C%%100, X=1%%D%%100, CURRENT=((H*60+M)*60+S)*100+X
      IF DEFINED LASTCURRENT IF %CURRENT% LSS %LASTCURRENT% SET /A DAYS=DAYS-1
      SET LASTCURRENT=%CURRENT%
      IF %CURRENT% LSS %ENDING% GOTO delay_wait
      IF %DAYS% GTR 0 GOTO delay_wait
      GOTO :EOF
      

      【讨论】:

        【解决方案19】:

        我一直在使用这个 C# 睡眠程序。如果 C# 是您的首选语言,对您来说可能会更方便:

        using System;
        using System.Collections.Generic;
        using System.Linq;
        using System.Text;
        using System.Threading;
        
        namespace sleep
        {
            class Program
            {
                static void Main(string[] args)
                {
                    if (args.Length == 1)
                    {
                        double time = Double.Parse(args[0]);
                        Thread.Sleep((int)(time*1000));
                    }
                    else
                    {
                        Console.WriteLine("Usage: sleep <seconds>\nExample: sleep 10");
                    }
                }
            }
        }
        

        【讨论】:

          【解决方案20】:

          Perl 比 Python 解决方案更轻量级 单线。

          要休眠 7 秒,请将其放入 BAT 脚本中:

          perl -e "sleep 7"
          

          此解决方案仅提供一秒的分辨率。

          如果您需要更高的分辨率,请使用 Time::HiRes 来自 CPAN 的模块。它提供usleep() 睡在 微秒和nanosleep() 在纳秒内休眠 (这两个函数都只接受整数参数)。见 堆栈溢出问题 How do I sleep for a millisecond in Perl? 了解更多详情。

          我已经使用ActivePerl 很多年了。这很容易 安装。

          【讨论】:

            【解决方案21】:

            或者命令行Python,比如6秒半:

            python -c "import time;time.sleep(6.5)"
            

            【讨论】:

            • 虽然较短,但这是已接受答案的副本。
            • @Peter Mortensen:它还允许您轻松地将所有内容放入批处理文件的一行中。
            【解决方案22】:

            适用于 Windows 2000 之后的所有 Windows 版本的最佳解决方案是:

            timeout numbersofseconds /nobreak > nul
            

            【讨论】:

            • 不适用于 XP Pro...'timeout' is not recognized as an internal or external command, operable program or batch file.
            【解决方案23】:

            有很多方法可以在 cmd/batch 中完成“sleep”:

            我最喜欢的一个:

            TIMEOUT /NOBREAK 5 >NUL 2>NUL
            

            这将使控制台停止 5 秒钟,没有任何输出。

            最常用:

            ping localhost -n 5 >NUL 2>NUL
            

            这将尝试连接到localhost 5 次。由于它托管在您的计算机上,因此它将始终到达主机,因此每秒它都会尝试新的每秒。 -n 标志指示脚本将尝试连接多少次。在本例中为 5,因此将持续 5 秒。

            最后一个的变种:

            ping 1.1.1.1 -n 5 >nul
            

            在此脚本中,与上一个脚本相比存在一些差异。这不会尝试调用localhost。相反,它会尝试连接到1.1.1.1,一个非常快的网站。仅当您有活动的互联网连接时,该操作才会持续 5 秒。否则它将持续大约 15 来完成操作。我不建议使用这种方法。

            ping 127.0.0.1 -n 5 >nul
            

            这与示例 2 完全相同(最常用)。此外,您还可以使用:

            ping [::1] -n 5 >nul
            

            改为使用 IPv6 的 localhost 版本。

            有很多方法可以执行此操作。但是,对于 Windows Vista 及更高版本,我更喜欢方法 1,而对于早期版本的操作系统,我更喜欢方法 1。

            【讨论】:

              【解决方案24】:

              pathping.exe 可以休眠不到一秒。

              @echo off
              setlocal EnableDelayedExpansion 
              echo !TIME! & pathping localhost -n -q 1 -p %~1 2>&1 > nul & echo !TIME!
              

              .

              > sleep 10
              17:01:33,57
              17:01:33,60
              
              > sleep 20
              17:03:56,54
              17:03:56,58
              
              > sleep 50
              17:04:30,80
              17:04:30,87
              
              > sleep 100
              17:07:06,12
              17:07:06,25
              
              > sleep 200
              17:07:08,42
              17:07:08,64
              
              > sleep 500
              17:07:11,05
              17:07:11,57
              
              > sleep 800
              17:07:18,98
              17:07:19,81
              
              > sleep 1000
              17:07:22,61
              17:07:23,62
              
              > sleep 1500
              17:07:27,55
              17:07:29,06
              

              【讨论】:

                【解决方案25】:

                我对这个印象深刻:

                http://www.computerhope.com/batch.htm#02

                choice /n /c y /d y /t 5 > NUL
                

                从技术上讲,您是在告诉 choice 命令只接受 y。它默认为 y,在 5 秒内完成,不绘制任何提示,并将它所说的任何内容转储到 NUL(如 Linux 上的 null 终端)。

                【讨论】:

                • 我会在这里重复自己:我根本不推荐这个。在我知道的CHOICE 版本中,如果有人在等待时按了键,不耐烦的人有时会这样做,然后选择会读取输入,如果输入错误,系统会发出哔哔声,并停止倒计时,所以它会挂起,除非他们push Y。如果他们只是碰巧按了 Y,那么选择就在那里结束,而不是等待 5。此外,这个选择使用了非常奇怪的 Vista 语法。正常的选择命令改为使用CHOICE /T:Y,5 &gt; NUL。 (旧版本中没有 /D 标志。)如果你有 Vista,请改用TIMEOUT
                【解决方案26】:

                您还可以使用 .vbs 文件来执行特定的超时:

                下面的代码创建 .vbs 文件。把它放在你的 rbatch 代码的顶部附近:

                echo WScript.sleep WScript.Arguments(0) >"%cd%\sleeper.vbs"
                

                下面的代码然后打开 .vbs 并指定等待多长时间:

                start /WAIT "" "%cd%\sleeper.vbs" "1000"
                

                在上面的代码中,“1000”是发送到.vbs文件的延时值,以毫秒为单位,例如1000ms = 1s。您可以将此部分更改为任意长度。

                下面的代码会在您完成后删除 .vbs 文件。将其放在批处理文件的末尾:

                del /f /q "%cd%\sleeper.vbs"
                

                这里是所有代码,所以很容易复制:

                echo WScript.sleep WScript.Arguments(0) >"%cd%\sleeper.vbs"
                start /WAIT "" "%cd%\sleeper.vbs" "1000"
                del /f /q "%cd%\sleeper.vbs"
                

                【讨论】:

                  【解决方案27】:

                  只是为了好玩,如果你安装了 Node.js,你可以使用

                  node -e 'setTimeout(a => a, 5000)'
                  

                  睡眠 5 秒。它适用于装有 Node v12.14.0 的 Mac。

                  【讨论】:

                  • 还有一个使用await的版本:node --input-type=module -e "await new Promise(resolve=&gt;setTimeout(resolve, 5000))"(是的,OP的更好,哈哈)
                  【解决方案28】:

                  您可以通过在标题栏中添加 PAUSE 消息来获得幻想:

                  @ECHO off
                  SET TITLETEXT=Sleep
                  TITLE %TITLETEXT%
                  CALL :sleep 5
                  GOTO :END
                  :: Function Section
                  :sleep ARG
                  ECHO Pausing...
                  FOR /l %%a in (%~1,-1,1) DO (TITLE Script %TITLETEXT% -- time left^
                   %%as&PING.exe -n 2 -w 1000 127.1>NUL)
                  EXIT /B 0
                  :: End of script
                  :END
                  pause
                  ::this is EOF
                  

                  【讨论】:

                    【解决方案29】:

                    这是在 Windows XP SP3 和 Windows 7 上测试并使用 CScript。我放置了一些安全卫士以避免 del "" 提示。 (/q 会很危险)

                    等待一秒钟:

                    sleepOrDelayExecution 1000

                    等待 500 毫秒,然后运行:

                    sleepOrDelayExecution 500 dir \ /s
                    

                    sleepOrDelayExecution.bat:

                    @echo off
                    if "%1" == "" goto end
                    if NOT %1 GTR 0 goto end
                    setlocal
                    set sleepfn="%temp%\sleep%random%.vbs"
                    echo WScript.Sleep(%1) >%sleepfn%
                    if NOT %sleepfn% == "" if NOT EXIST %sleepfn% goto end
                    cscript %sleepfn% >nul
                    if NOT %sleepfn% == "" if EXIST %sleepfn% del %sleepfn%
                    for /f "usebackq tokens=1*" %%i in (`echo %*`) DO @ set params=%%j
                    %params%
                    :end
                    

                    【讨论】:

                      【解决方案30】:

                      由于其他人建议使用 3rd 方程序(Python、Perl、自定义应用程序等),另一个选项是 GNU CoreUtils for Windows,可在http://gnuwin32.sourceforge.net/packages/coreutils.htm 获得。

                      2 个部署选项:

                      1. 安装完整包(其中将包括全套 CoreUtils、依赖项、文档等)。
                      2. 仅安装“sleep.exe”二进制文件和必要的依赖项(使用depends.exe 获取依赖项)。

                      部署 CoreUtils 的一个好处是,您还可以获得许多有助于编写脚本的其他程序(Windows 批处理还有很多不足之处)。

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2013-03-03
                        • 2014-10-07
                        • 2018-09-29
                        相关资源
                        最近更新 更多