如何在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 …