我有一个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已经完成,那么就不要再等待了?
任何帮助都是非常感谢的!
发布于 2017-10-22 04:54:55
多亏了@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长一点,这取决于它检查的频率)
发布于 2017-10-23 14:15:29
我认为这是一个简单得多的解决方案:
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”进程和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进程都结束了。
发布于 2018-02-27 11:26:12
我尝试过各种解决方案,但最终这真的是一批麻烦的解决方案。如果您愿意使用外部工具,最简单的方法是
"C:\Program Files\Git\usr\bin\timeout.exe" 5 .\test.exe
它正确地返回测试过程的退出代码,如果您同时生成多个测试进程,并且不总是弹出窗口,它也可以工作。
https://stackoverflow.com/questions/46858942
复制相似问题