关于超时:如何在批处理文件/ cmd中休眠五秒钟

How to sleep for five seconds in a batch file/cmd

本问题已经有最佳答案,请猛点这里访问。

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

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


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

1
C:\> timeout 5

注:但请注意(感谢Dan!)timeout 5表示:

Sleep anywhere between 4 and 5 seconds

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

1
2
3
4
@echo off
echo %time%
timeout 5 > NUL
echo %time%


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

1
ping 127.0.0.1 -n 6 > nul

说明:

  • ping是发送ping请求的系统实用程序。 ping适用于所有版本的Windows。
  • 127.0.0.1是localhost的IP地址。保证此IP地址始终可以解析,可以访问,并立即响应ping。
  • -n 6指定将有6个ping。每次ping之间有1s延迟,因此对于5s延迟,您需要发送6次ping。
  • > nul通过将ping重定向到nul来抑制ping的输出。


尝试选择命令。它自MSDOS 6.0以来一直存在,应该可以解决问题。

使用/ T参数指定超时(以秒为单位)和/ D参数指定默认选择,然后忽略选择的选项。

可能存在问题的一件事是,如果用户在超时期限过去之前键入其中一个选择字符。部分解决方法是混淆情况 - 使用/ N参数隐藏有效选择列表,并且在选择集中只有1个字符,这样用户在输入之前输入有效选项的可能性就会降低。超时到期。

以下是Windows Vista上的帮助文本。我认为它在XP上是一样的,但请查看XP计算机上的帮助文本进行验证。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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."


以下黑客让你睡了5秒钟

1
ping -n 6 127.0.0.1 > nul

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


如果您的系统上有PowerShell,则可以执行以下命令:

1
powershell -command"Start-Sleep -s 5"

编辑:人们提出了一个问题,即PowerShell启动所需的时间与您尝试等待的时间相比是显着的。如果等待时间的准确性很重要(即不能接受额外的两秒或两个延迟),您可以使用以下方法:

1
powershell -command"$sleepUntil = [DateTime]::Parse('%date% %time%').AddSeconds(5); $sleepDuration = $sleepUntil.Subtract((get-date)).TotalMilliseconds; start-sleep -m $sleepDuration"

这将花费发出Windows命令的时间,并且powershell脚本会在该时间之后休眠5秒。因此,只要powershell启动的时间少于睡眠持续时间,这种方法就可以工作(我的机器上的时间大约为600毫秒)。


您可以使用timeout进行制作:

这将是可见的:timeout 5

这将不可见timeout 5 >nul


我们不能waitfor /T 180吗?

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

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

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

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

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


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


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

此链接将为您提供更多帮助。


两个答案:

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

1
timeout /t <TimeoutInSeconds> [/nobreak]

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

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


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

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

尝试使用choice

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

结果是:

1
2
3
4
5
6
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

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

结果是:

1
2
3
4
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.

在旁边:

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


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

用w32tm

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

与typeperf:

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


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

1
2
3
4
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机器作为可能最不具备能力的环境。

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

这似乎按预期延迟了三秒钟。一次ping尝试持续指定的3秒。

1
BAD> ping -n 5 192.0.2.0 > nul

这需要大约10秒钟(不是5秒)。我的解释是有5次ping尝试,每次尝试大约相隔一秒,制作4秒。并且每次ping尝试可能持续大约一秒钟,总计估计为9秒。

1
2
3
4
BAD> timeout 5
BAD> sleep /w2000
BAD> waitfor /T 180
BAD> choice

命令不可用。

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

我也尝试了上述内容,在阅读之后,可以使用两个连续的冒号将注释添加到BAT文件中。然而,该软件几乎立即返回。在ping之前将注释放在自己的行上工作正常。

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

为了更好地理解ping在实践中的作用,我跑了

1
ping 192.0.2.0 -n 5 -w 5000

这需要大约30秒,即使5 * 5 = 25。我的解释是有5次ping尝试,每次持续5秒,但是在ping尝试之间有大约1秒的时间延迟:如果你立即再次ping,并且最好有理由期待不同的结果,那么最好给出一个网络有一点时间从它遇到的任何问题中恢复过来。

编辑:从另一个帖子中窃取,.. RFC 3330说IP地址192.0.2.0不应该出现在互联网上,所以ping这个地址会阻止这些测试给任何人发送垃圾邮件!
我相应地修改了上面的文字!


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

1
call wait 10

当我测试它时,它正在工作。

列表wait.bat(它必须在工作目录或windir/system32/):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@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


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

1
2
3
4
5
6
set wsobject = wscript.createobject("wscript.shell")

do while 1=1
    wsobject.run"SnippingTool.exe",0,TRUE
    wscript.sleep 3000
loop

批处理文件:

1
cscript myscript.vbs %1


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

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

用户Aacini提出的代码的改进,它具有百分之一秒的分辨率,并且当时间达到23:59:59,99时不会失败:

1
2
3
4
5
6
7
8
9
10
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

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

文件DELAY.BAT

1
2
3
4
5
6
7
8
9
10
@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

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


我做的最简单的方法是:

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


1
PING -n 60 127.0.0.1>nul

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


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


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

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

将sleep.cmd复制到c: windows system32

用法:

1
sleep 500

睡眠0.5秒。 ms中的参数。一旦复制到System32,就可以随处使用。

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


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


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


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

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

EXE的代码:

1
2
3
4
5
FUNCTION PBMAIN()
  c$ = Command$
  s! = Val(c$)*1000
  Sleep s!        
END FUNCTION

如果您有选择或ping,这是有效的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
@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并运行即可


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

1
sleep /w2000

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


这应该做的伎俩:
选择/ T 5 / N / D Y.

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


有!

1
SLEEP <seconds>

如果你想要它以毫秒模式:

1
SLEEP -m <time in milliseconds>

这比TIMEOUT更有用,因为只需单击一个键或CTRL + C(对于TIMEOUT /t /nobreak)就可以中止TIMEOUTSLEEP不能被任何内容中止(关闭按钮除外:p)

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


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

1
pause 5

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

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