在 bat 文件中的给定时间后结束命令



我有一个bat文件来执行多个程序,并且有一个程序可能会停留在循环中。我想在 1 分钟后终止该程序的执行并执行下一个程序。

我想执行的程序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

我的想法类似于Geisterfurz007。 但是我的批处理并行启动 exe,并且还有批处理的另一个实例,其启动的 exe 的名称作为参数。新实例检查 arg 并跳转到 sub,在那里它等待超时并尝试杀死 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
start "Title goes here" gif_0.exe input1.txt output1_0.txt
timeout /t 60 /nobreak>nul
taskkill /F /IM gif_0.exe

应该做这个伎俩。在需要后重复。

解释:

start具有给定参数的应用程序等待
60 秒,没有在倒计时前停止计时器的选项,也没有任何输出。
使用应用程序的映像名称终止任务。如果你可能有几个这个平行运行的实例,这将杀死所有这些实例!
不过,您可以使用过滤器来缩小范围;看看taskkill /?

我不确定您的问题中是否有拼写错误,但假设您的应用程序与参数gif_n.exeinputn+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 到 n,并将在循环中执行与上述相同的操作。

这里有 2 个补充:

需要行setlocal EnableDelayedExpansion来激活在括号的封闭块(如 for 循环或 if 条件)内更改变量值后使用变量值的可能性。

set /a foo=%%n+1会将变量foo的值设置为%%n+1的值。需要开关/a来执行实际计算,而不是追加字符串。

要在 for 循环中使用变量,我们必须使用DelayedExpasion(见上文):

只需更改通常用于!%即可完成。

为了确保一切正常,您可能需要在三条主线前面放置一个回声。

如果有什么不清楚的地方,请随时提问:)

最新更新