如何在Windows的命令提示符下睡5秒钟? (或DOS)

Windows的剪切工具可以捕捉屏幕,但有时我想要在5秒后捕捉屏幕,例如摄像头显示的图像。 (例如,运行脚本并对相机微笑)。

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

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

但不是所有的计算机都有Ruby,那么如何在.bat文件中做到这一点? (这是可以在大多数PC上使用剪切工具运行的东西)。

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

我看到的一个黑客是(错误)使用ping命令:

 ping 127.0.0.1 -n 6 > nul 

127.0.0.1是本地主机IP地址。
-n 6每次ping之间有一个1s的延迟,所以延迟5s需要做6个ping。
没有吞噬的输出。

我很惊讶没有人提到:

 C:\> timeout 5 

NB请注意,但是(感谢丹!) timeout 5意味着:

在4到5秒之间睡眠

这可以通过将以下内容放入batch file中进行validation,重复运行并计算第一个和第二个echo之间的时间差:

 @echo off echo %time% timeout 5 > NUL echo %time% 

尝试select命令。 从MSDOS 6.0开始就已经出现了,应该可以做到。

使用/ T参数指定以秒为单位的超时时间,使用/ D参数指定默认select,然后忽略所选的选项。

可能是一个问题的一个方面是如果用户在超时期限过去之前input了一个select字符。 部分解决方法是混淆这种情况 – 使用/ N参数来隐藏有效select列表,并且在select集中只有1个字符,因此用户在超时到期。

以下是Windows Vista上的帮助文字。 我认为这是相同的XP,但看看XP电脑上的帮助文本来validation。

 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." 
 rem *** HACK ALERT: Sleep for 5 seconds *** ping -n 6 127.0.0.1 > nul rem *************************************** 
  • 如@Joey所解释的那样修复

你可以使用timeout

这将是可见的: timeout 5

这将不会显示timeout 5 >nul

如果你的系统上有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比你的睡眠时间开始花费更less的时间,这种方法将工作(这是我的机器上大约600毫秒)。

我们不能waitfor /T 180吗?

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

waitfor /T 180 pause >nul将清除地毯下的“错误”

Win95后, waitfor命令应该在Windows操作系统中

在过去,我已经下载了一个名为sleep的可执行文件,将其放入path后,可以在命令行上使用。

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

Timeout /t 1 >nul

就像在1秒钟暂停,你可以采取近100.000(99.999)secounds。 如果您连接到互联网,最好的解决scheme是:

ping 1.1.1.1. -n 1 -w 1000 >nul

当你ping的时候,你会以毫秒为单位计算,所以一秒就是1000毫秒。 但是,ping命令有点不一样,在离线机器上的工作方式也不一样。 问题是机器因为脱机而变得困惑,并且想要ping一个website/server/host/ip ,但是它不能。 所以我会build议暂停。 祝你好运!

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

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

这个链接会帮助你更多 。

我试图从一个MSBuild任务内做到这一点,select和超时都没有工作,由于I / Oredirect。

我结束了从http://sourceforge.net/projects/unxutils使用sleep.exe,这是很好,因为它不需要任何安装,它很小。;


试着choice

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

结果是:

 TestCmd: choice /C YN /DY /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 /DY /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,它创build了基于当前纪元时间的临时文件/数据库(以秒为单位) – 这当然意味着如果您启动多个实例,每个使用相同的临时名称。 我最初尝试使用MSBuild扩展包Thread.Sleep命令,但似乎(通常)它正在运行睡眠任务罚款,但然后在所有线程同时启动<exec>任务,当然还有dbghost。 exe会失败,冲突。 到目前为止,使用sleep.exe似乎更可靠。

两个答案:

首先,要拖延batch file,而不是人们提出的所有钝的方法:

 timeout /t <TimeoutInSeconds> [/nobreak] 

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

其次,值得一提的是,虽然它可能不是你想要的,但使用内置的Windows剪辑工具,你可以在不使用鼠标的情况下触发一个剪辑。 运行剪切工具,退出当前剪辑,但保持工具运行,并在想要剪切发生时按Ctrl +打印屏幕。 这不应该干涉你想要剪断的东西。

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

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

batch file:

 cscript myscript.vbs %1 

我做的。 它正在工作,并在几秒钟内显示时间。 如果你想使用它,添加到batch file:

 call wait 10 

当我testing它时,它正在工作。

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 

这是我在实践中使用的最新版本,当脚本结束时,可以暂停十秒以查看输出。

 BEST>@echo done BEST>@REM Wait for 10s ie 10000 milliseconds. BEST>@ping 192.0.2.0 -n 1 -w 10000 > nul 

回声完成后,我可以看到脚本何时完成,并提供延迟。 额外的@符号意味着我看到“完成”的文本,等待发生,没有我分心的命令。

我已经尝试过在XP机器上给出的各种解决scheme,因为这个想法是有一个batch file,可以运行在各种机器上,所以我select了XP机器作为可能性最小的环境。

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

这似乎如预期般拖延了三秒钟。 一次持续指定3秒的ping命令。

 BAD> ping -n 5 192.0.2.0 > nul 

这花了大约10秒(不是5)。 我的解释是,有5个ping的尝试,每个大约1秒,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,结果会有不同的结果,networking有一点时间来恢复已有的问题。

编辑:从另一个post被盗, RFC 3330说IP地址192.0.2.0不应该出现在互联网上,所以ping这个地址防止这些testing垃圾邮件给任何人! 我已经修改了上面的文字!

通过使用“ping”,-n将仅在没有响应ping时确定超时。 看看这个post关于实现DELAY作为一个batch file。

DELAY命令作为batch file实现

我可以复制粘贴重要的位,但整个post是非常有用的。

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

我使用完全基于Windows XPfunction的以下方法在batch file中执行延迟:

文件DELAY.BAT

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

您也可以在计算中插入一天,以便在延迟时间间隔午夜过后,该方法也可以工作。

最简单的方法是这样的:

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

可以用batch file中的两行简单的代码完成:在%temp%文件夹中写入一个临时的.vbs文件,然后调用它:

 echo WScript.Sleep(5000) >"%temp%\sleep.vbs" cscript "%temp%\sleep.vbs" 
 PING -n 60 127.0.0.1>nul 

万一您的LAN适配器不可用。

还有两种方法可以在XP和以上的版本上运行:

与w32tm

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

与typeperf:

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

如果您有适当版本的Windows和Windows Server 2003资源工具包工具 ,它包含批处理程序的睡眠命令。 更多: http : //malektips.com/xp_dos_0002.html

那么这个工程,如果你有select或平。

 @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% /dn > nul if errorlevel 1 ping 1.1.1.1 -n 1 -w %ans1%000 > nul goto end :breakout choice /n /t %ans1% /dn > 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并运行即可

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

 sleep /w2000 

在DOS脚本( .cmd.bat )中等待2s(2000毫秒 – 用你需要的毫秒数代替)。 要小心包括/w参数 – 没有它,整个电脑就进入睡眠! 如果你愿意,可以使用-m而不是/m ,并且可以在w和数字之间使用冒号(:)。

在Windows XP SP3中,您可以使用睡眠命令

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

ping 1.0.0.1 -n 1 -w 1000

会ping一次,等待一秒钟(1000毫秒)的响应,然后超时。

所以大约 20秒的延迟是:

ping 1.0.0.1 -n 20 -w 1000

创build一个名为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,可以随处使用。

编辑:你也应该离开,如果机器没有连接到networking(说便携式,你在地铁中使用),平台的技巧不再真的工作了。

我写了一个powerbasic程序wait.exe ,在你的batch file中传递了一个毫秒参数

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

EXE的代码:

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

我想下面的命令可以帮助:

 pause 5 

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

我正在使用Windows 7(32位),但我不知道其他人。

这应该做的伎俩:select/ T 5 / N / DY

用你想要等待的秒数代替5 …