Windows批处理:模拟“超时”命令

我试图找出如何限制一个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 ( 

但选择带来了它自己的一套限制表。 首先,如果一个不属于它的选项(在这种情况下sk )的键被按下,它将停止倒计时,基本上锁定直到做出正确的选择。 其次, 空格键不可能是一个选择。