Windows 批处理:类似于“timeout”命令

问题描述 投票:0回答:5

我正在尝试找出如何限制Windows批处理文件中的程序执行时间。有类似 Unix timeout 命令之类的东西吗? 请指教。

    

windows shell batch-file
5个回答
4
投票

start yourprogram.exe timeout /t 10 taskkill /im yourprogram.exe /f

启动 
yourprogram.exe

,等待 10 秒,然后终止程序。

    


2
投票
Cygwin

并使用发行版中的 unix 风格 timeout 命令。

    


0
投票


0
投票

要增加此时间,请更改

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
),它将停止倒计时,基本上会锁定,直到做出正确的选择。其次,
空格键
不能成为一个选择。


0
投票
© www.soinside.com 2019 - 2024. All rights reserved.