【问题标题】:Automatic restart of non responding program via CMD通过 CMD 自动重启无响应的程序
【发布时间】:2017-11-02 09:11:08
【问题描述】:

我正在尝试制作一个批处理文件,如果它停止响应,它会自动重新启动我的应用程序。

但是我的程序有问题。成功杀死无响应的任务后,它无法再次启动它。问题可能出在哪里?

我对批处理文件比较缺乏经验,所以谢谢你的帮助。

@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 文件的文件夹并将批处理文件移动到启动文件夹。

【问题讨论】:

  • 请使用search 工具在SO 上查找关于delayed expansion 的条目。问题是%errorlevel% 没有特殊状态,也不能免除解析规则。您可能可以在代码中使用if [not] errorlevel n,如果动态设置的errorlevel [not] n ** 或大于** n,则将执行true 代码

标签: windows batch-file cmd


【解决方案1】:

您的代码有两个问题。正如 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% 是否是您想要的值和进度,您可以检查它是否不是您想要的值,在这种情况下重新启动循环。

【讨论】:

  • 感谢您的解释和调整,但不幸的是程序仍然无法打开。我有一个猜测,为什么还有一个方程?启动“”“infinite_loop.exe”
  • 哈利路亚,该程序功能齐全,我刚刚在上次查找之前添加,我试图启动程序“ttasklist /fi”STATUS eq NOT RESPONDING“> D:\tasklist.txt”并且它正在工作!非常感谢。 :)
  • 很高兴,如果您愿意将我的回答标记为正确,我将不胜感激。至于第一个引号的作用,它指定程序运行时的标题,只有在运行控制台应用程序时才会真正使用。
  • @J.Chudej 确保您更新我的代码,我在 find /C "infinite_loop.exe" D:\tasklist.txt 之前添加了 tasklist > D:\tasklist.txt 按照您的原始代码(我的错)
  • 是的,我输入它作为评论,我将任务列表添加到文件中,它可以工作。我只是添加exe。文件目录和制作日志,在程序重新启动时将时间、日期和字符串写入文本文件。 :) 感谢您的帮助,您的答案被标记为正确。 :)
【解决方案2】:

我不确定 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

【讨论】:

  • 请注意,您还没有添加代码来实际启动程序。它应该添加到您 echo !ERRORLEVEL! 的 if 语句中
  • 这是我的错,我有 echo %errorlevel% 用于检查而不是 start x。原因是这个 if 语句没有完成的原因。 :)
  • 好的,这样会更好吗?我添加了 OP 也省略的内容。
猜你喜欢
  • 1970-01-01
  • 2014-01-24
  • 1970-01-01
  • 2010-11-25
  • 2015-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多