我有一个X.exe
程序,大约需要2-6个小时才能完成。确切时间未知,但我想实现 6.5 或 7 小时的阈值。如果此程序在此时间内未返回任何值,则它将被终止。如何使用批处理*.bat
文件实现此目的?
这是我到目前为止所拥有的:一个计时器bat1.bat
和一个实际的bat2.bat
.
蝙蝠1.bat:
start cmd /C bat2.bat & timeout /t 25200 & taskkill /im X.exe /f
蝙蝠2.bat:
cd blah
bat1.bat
这种方法的问题在于,只有在 25200 秒(或 7 小时)之后,计时器才会停止,并且不会在该限制之前终止。我如何告诉计算机,如果程序X.exe
完成,那么不要再等待了?
任何帮助不胜感激!
我认为这是一个更简单的解决方案:
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
命令的等待状态。
编辑:添加了一些解释
请注意,带有 timeout
命令的"WaitingToKill"cmd.exe 进程和 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 进程都结束。
@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
长一点,具体取决于检查频率)
我已经尝试了各种解决方案,但最终这在批处理中真的很麻烦。如果您愿意使用外部工具,最简单的方法是
"C:Program FilesGitusrbintimeout.exe" 5 .test.exe
正确返回测试进程的退出代码,如果您同时生成多个测试进程并且不会一直弹出窗口,它也可以工作。