首页 文章

如何在Windows的命令提示符下睡5秒? (或DOS)[重复]

提问于
浏览
581

这个问题在这里已有答案:

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

所以在Ruby中,我可以做类似的事情

sleep 3
system('c:/windows/system32/SnippingTool.exe')

但并非所有计算机都有Ruby,那么如何在.bat文件中执行此操作呢? (使用Snipping工具在大多数PC上都可以运行的东西) .

问题是.bat文件中没有“睡眠”可用 .

30 回答

  • -1

    我们不能做 waitfor /T 180

    waitfor /T 180 pause 将导致"ERROR: Timed out waiting for 'pause'."

    waitfor /T 180 pause >nul 将在地毯下扫过"error"

    在Win95之后的Windows操作系统中应该有 waitfor 命令

    在过去,我已经下载了一个名为 sleep 的可执行文件,它可以在您将其放入路径后在命令行上运行 .

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

  • 1

    两个答案:

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

    timeout /t <TimeoutInSeconds> [/nobreak]
    

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

    其次,值得一提的是,尽管使用内置的Windows剪切工具可能无法完全满足您的需求,但您可以在不使用鼠标的情况下触发剪辑 . 运行剪切工具,从当前剪辑中退出但保持工具运行,并在希望剪辑发生时点击控制打印屏幕 . 这不应该干扰你想要剪断的东西 .

  • 10

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

    将5替换为您想要等待的时间......

  • 31

    我试图在msbuild任务中执行此操作,并且由于I / O重定向,选择和超时都不起作用 .

    我最终使用了来自http://sourceforge.net/projects/unxutils的sleep.exe,这很不错,因为它没有't require any install and it'很小 .


    尝试使用 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并且它基于当前的纪元时间以秒为单位创建临时文件/数据库 - 这当然意味着如果你启动多个实例,每个实例都使用相同的临时名称 . 我原本试图使用MSBuild Extension Pack Thread.Sleep 命令,但似乎(通常)它运行睡眠任务很好,但是然后同时在所有线程中启动 <exec> 任务,当然dbghost.exe会失败冲突 . 到目前为止,使用sleep.exe似乎更可靠 .

  • 0

    我这样做最简单的方法是:

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

  • 1263

    ping在超时之前等待约 5 seconds ,而不是如上所述的1秒 . 也就是说,除非你告诉它在超时之前只等待1秒钟 .

    ping 1.0.0.1 -n 1 -w 1000

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

    所以大约20秒的延迟是:

    ping 1.0.0.1 -n 20 -w 1000

  • 3

    如果您有选择或ping,这可行 .

    @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并运行即可

  • 0

    尝试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."
    
  • 2

    还有两种应该适用于XP及以上版本的方法:

    用w32tm

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

    与typeperf:

    typeperf "\System\Processor Queue Length" -si 5 -sc 1 >nul
    
  • 63

    没有人提到我,我感到非常惊讶:

    C:\> timeout 5
    

    N.B. 请注意(感谢Dan!) timeout 5 表示:

    在4到5秒之间睡觉

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

    @echo off
    echo %time%
    timeout 5 > NUL
    echo %time%
    
  • -3

    在Windows xp sp3中,您可以使用sleep命令

  • 736

    我做的 . 它正在工作,并在几秒钟内显示时间 . 如果要使用它,请添加到批处理文件:

    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
    
  • 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
    

    您也可以在计算中插入日期,以便在延迟时间间隔超过午夜时该方法也可以使用 .

  • -1
    PING -n 60 127.0.0.1>nul
    

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

  • 32

    我写了一个powerbasic程序 wait.exe ,你在批处理文件中传递一个毫秒参数

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

    EXE的代码:

    FUNCTION PBMAIN()
      c$ = Command$
      s! = Val(c$)*1000
      Sleep s!         
    END FUNCTION
    
  • 10

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

    echo WScript.Sleep(5000) >"%temp%\sleep.vbs"
    cscript "%temp%\sleep.vbs"
    
  • 1

    如果您的系统上有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毫秒) .

  • 27

    一个hack是(错误)使用ping命令:

    ping 127.0.0.1 -n 6 > nul
    

    说明:

    • ping是一个发送ping请求的系统实用程序 . ping 适用于所有版本的Windows .

    • 127.0.0.1localhost的IP地址 . 保证此IP地址始终可以解析,可以访问,并立即响应ping .

    • -n 6 指定有6个ping . 每次ping之间有1s延迟,因此对于5s延迟,您需要发送6次ping .

    • > nul 抑制 ping 的输出,redirectingnul .

  • 4

    我认为以下命令可以提供帮助:

    pause 5
    

    pause命令的语法是:pause d \其中d表示以秒为单位的持续时间

    我使用的是Windows 7(32位),但我不知道其他的 .

  • 0

    在较新的Windows操作系统版本上,您可以使用该命令

    sleep /w2000
    

    在DOS脚本( .cmd.bat )中等待2秒(2000毫秒 - 用你需要的ms替换时间) . 小心包含 /w 参数 - 没有它,整个计算机都会进入睡眠状态!如果您愿意,可以使用 -m 而不是 /m ,并且可以选择在w和数字之间使用冒号(:) .

  • 17

    通过使用“ping”,-n将仅在没有响应ping时确定超时 . 查看这篇关于将DELAY实现为批处理文件的帖子 .

    DELAY command implemented as a Batch File

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

  • 4

    SLEEP 5 包含在某些Windows资源工具包中 .

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

  • 4

    你可以使用 timeout

    这将是可见的: timeout 5

    这将不可见 timeout 5 >nul

  • 3

    Timeout /t 1 >nul

    就像在1秒内暂停一样,你可以将点击率提高到接近100.000(99.999)秒 . 如果您连接到互联网,最佳解决方案是:

    ping 1.1.1.1. -n 1 -w 1000 >nul

    当您ping时,以毫秒为单位计算,因此一秒钟将为1000毫秒 . 但ping命令有点不确定,它在离线机器上的工作方式不同 . 问题是机器因为离线而感到困惑,并且想要ping一个 website/server/host/ip ,但它不能 . 所以我建议超时 . 祝好运!

  • 3
    rem *** HACK ALERT: Sleep for 5 seconds ***
    ping -n 6 127.0.0.1 > nul
    rem ***************************************
    
    • 修正了@Joey的解释
  • 3

    创建一个名为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技巧就不再适用了 .

  • 22

    这是我在实践中使用的最新版本,在脚本完成时看到输出的十秒钟暂停 .

    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
    

    完成的回显允许我查看脚本何时完成并且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在实践中的作用,我跑了

    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不应出现在互联网上,因此ping这个地址会阻止这些测试向任何人发送垃圾邮件!我相应地修改了上面的文字!

  • 2

    用户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
    
  • 48

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

  • 3

    您可以使用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
    

相关问题