首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >进程结束时超时或关闭

进程结束时超时或关闭
EN

Stack Overflow用户
提问于 2017-10-21 00:27:10
回答 3查看 3.2K关注 0票数 1

我有一个X.exe程序,大约需要2-6小时才能完成.确切的时间是未知的,但我想实现6.5或7个小时的阈值。如果此程序在此时间内不返回任何值,它将被终止。如何使用批处理*.bat文件实现此操作?

下面是我到目前为止拥有的内容:一个定时器bat1.bat和一个实际的bat2.bat

批1.bat:

代码语言:javascript
复制
start cmd /C bat2.bat & timeout /t 25200 & taskkill /im X.exe /f

批2.bat:

代码语言:javascript
复制
cd blah
bat1.bat

这种方法的问题是,只有在25200秒(或7小时)之后,计时器才会停止,并且它不会在该限制之前终止。我如何告诉计算机,如果程序X.exe已经完成,那么就不要再等待了?

任何帮助都是非常感谢的!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-10-22 04:54:55

多亏了@Squashman,我才能自己构建一个脚本。看上去很好

代码语言:javascript
复制
@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长一点,这取决于它检查的频率)

票数 0
EN

Stack Overflow用户

发布于 2017-10-23 14:15:29

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

代码语言:javascript
复制
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进程都结束了。

票数 3
EN

Stack Overflow用户

发布于 2018-02-27 11:26:12

我尝试过各种解决方案,但最终这真的是一批麻烦的解决方案。如果您愿意使用外部工具,最简单的方法是

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

它正确地返回测试过程的退出代码,如果您同时生成多个测试进程,并且不总是弹出窗口,它也可以工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46858942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档