2017-10-21 170 views
1

我有一個X.exe程序需要大約2-6小時才能完成。確切的時間是未知的,但我想實現一個6.5或7小時的門檻。如果這個程序在這段時間內沒有返回任何值,它將被殺死。我如何使用批次*.bat文件實現此目的?超時或關閉過程完成

這是我到目前爲止:計時器bat1.bat和實際bat2.bat

bat1.bat:

start cmd /C bat2.bat & timeout /t 25200 & taskkill /im X.exe /f 

bat2.bat:

cd blah 
bat1.bat 

這種方法的問題是,只有後25200秒(或7小時),定時器將被停止,並且它在該限制之前不會被終止。如何告訴計算機,如果程序X.exe已完成,那麼不要再等待了?

任何幫助表示讚賞!

+1

如果將它設置爲以計劃任務運行,則可以告訴它在8小時後停止任務。不幸的是,您在任務調度程序中唯一的選項是1,2,4,8或12小時。你可以做的是使用'TASKLIST'命令來檢查程序是否每300秒運行一次。如果它沒有運行,那麼bat文件可以退出。如果它仍在運行,請檢查目前爲止運行了多少秒,如果它是25,200秒,請將其關閉。 – Squashman

+0

@Squashman感謝你的想法和命令。我有一個簡單的腳本'tasklist/fi「imagename eq X.exe」',但是如何返回'X.exe'運行的時間量?你能提供一個正式的答案,以便我也可以接受嗎?謝謝!!! – kensaii

+1

設置三個變量。 %checktime%%elapsedtime%和%killtime%。使用帶TIMEOUT命令的%checktime%變量。然後使用'TASKLIST'命令查看進程是否正在運行。如果正在運行,則將%checktime%添加到%elapsedtime%。然後檢查%elapsedtime%是否大於或等於%killtime%。如果kill time條件沒有被滿足,那麼在'TIMEOUT'命令之前使用'GOTO'命令循環回標籤。如果殺死時間條件已滿足,則使用'TASKKILL'命令停止該進程。 – Squashman

回答

0

感謝@Squashman我能夠自己創建一個腳本。似乎做工精細

@echo off 
setlocal enableextensions enabledelayedexpansion 
set /a "checktime=60" 
set /a "elapsedtime=0" 
set /a "killtime=150" 
set XProg=X.exe 
start cmd /C runTest.bat 
timeout /t 10 
:while1 
    echo Go to WHILE loop. 
    echo elapsedtime = %elapsedtime% 
    echo killtime = %killtime% 
    set /a "timeleft = %killtime% - %elapsedtime%" 
    echo timeleft = %timeleft% 
    if /i %timeleft% geq 0 (
     tasklist /fi "imagename eq %XProg%" 2>NUL | find /i /n "%XProg%">NUL 
     if "%ERRORLEVEL%"=="0" (
      echo %XProg% is still running... 
     ) else (
      echo %XProg% is finished before timer. 
     ) 
     set /a "elapsedtime = elapsedtime + checktime" 
     timeout /t %checktime% 
     goto :while1 
    ) else (
     taskkill /im %XProg% /f 
     echo %XProg% is terminated. 
    ) 

經驗教訓: 1.很難數值變量批量比較依賴(比較差異有0代替) 2.終止首次elaspedtime > killtime(可能有點超過killtime多久它檢查)

0

我認爲這是一個更簡單的解決方案:

rem Start the process that will kill the X.exe program after 7 hours 
start "WaitingToKill" cmd /C timeout /t 25200 ^& taskkill /im X.exe /f 

rem Run the X.exe program and wait for it to terminate 
X.exe 

rem Kill the killer process and terminate 
taskkill /fi "WINDOWTITLE eq WaitingToKill" /f 

在該方法中沒有在同一時間運行任何額外的代碼;只是等待狀態timeout命令。

EDIT幾點說明加入

注意的是, 「WaitingToKill」 cmd.exe的與timeout命令處理和X.exe程序並行運行。如果timeout命令在7小時後結束,則執行taskkill /im X.exe /f命令,X.exe程序被終止並且兩個cmd.exe進程都結束。

如果X.exe程序在7小時前結束,批處理文件像往常一樣執行下一行。該行爲taskkill /fi "WINDOWTITLE eq WaitingToKill" /f,因此帶有timeout命令的窗口被終止,並且兩個cmd.exe進程都結束。

+0

感謝您的回答,但這就是爲什麼提出問題的原因:'X.exe'有時在計時器之前完成,因此我想定期檢查程序是否仍在運行。你提出的答案几乎與我以前的解決方案相同。我在哪裏錯了? – kensaii

+0

您不需要定期檢查任何內容:兩個進程必須在另一個進程結束時結束,因此只需要等待一個進程結束並在此時終止其他進程。看到我的編輯... – Aacini

+0

更清楚:什麼時候殺死'X.exe'程序?當'timeout'命令結束時。當kill'timeout'命令時?當X.exe程序結束時(除非我誤解了你的需求**':/'**)... – Aacini

0

我已經嘗試了各種解決方案,但最終批量真的很麻煩。 如果你願意使用外部工具最簡單的方法是

"C:\Program Files\Git\usr\bin\timeout.exe" 5 .\test.exe

它正確地返回測試過程的退出代碼,如果同時產生多個測試過程也適用,並且不彈出窗口的所有時間。

相關問題