通过CMD自动重启非响应程序

时间:2017-11-02 09:11:09

标签: windows batch-file cmd

我试图创建一个批处理文件,如果它停止响应,会自动重启我的应用程序。

但是我在程序中遇到了问题。成功终止未响应的任务后,它无法再次启动它。问题出在哪里?

我对批处理文件相对缺乏经验,所以感谢您的帮助。

@echo off
:start
tasklist /fi "STATUS eq NOT RESPONDING" > D:\tasklist.txt
find /C "infinite_loop.exe"  D:\tasklist.txt
if %errorlevel% equ 0 (
    timeout 10
    tasklist /fi "STATUS eq NOT RESPONDING" > D:\tasklist.txt
    find /C "infinite_loop.exe"  D:\tasklist.txt
    if %errorlevel% equ 0 (
        taskkill /im "infinite_loop.exe" /f
        timeout 10
        tasklist > D:\tasklist.txt
        find /C "infinite_loop.exe"  D:\tasklist.txt
        if %errorlevel% equ 1 (
            echo %errorlevel%
        )
    )
)
timeout 5
goto start

我使用无限循环程序进行测试。批处理文件和程序存储在同一个文件中,当我完成后,我将添加重定向到带有.exe文件的文件夹,并将批处理文件移动到启动文件夹。

2 个答案:

答案 0 :(得分:0)

您的代码存在两个问题。正如Magoo指出的那样,你的错误级别是嵌套的,这将阻止解析它们是实际的值。其次,当你关闭程序时,你不会再启动它。这是解决这两个问题的方法:

@echo off

:start 
timeout 5

tasklist /fi "STATUS eq NOT RESPONDING" > D:\tasklist.txt
find /C "infinite_loop.exe"  D:\tasklist.txt
if "%errorlevel%" neq "0" goto :start
:: else
timeout 10

tasklist /fi "STATUS eq NOT RESPONDING" > D:\tasklist.txt
find /C "infinite_loop.exe"  D:\tasklist.txt
if "%errorlevel%" neq "0" goto :start
:: else
taskkill /im "infinite_loop.exe" /f
timeout 10

tasklist > D:\tasklist.txt
find /C "infinite_loop.exe"  D:\tasklist.txt
if "%errorlevel%" neq "1" goto :start
:: else
Echo %errorlevel%
start "" "infinite_loop.exe"

goto :start

不是检查%errorlevel%是否是您想要的值和进度,而是检查它的不是您想要的值,并在这种情况下重新启动循环。

答案 1 :(得分:0)

我不确定Monacraft的回答。它似乎检查了太多次。对我来说,你的嵌套if结构更清晰。

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

:start
tasklist /fi "STATUS eq NOT RESPONDING" > D:\tasklist.txt
find /C "infinite_loop.exe"  D:\tasklist.txt
if !ERRORLEVEL! equ 0 (
    timeout 10
    tasklist /fi "STATUS eq NOT RESPONDING" > D:\tasklist.txt
    find /C "infinite_loop.exe"  D:\tasklist.txt
    if !ERRORLEVEL! equ 0 (
        taskkill /im "infinite_loop.exe" /f
        timeout 10
        tasklist > D:\tasklist.txt
        find /C "infinite_loop.exe"  D:\tasklist.txt
        if !ERRORLEVEL! equ 1 (
            echo !ERRORLEVEL!
            start "" "infinite_loop.exe"
        )
    )
)
timeout 5
goto start