我正在尝试找出如何限制Windows批处理文件中的程序执行时间。有类似 Unix timeout
命令之类的东西吗?
请指教。
start yourprogram.exe
timeout /t 10
taskkill /im yourprogram.exe /f
启动
yourprogram.exe
,等待 10 秒,然后终止程序。
并使用发行版中的 unix 风格 timeout
命令。
要增加此时间,请更改
WaitForMinutes
的值。
要缩短检查之间的间隔,请将
WaitForSeconds
设置为您希望其等待的秒数。
@echo off
set ProgramName=calc.exe
set EndInHours=2
:: How Many Minutes in between each check to see if %ProgramName% is Running
:: To change it to seconds, just set %WaitForSeconds% Manually
set WaitForMinutes=1
set /a WaitForSeconds=%WaitForMinutes%*60
:: How many times to loop
set /a MaxLoop=(%EndInHours%*60*60) / (%WaitForMinutes%*60)
REM Use a VBScript popup window asking to terminate %ProgramName%
echo set WshShell = WScript.CreateObject("WScript.Shell") > %tmp%\tmp.vbs
echo Wscript.Quit (WshShell.Popup( "Click 'OK' to terminate %ProgramName%." ,10 ,"Terminate %ProgramName%", 0)) >> %tmp%\tmp.vbs
start %ProgramName%
set running=True
:: Give time for %ProgramName% to launch.
timeout /t 5 /nobreak > nul
setlocal enabledelayedexpansion
for /l %%x in (1,1,%MaxLoop%) do (
if "!running!"=="True" for /l %%y in (1,1,%WaitForMinutes%) do (
if "!running!"=="True" (
set running=False
REM call Pop-Up
cscript /nologo %tmp%\tmp.vbs
if !errorlevel!==-1 (
for /f "skip=3" %%x in ('tasklist /fi "IMAGENAME EQ %ProgramName%"') do set running=True
) else (
taskkill /im %ProgramName%
)
)
)
)
if exist %tmp%\tmp.vbs del %tmp%\tmp.vbs
这段代码使用VBScript制作一个弹出框。单击
OK
将导致 %ProgramName% 通过
taskkill
被杀死。如果您不想使用弹出窗口,可以通过删除...来使用
timeout
REM Use a VBScript popup window asking to terminate %ProgramName%
echo set WshShell = WScript.CreateObject("WScript.Shell") > %tmp%\tmp.vbs
echo Wscript.Quit (WshShell.Popup( "Click 'OK' to terminate %ProgramName%." ,10 ,"Terminate %ProgramName%", 0)) >> %tmp%\tmp.vbs
...并替换这个...
REM call Pop-Up
cscript /nologo %tmp%\tmp.vbs
if !errorlevel!==-1 (
...用这个:
REM Use CTRL+C to kill %ProgramName%
timeout /t %WaitForSeconds% /nobreak
if !errorlevel!==0 (
使用
/nobreak
是必要的,因为
timeout
不区分按键或超时。这将允许您通过按 CTRL+C 来终止 %ProgramName%,但这会导致您的批处理文件在您这样做时询问
Terminate batch job (Y/N)?
。草率/凌乱/令人讨厌的恕我直言。您可以使用
CHOICE
,将上述代码替换为:
REM Using choice, but choice can get stuck with a wrong keystroke
Echo [K]ill %ProgramName% or [S]imulate %WaitForSeconds% Seconds
Choice /n /c sk /t %WaitForSeconds% /d s
if !errorlevel!==1 (
但是选择也有其自身的局限性。一方面,如果按下了不在其选择范围内的键(在本例中为
s
和
k
),它将停止倒计时,基本上会锁定,直到做出正确的选择。其次,空格键不能成为一个选择。
https://github.com/rmyorston/busybox-w32) 以及命令 busybox timeout 10 yourprogram.exe
。