2012-09-12 181 views

回答

2

我剛剛安裝了Cygwin並使用了unix-style timeout命令。

0

我不認爲有超時命令。但是,您可以開始在後臺執行任務並在超時時間內使用ping(使用ping),然後終止任務。

+0

「* using ping *」是什麼意思? –

+0

http://stackoverflow.com/a/735294/390913 – perreal

4

要限制某個程序運行,你可以做這樣的事情

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

啓動yourprogram.exe,等待10秒時間,然後殺死該程序。

+1

這不是我想要的。Unix'timeout'命令允許限制程序/腳本/命令的執行時間。 –

+0

啊對了,對不起,我以前從未使用過Unix。我已經更新了我的答案,希望能回答你的問題。 –

+1

實際上程序執行可能需要10分鐘到3-4小時。我想限制這個時間到2小時。所以當應用程序在10分鐘內完成時,我不希望批量作業等待1小時50分鐘。有什麼建議麼? –

0

此代碼等待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%通過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)?。 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% /d s 
     if !errorlevel!==1 (

不過的選擇帶來了它自己的一套限制表中的。首先,如果一個不在其選項中的按鍵(在這種情況下爲sk)被按下,它將停止倒計時,基本上鎖定直到做出正確的選擇。其次,SPACEBAR不能作爲選擇。

+0

如果我使用不同的啓動和執行時間啓動多個實例,該怎麼辦? –