如何在批处理文件/cmd中休眠五秒钟

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

如何在批处理文件中休眠5秒?

2335608 次浏览

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

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

批处理文件:

cscript myscript.vbs %1

一种方法是(错误地)使用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之间有1秒的延迟,因此对于5秒的延迟,您需要发送6个ping。
  • > nul抑制ping的输出,通过重定向将其转换为nul

下面的hack让你睡5秒钟

ping -n 6 127.0.0.1 > nul

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

我很惊讶没有人提到:

C:\> timeout 5

注:请注意(谢谢Dan!)timeout 5意味着:

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

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

@echo offecho %time%timeout 5 > NULecho %time%

试试选择命令。它从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 listof 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 displayedand 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 defaultchoice is made. Acceptable values are from 0 to9999. If 0 is specified, there will be no pauseand the default choice is selected.
/D    choice        Specifies the default choice after nnnn seconds.Character must be in the set of choices specifiedby /C option and must also specify nnnn with /T.
/M    text          Specifies the message to be displayed beforethe prompt. If not specified, the utilitydisplays only a prompt.
/?                  Displays this help message.
NOTE:The ERRORLEVEL environment variable is set to the index of thekey that was selected from the set of choices. The first choicelisted 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 toolsounds a warning beep. If tool detects an error condition,it returns an ERRORLEVEL value of 255. If the user pressesCTRL+BREAK or CTRL+C, the tool returns an ERRORLEVEL valueof 0. When you use ERRORLEVEL parameters in a batch program, listthem 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 yCHOICE /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."

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

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

文件DELAY.BAT

@ECHO OFFREM DELAY seconds
REM GET ENDING SECONDFOR /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:WAITFOR /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+SIF %CURRENT% LSS %ENDING% GOTO WAIT

您也可以在计算中插入日期,因此当延迟间隔超过午夜时,该方法也有效。

如果你有选择或ping,这是可行的。

@echo offecho.if "%1"=="" goto askqif "%1"=="/?" goto helpif /i "%1"=="/h" goto helpif %1 GTR 0 if %1 LEQ 9999 if /i "%2"=="/q" set ans1=%1& goto quietif %1 GTR 0 if %1 LEQ 9999 set ans1=%1& goto breakoutif %1 LEQ 0 echo %1 is not a valid number & goto helpif not "%1"=="" echo.&echo "%1" is a bad parameter & goto helpgoto end
:helpecho SLEEP runs interactively (by itself) or with parameters (sleep # /q )echo where # is in seconds, ranges from 1 - 9999echo Use optional parameter /q to suppress standard outputecho or type /h or /? for this help fileecho.goto end
:askqset /p ans1=How many seconds to sleep? ^<1-9999^>echo.if "%ans1%"=="" goto askqif %ans1% GTR 0 if %ans1% LEQ 9999 goto breakoutgoto askq
:quietchoice /n /t %ans1% /d n > nulif errorlevel 1 ping 1.1.1.1 -n 1 -w %ans1%000 > nulgoto end
:breakoutchoice /n /t %ans1% /d n > nulif errorlevel 1 ping 1.1.1.1 -n 1 -w %ans1%000 > nulecho Slept %ans1% second^(s^)echo.
:end

命名为sleep.cmd或sleep.bat然后运行它

我们不能做waitfor /T 180吗?

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

waitfor /T 180 pause >nul将把“错误”扫到地毯下

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

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

例如:sleep shutdown -r -f /m \\yourmachine虽然关闭现在内置了-t选项

用户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
:ESPERARfor /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

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

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


尝试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 5EXEC : 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扩展包Thread.Sleep命令,但似乎(通常)它运行睡眠任务很好,但随后同时在所有线程中启动<exec>任务,当然dbghost.exe会因冲突而失败。到目前为止,使用sleep.exe似乎更可靠。

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

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 secondfor /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
:ESPERARfor /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 notypeif %il%==0 (echo Left %Sec% second & set /a Sec=sec-1 & set /a il=il+1)goto no0:notypeset /a il=0:no0
if %TACTUAL% lss %TBASE% set /a TACTUAL=%TBASE%+%TACTUAL%if %TACTUAL% lss %TFIN% goto ESPERAR

我做的最简单的方法是:

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

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

pause 5

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

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

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

sleep /w2000

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

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

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

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

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,但它不能。所以我建议超时。祝你好运!

这应该会起作用:选择 /T5 /N /DY

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

您可以使用timeout

这将是可见的:timeout 5

这将不可见timeout 5 >nul

PING -n 60 127.0.0.1>nul

如果您的LAN适配器不可用。

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

两个答案:

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

timeout /t <TimeoutInSeconds> [/nobreak]

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

其次,值得一提的是,虽然它可能无法完全按照您的意愿执行,但使用内置的Windows剪裁工具,您可以在不使用鼠标的情况下触发它的剪裁。运行剪裁工具,从当前剪裁中转义,但保持工具运行,并在您希望剪裁发生时点击控制+打印屏幕。这不应该干扰您尝试剪裁的任何内容。

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

BEST>@echo doneBEST>@set DelayInSeconds=10BEST>@rem Use ping to waitBEST>@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尝试,每次间隔大约1秒,总共4秒。每次ping尝试可能持续了大约1秒,估计总共9秒。

BAD> timeout 5BAD> sleep /w2000BAD> waitfor /T 180BAD> 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 secsGOOD> 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,几乎没有理由期待不同的结果,最好给网络一点时间来从它遇到的任何问题中恢复过来。

编辑:从另一篇文章被盗,…rfc3330说IP地址192.0.2.0不应该出现在互联网上,所以ping这个地址可以防止这些测试向任何人发送垃圾邮件!我已经修改了上面的文字!

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

w32tm

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

typeperf

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

使用mshta(不需要设置网络):

start "" /w /b /min mshta "javascript:setTimeout(function(){close();},5000);"

ping在超时之前等待大约5秒,而不是上面所说的1秒。也就是说,除非你在超时之前只等待1秒。

ping1.0.0.1-n 1-w 1000

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

所以 20秒的延迟是:

ping1.0.0.1-n 20-w 1000

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

此链接将帮助您更多

创建一个名为sleep.cmd的cmd文件:

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

将sleep.cmd复制到c:\windows\system 32

用法:

sleep 500

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

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

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

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

EXE的代码:

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

确实有!

SLEEP <seconds>

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

SLEEP -m <time in milliseconds>

这比TIMEOUT更有帮助,因为TIMEOUT可以通过单击键或CTRL + C(对于TIMEOUT /t <secs> /nobreak)来中止。SLEEP不能被任何东西中止(除了关闭按钮:p)

另一个是PING。但是PING需要互联网连接,因为您将记录站点的连接。