我试图找出如何限制一个Windowsbatch file中的程序执行时间。 有没有像Unix timeout
命令? 请指教。
为了限制一个程序运行的时间,你可以这样做
start yourprogram.exe timeout /t 10 taskkill /im yourprogram.exe /f
启动你的程序,等待10秒,然后杀死程序。
我刚刚安装了Cygwin,并使用分发的unix-style timeout
命令。
我不认为有超时命令。 但是,您可以开始在后台执行任务,并在超时时间内使用ping(使用ping),然后终止任务。
此代码等待60秒,然后检查%ProgramName%是否正在运行。
为了增加这个时间,改变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%通过任务kill被杀死。
如果你不想使用弹出窗口,你可以使用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)?
否Terminate batch job (Y/N)?
当你这样做。 Sl / /凌乱/讨厌恕我直言。
你可以改为使用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% /ds if !errorlevel!==1 (
但选择带来了它自己的一套限制表。 首先,如果一个不属于它的选项(在这种情况下s
和k
)的键被按下,它将停止倒计时,基本上锁定直到做出正确的选择。 其次, 空格键不可能是一个选择。