2017-10-21 175 views
1

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

任何帮助表示赞赏!

+1

如果将它设置为以计划任务运行,则可以告诉它在8小时后停止任务。不幸的是,您在任务调度程序中唯一的选项是1,2,4,8或12小时。你可以做的是使用'TASKLIST'命令来检查程序是否每300秒运行一次。如果它没有运行,那么bat文件可以退出。如果它仍在运行,请检查目前为止运行了多少秒,如果它是25,200秒,请将其关闭。 – Squashman

+0

@Squashman感谢你的想法和命令。我有一个简单的脚本'tasklist/fi“imagename eq X.exe”',但是如何返回'X.exe'运行的时间量?你能提供一个正式的答案,以便我也可以接受吗?谢谢!!! – kensaii

+1

设置三个变量。 %checktime%%elapsedtime%和%killtime%。使用带TIMEOUT命令的%checktime%变量。然后使用'TASKLIST'命令查看进程是否正在运行。如果正在运行,则将%checktime%添加到%elapsedtime%。然后检查%elapsedtime%是否大于或等于%killtime%。如果kill time条件没有被满足,那么在'TIMEOUT'命令之前使用'GOTO'命令循环回标签。如果杀死时间条件已满足,则使用'TASKKILL'命令停止该进程。 – Squashman

回答

0

感谢@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多久它检查)

0

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

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命令。

EDIT几点说明加入

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

+0

感谢您的回答,但这就是为什么提出问题的原因:'X.exe'有时在计时器之前完成,因此我想定期检查程序是否仍在运行。你提出的答案几乎与我以前的解决方案相同。我在哪里错了? – kensaii

+0

您不需要定期检查任何内容:两个进程必须在另一个进程结束时结束,因此只需要等待一个进程结束并在此时终止其他进程。看到我的编辑... – Aacini

+0

更清楚:什么时候杀死'X.exe'程序?当'timeout'命令结束时。当kill'timeout'命令时?当X.exe程序结束时(除非我误解了你的需求**':/'**)... – Aacini

0

我已经尝试了各种解决方案,但最终批量真的很麻烦。 如果你愿意使用外部工具最简单的方法是

"C:\Program Files\Git\usr\bin\timeout.exe" 5 .\test.exe

它正确地返回测试过程的退出代码,如果同时产生多个测试过程也适用,并且不弹出窗口的所有时间。

相关问题