2016-12-08 132 views
2

我有一個bat文件來執行多個程序,並且有可能一個程序停留在循環中。我想在1分鐘後終止執行該程序並執行下一個程序。在bat文件中給定時間後結束命令

我想執行的程序gif_0.exegif_1.exe,...從txt接收輸入並將輸出寫入另一個txt。

gif_0.exe input1.txt output1_0.txt 
timeout /t 20 
gif_0.exe input2.txt output2_0.txt 
timeout /t 20 
gif_1.exe input3.txt output3_0.txt 
timeout /t 20 
gif_2.exe input4.txt output4_0.txt 
timeout /t 20 
gif_3.exe input5.txt output5_0.txt 

回答

3

我的想法是類似Geisterfurz007。 但是我的批處理以並行方式啓動exe,也是批處理的另一個實例,其中啓動的exe的名稱爲arg。新實例檢查arg並跳轉到它等待超時的子並嘗試殺死該exe。

@echo off 
setlocal EnableDelayedExpansion 
Set Wait=60 
If "%1" Neq "" Goto :KillTask 
for /l %%n in (0, 1, n) do (
    set /a foo=%%n+1 
    start gif_%%n.exe input!foo!.txt output!foo!_0.txt 
    Start %~f0 gif_%%n.exe 
) 
Goto :Eof 
:KillTask %1 
timeout /t %Wait% /nobreak>nul 
taskkill /F /IM %1 
3
start "Title goes here" gif_0.exe input1.txt output1_0.txt 
timeout /t 60 /nobreak>nul 
taskkill /F /IM gif_0.exe 

應該做的伎倆。重複你的需求。

說明:

start s的給定參數
等待60秒內沒有選擇遞減計數之前,沒有任何輸出停止計時器應用程序。
用應用程序的imagename殺死任務。如果你可能有幾個平行運行的實例會殺死所有這些實例!
雖然您可以使用過濾器縮小一個;看看taskkill /?

我不知道是否有在你的問題一個錯字,但假設你的應用程序是gif_n.exe與參數inputn+1.exe outputn+1.exe 你可以做到以下幾點:

@echo off 
setlocal EnableDelayedExpansion 
for /l %%n in (0, 1, n) do (
    set /a foo=%%n+1 
    start gif_%%n.exe input!foo!.txt output!foo!_0.txt 
    timeout /t 60 /nobreak>nul 
    taskkill /F /IM gif_%%n.exe 
) 

這將去從0以單步執行,並在循環中執行與上面相同的操作。

2加法這裏:

setlocal EnableDelayedExpansion需要激活使用的變量的值的可能性,他們像括號的閉合塊內改變之後的for循環或如果條件。

set /a foo=%%n+1將變量foo的值設置爲值%%n+1。需要使用開關/a來執行實際計算,而不是附加字符串。

要使用的變量在我們的for循環,我們必須使用DelayedExpasion(見上文):

簡單地改變%你通常會使用!和你做。

爲了確保一切工作正常,您可能需要在三條主線之前放置回聲。

隨意提問,如果有任何不明白:)

+0

第一個代碼完成工作,因爲我的程序(gif。exe)沒有收到輸入,它只是啓動並等待輸入 – JTavares95

+0

不知道這是否是問題,但我現在添加了一個標題。這可能會解決問題,但我不確定...但我只是複製了其他問題:) – geisterfurz007