代码之家  ›  专栏  ›  技术社区  ›  nonopolarity

如何在批处理文件/cmd中休眠5秒?[复制品]

  •  599
  • nonopolarity  · 技术社区  · 15 年前

    这个问题已经有了答案:

    Windows的截图工具可以捕获屏幕,但有时我想在5秒钟后捕获屏幕,例如通过网络摄像机显示图像。(例如,运行脚本并对着相机微笑)。

    我的问题是:如何在批处理文件中睡眠5秒钟?

    31 回复  |  直到 5 年前
        1
  •  753
  •   MultiplyByZer0 Joke_Sense10    6 年前

    一种方法是(mis)使用ping命令:

    ping 127.0.0.1 -n 6 > nul
    

    说明:

    • ping 是一个发送ping请求的系统实用程序。 发出砰的声响 在所有版本的Windows上都可用。
    • 127.0.0.1 是的IP地址 localhost . 此IP地址保证始终解析、可访问并立即响应ping。
    • -n 6 指定有6个ping。每个ping之间有一个1s延迟,因此对于5s延迟,您需要发送6个ping。
    • > nul 禁止输出 发出砰的声响 通过 redirecting 它到 nul .
        2
  •  1291
  •   Evgeniy Berezovsky    9 年前

    我很惊讶没有人提到:

    C:\> timeout 5
    

    N.B. 但是请注意(谢谢丹!)那个 timeout 5 手段:

    在4到5秒之间的任何地方睡觉

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

    @echo off
    echo %time%
    timeout 5 > NUL
    echo %time%
    
        3
  •  64
  •   Adam Porad    14 年前

    试试 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."
    
        4
  •  49
  •   OldMcDonald niiraj874u    6 年前

    下面的黑客让你睡5秒钟

    ping -n 6 127.0.0.1 > nul
    

    由于ping在ping之间等待一秒钟,因此必须指定一个以上的ping。

        5
  •  34
  •   Alex    10 年前

    你可以用 timeout :

    这将可见: timeout 5

    这将不可见 timeout 5 >nul

        6
  •  34
  •   Niall Connaughton    10 年前

    如果你有 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毫秒)。

        7
  •  28
  •   Chris Marisic    9 年前

    难道我们不能 waitfor /T 180 ?

    waitfor /T 180 pause 将导致“错误:等待“暂停”超时。”

    waitfor /T 180 pause >nul 会扫过地毯下的那个“错误”

    这个 waitfor 在Win95之后,命令应该出现在Windows操作系统中。

    过去我下载了一个名为 sleep 在您将命令行放入您的路径之后,它将在命令行上工作。

    例如: sleep shutdown -r -f /m \\yourmachine 尽管shutdown现在内置了-t选项

        8
  •  22
  •   Alex Nolasco    8 年前

    Timeout /t 1 >nul

    就像在1秒内暂停一样,你可以将limed取到接近100.000(99.999)秒。 如果您连接到Internet,最好的解决方案是:

    ping 1.1.1.1. -n 1 -w 1000 >nul

    当您ping时,以毫秒为单位计数,所以一秒钟就是1000毫秒。但是ping命令有点不确定,它在脱机机器上的工作方式不同。 问题是,机器会因为离线而被混淆,它希望 website/server/host/ip 但不能。 所以我建议超时。 祝你好运!

        9
  •  17
  •   Amir    8 年前

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

    TIMEOUT 5 以前包含在一些Windows资源工具包中,但现在是Windows7和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

    this link will help you more .

        10
  •  10
  •   gregmac    12 年前

    我试图在msbuild任务中执行此操作,但由于I/O重定向,choice和timeout都不起作用。

    我最终使用了sleep.exe http://sourceforge.net/projects/unxutils 很好,因为它不需要任何安装,而且很小。


    尝试 choice :

    <Target Name="TestCmd">
      <Exec Command="choice /C YN /D Y /t 5 " />
    </Target>
    

    结果:

    TestCmd:
      choice /C YN /D Y /t 5
    
    EXEC : error : The file is either empty or does not contain the valid choices. [test.proj]
      [Y,N]?
    C:\test.proj(5,9): error MSB3073: The command "choice /C YN /D Y /t 5 " exited with code 255.
    

    尝试 timeout :

    <Target Name="TestCmd">
      <Exec Command="timeout /t 5 " />
    </Target>
    

    结果:

    TestCmd:
      timeout /t 5
    EXEC : error : Input redirection is not supported, exiting the process immediately. [test.proj]
    C:\test.proj(5,7): error MSB3073: The command "timeout /t 5 " exited with code 1.
    

    旁白:

    我真的在用 <Exec Command="sleep 2 & dbghost.exe" /> 因为我要并行执行dbghost.exe多次,它会根据当前的epoch时间(以秒为单位)创建临时文件/数据库——当然,这意味着如果启动多个实例,每个实例都使用相同的临时名称。我最初尝试使用msbuild扩展包 Thread.Sleep 命令,但看起来(通常)它运行睡眠任务很好,但随后启动 <exec> 同时在所有线程中执行任务,当然dbghost.exe会因冲突而失败。到目前为止,使用sleep.exe似乎更可靠。

        11
  •  10
  •   Ned Martin    10 年前

    两个答案:

    首先,要延迟批处理文件,简单地说,没有人们提出的所有钝器方法:

    timeout /t <TimeoutInSeconds> [/nobreak] 
    

    http://technet.microsoft.com/en-us/library/cc754891.aspx

    第二,值得一提的是,虽然它可能无法完全满足您的需要,但使用内置的Windows截图工具,您可以在不使用鼠标的情况下触发截图。运行截图工具,退出当前截图,但保持工具运行,并在希望截图发生时点击Control+打印屏幕。这不应该干扰你想剪的东西。

        12
  •  5
  •   Peter Mortensen user1284631    11 年前

    我做了这个。它正在工作并以秒为单位显示剩余时间。如果要使用它,请添加到批处理文件:

    call wait 10
    

    当我测试它时,它起作用了。

    上市 wait.bat (必须在工作目录中或 windir/system32/ ):

    @echo off
    
    set SW=00
    
    set SW2=00
    
    set /a Sec=%1-1
    
    set il=00
    @echo Wait %1 second
    for /f "tokens=1,2,3,4 delims=:," %%A in ("%TIME%") do set /a HH=%%A, MM=1%%B-100, SS=1%%C-100, CC=1%%D-100, TBASE=((HH*60+MM)*60+SS)*100+CC, SW=CC 
    
    set /a TFIN=%TBASE%+%100
    
    :ESPERAR
    for /f "tokens=1,2,3,4 delims=:," %%A in ("%TIME%") do set /a HH=%%A, MM=1%%B-100, SS=1%%C-100, 
    
    CC=1%%D-100, TACTUAL=((HH*60+MM)*60+SS)*100+CC,  SW2=CC
    
    
    if %SW2% neq %SW% goto notype
    if %il%==0 (echo Left %Sec% second & set /a Sec=sec-1 & set /a il=il+1)
    goto no0
    :notype
    set /a il=0
    :no0
    
    if %TACTUAL% lss %TBASE% set /a TACTUAL=%TBASE%+%TACTUAL%
    if %TACTUAL% lss %TFIN% goto ESPERAR
    
        13
  •  5
  •   Ivan    7 年前

    这是我在实践中使用的最新版本,在脚本完成时暂停10秒钟以查看输出。

    BEST>@echo done
    BEST>@set DelayInSeconds=10
    BEST>@rem Use ping to wait
    BEST>@ping 192.0.2.0 -n 1 -w %DelayInSeconds%000 > nul
    

    echo完成后,我可以看到脚本何时完成,ping提供延迟。额外的@符号意味着我看到了“完成”的文本,等待发生时我不会被它们的命令分散注意力。

    我在一台XP机器上尝试了这里给出的各种解决方案,因为我的想法是要有一个可以在各种机器上运行的批处理文件,所以我选择了XP机器作为可能能力最差的环境。

    GOOD> ping 192.0.2.0 -n 1 -w 3000 > nul
    

    这似乎像预期的那样延迟了三秒钟。一次Ping尝试持续指定的3秒。

    BAD> ping -n 5 192.0.2.0 > nul
    

    这需要大约10秒(而不是5秒)。我的解释是有5次Ping尝试,每一次间隔约一秒,持续4秒。每一次Ping尝试大概持续一秒左右,估计总共9秒。

    BAD> timeout 5
    BAD> sleep /w2000
    BAD> waitfor /T 180
    BAD> choice
    

    命令不可用。

    BAD> ping 192.0.2.0 -n 1 -w 10000 > nul :: wait 10000 milliseconds, ie 10 secs
    

    我也尝试了上述方法,在阅读了注释后,可以使用两个连续的冒号添加到BAT文件中。然而,软件几乎立即返回。在Ping运行良好之前,将评论放在自己的线上。

    GOOD> :: wait 10000 milliseconds, ie 10 secs
    GOOD> ping 192.0.2.0 -n 1 -w 10000 > nul
    

    为了更好地理解平在实践中所做的,我跑了

    ping 192.0.2.0 -n 5 -w 5000
    

    这需要大约30秒,即使5*5=25。我的解释是,有5次ping尝试,每次持续5秒,但两次ping尝试之间有大约1秒的时间延迟:毕竟,如果您立即再次ping,几乎没有理由期望得到不同的结果,最好给网络一点时间来从它遇到的任何问题中恢复。

    编辑:被盗自 another post RFC 3330 说IP地址192.0.2.0不应该出现在Internet上,所以ping这个地址可以防止这些测试向任何人发送垃圾邮件! 我已经相应地修改了上面的文本!

        14
  •  4
  •   Peter Mortensen user1284631    11 年前

    你可以使用 VBScript 例如,文件 myscript.vbs :

    set wsobject = wscript.createobject("wscript.shell")
    
    do while 1=1
        wsobject.run "SnippingTool.exe",0,TRUE
        wscript.sleep 3000
    loop
    

    批处理文件:

    cscript myscript.vbs %1
    
        15
  •  4
  •   npocmaka    9 年前

    还有两种适用于XP及更高版本的应用程序的方法:

    用W32 TM

    w32tm /stripchart /computer:localhost /period:5 /dataonly /samples:2  1>nul 
    

    Type Pyff:

    typeperf "\System\Processor Queue Length" -si 5 -sc 1 >nul
    
        16
  •  3
  •   Nikos Steiakakis    15 年前

    通过使用“ping”,-n将仅在对ping没有响应时确定超时。 查看关于将延迟实现为批处理文件的文章。

    DELAY command implemented as a Batch File

    我可以复制粘贴重要的部分,但整个帖子非常有用。

        17
  •  3
  •   Rober    12 年前

    用户aacini提出的代码改进,分辨率为百分之一秒,当时间达到23:59:59,99时不会失败:

    for /f "tokens=1,2,3,4 delims=:," %%A in ("%TIME%") do set /a HH=%%A, MM=1%%B-100, SS=1%%C-100, CC=1%%D-100, TBASE=((HH*60+MM)*60+SS)*100+CC
    
    :: Example delay 1 seg.
    set /a TFIN=%TBASE%+100
    
    :ESPERAR
    for /f "tokens=1,2,3,4 delims=:," %%A in ("%TIME%") do set /a HH=%%A, MM=1%%B-100, SS=1%%C-100, CC=1%%D-100, TACTUAL=((HH*60+MM)*60+SS)*100+CC
    
    if %TACTUAL% lss %TBASE% set /a TACTUAL=%TBASE%+%TACTUAL%
    if %TACTUAL% lss %TFIN% goto ESPERAR
    
        18
  •  3
  •   Peter Mortensen user1284631    11 年前

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

    文件删除

    @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
    

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

        19
  •  3
  •   Peter Mortensen user1284631    11 年前

    最简单的方法是:

    在下载sleep.exe http://www.sleepcmd.com/ . .exe文件应与您编写的程序位于同一文件夹中!

        20
  •  3
  •   Peter Mortensen user1284631    11 年前

    它可以通过批处理文件中的两个简单行来完成:编写一个临时的 .vbs 文件中 %temp% 文件夹并调用它:

    echo WScript.Sleep(5000) >"%temp%\sleep.vbs"
    cscript "%temp%\sleep.vbs"
    
        21
  •  2
  •   GreenMatt    14 年前

    如果您有适当版本的Windows和 Windows Server 2003 Resource Kit Tools ,它包括批处理程序的睡眠命令。更多在: http://malektips.com/xp_dos_0002.html

        22
  •  2
  •   Baby Groot Duleendra    10 年前
    PING -n 60 127.0.0.1>nul
    

    以防您的LAN适配器不可用。

        23
  •  1
  •   Andrés Falcón    10 年前

    在Windows XP SP3中,可以使用sleep命令

        24
  •  1
  •   thebunnyrules    7 年前

    生成一个名为sleep.cmd的cmd文件:

    REM Usage: SLEEP Time_in_MiliSECONDS
    @ECHO off
    ping 1.0.0.0 -n 1 -w %1 > nul
    

    将sleep.cmd复制到c:\windows\system32

    用途:

    sleep 500
    

    睡眠0.5秒。MS中的参数一旦复制到system32,就可以在任何地方使用。

    编辑:你也应该远离,如果机器没有连接到网络(比如说你在地铁里使用的便携式设备),Ping技巧就不再有效了。

        25
  •  0
  •   Doctor DOS    12 年前

    好吧,如果你有选择或者平的话,这是可行的。

    @echo off
    echo.
    if "%1"=="" goto askq
    if "%1"=="/?" goto help
    if /i "%1"=="/h" goto help
    if %1 GTR 0 if %1 LEQ 9999 if /i "%2"=="/q" set ans1=%1& goto quiet
    if %1 GTR 0 if %1 LEQ 9999 set ans1=%1& goto breakout
    if %1 LEQ 0 echo %1 is not a valid number & goto help
    if not "%1"=="" echo.&echo "%1" is a bad parameter & goto help
    goto end
    
    :help
    echo SLEEP runs interactively (by itself) or with parameters (sleep # /q )
    echo where # is in seconds, ranges from 1 - 9999
    echo Use optional parameter /q to suppress standard output 
    echo or type /h or /? for this help file
    echo.
    goto end
    
    :askq
    set /p ans1=How many seconds to sleep? ^<1-9999^> 
    echo.
    if "%ans1%"=="" goto askq
    if %ans1% GTR 0 if %ans1% LEQ 9999 goto breakout
    goto askq
    
    :quiet
    choice /n /t %ans1% /d n > nul
    if errorlevel 1 ping 1.1.1.1 -n 1 -w %ans1%000 > nul
    goto end
    
    :breakout
    choice /n /t %ans1% /d n > nul
    if errorlevel 1 ping 1.1.1.1 -n 1 -w %ans1%000 > nul
    echo Slept %ans1% second^(s^)
    echo.
    
    :end
    

    只需将其命名为sleep.cmd或sleep.bat并运行它

        26
  •  0
  •   LionelGoulet    8 年前

    Ping等待大约 5秒 在超时之前,不是如上所述的1秒。 也就是说,除非你 告诉 它只需等待1秒钟就可以超时。

    Ping 1.0.0.1-N 1-W 1000

    将ping一次,仅等待1秒(1000毫秒)的响应,然后超时。

    所以一个 大约 20秒延迟为:

    Ping 1.0.0.1-N 20-W 1000

        27
  •  0
  •   Shawn    7 年前

    我写了一个PowerBasic程序 等待.exe ,在批处理文件中将毫秒参数传递给它

    wait 3000
    system('c:/windows/system32/SnippingTool.exe')
    

    exe的代码:

    FUNCTION PBMAIN()
      c$ = Command$
      s! = Val(c$)*1000
      Sleep s!         
    END FUNCTION
    
        28
  •  -1
  •   jvallver    11 年前

    在较新的Windows OS版本上,可以使用命令

    sleep /w2000
    

    在DOS脚本中( .cmd .bat )等待2秒(2000毫秒-用毫秒替换您需要的时间)。注意包括 /w 争论-没有它,整个计算机都会进入休眠状态!你可以使用 -m 而不是 /m 如果愿意,也可以在w和数字之间加一个冒号(:)。

        29
  •  -1
  •   Smits    11 年前

    这应该可以做到: 选择/T 5/N/D Y

    将5替换为您要等待的时间(秒)。

        30
  •  -1
  •   amegyoushi    7 年前

    有!

    SLEEP <seconds>
    

    如果您希望它处于毫秒模式:

    SLEEP -m <time in milliseconds>
    

    这比 TIMEOUT 因为 超时 可以通过单击一个键或 CTRL + C (用于 TIMEOUT /t <secs> /nobreak ) SLEEP 不能被任何东西中止(关闭按钮除外:p)

    另一个是 PING . 但是 发出砰的声响 需要Internet连接,因为您将录制网站连接。