Windows的截图工具可以捕捉屏幕,但有时候我想在五秒后捕捉屏幕,比如拍摄通过网络摄像头显示的图像(例如运行脚本并对着摄像头微笑)。
我如何在批处理文件中等待五秒钟?
Windows的截图工具可以捕捉屏幕,但有时候我想在五秒后捕捉屏幕,比如拍摄通过网络摄像头显示的图像(例如运行脚本并对着摄像头微笑)。
我如何在批处理文件中等待五秒钟?
两种答案:
首先,在批处理文件中延迟执行,无需使用人们一直在提出的繁琐方法:
timeout /t <TimeoutInSeconds> [/nobreak]
http://technet.microsoft.com/zh-cn/library/cc754891.aspx
其次,值得一提的是,虽然它可能不能完全符合您的要求,但使用内置的 Windows 截图工具,您可以在不使用鼠标的情况下触发截图。运行截图工具,在当前截图中退出但保留工具运行,并在需要截图时按 Control + Print Screen。这不应该干扰您正在尝试截图的任何内容。
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似乎更可靠。
CHOICE
和TIMEOUT
无法工作。在构建机器上忘记它们。如果您的网络连接失败,则PING 1.1.1.1
无法工作。在这里寻找W32TM
、TypePerf
和一些PowerShell。或者创建您自己的.NET可执行文件。 - it3xl还有两种方法适用于从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);"
TypePerf
和 TYPEPERF
命令可以正常工作。 - it3xlBEST>@echo done
BEST>@set DelayInSeconds=10
BEST>@rem Use ping to wait
BEST>@ping 192.0.2.0 -n 1 -w %DelayInSeconds%000 > nul
echo done语句可以让我看到脚本何时结束,并且ping命令提供了延迟时间。额外的 @ 符号意味着我可以看到 “done” 文本,而等待过程不会分散我的注意力。
我已经在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 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 192.0.2.0 -n 5 -w 5000
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
你可以使用 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
这是用户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 XP功能的以下方法在批处理文件中进行延迟:
@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
通过批处理文件中的两行简单代码就可以实现:在%temp%
文件夹中编写一个临时的.vbs
文件并调用它:
echo WScript.Sleep(5000) >"%temp%\sleep.vbs"
cscript "%temp%\sleep.vbs"
TIMEOUT
。参考文献:SS64,Rob van der Woude。 - Gras Doublepowershell Start-Sleep -m 50
。 - Pavel Ptimeout /t 5 /nobreak >nul
。它会等待5秒钟,然后静默结束,不会有任何输出。 - user9556248node -e 'setTimeout(a => a, 5000)'
来玩一下。它适用于Mac上的Node v12.14.0,可能在Windows上也适用。 - nonopolarity