超时或closures时,处理完成

我有一个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已经完成,那么不要再等待了?

任何帮助表示赞赏!

我认为这是一个更简单的解决方案:

 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命令的等待状态。

编辑一些解释添加

请注意,“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进程都结束。

感谢@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.很难批量比较数值变量(比较diff和0)2.第一次终止elaspedtime > killtime (可能比killtime长一些,取决于它检查的频率)