Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 通过CMD自动重启无响应程序_Windows_Batch File_Cmd - Fatal编程技术网

Windows 通过CMD自动重启无响应程序

Windows 通过CMD自动重启无响应程序,windows,batch-file,cmd,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 (

我正在尝试创建一个批处理文件,如果应用程序停止响应,该文件将自动重新启动

但我在节目中遇到了一个问题。成功终止无响应任务后,无法再次启动该任务。问题出在哪里

我对批处理文件相对缺乏经验,因此感谢您的帮助

@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文件添加重定向到文件夹,并将批处理文件移动到启动文件夹。

您的代码有两个问题。正如Magoo指出的,您的errorlevel是嵌套的,这将阻止解析它们的实际值。其次,当您关闭程序时,您不会再次启动它。以下是解决这两个问题的方法:

@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%
是否是您想要的值,而是可以检查它是否不是您想要的值,在这种情况下,重新启动循环

我不确定莫纳克拉夫特的答案。它似乎检查了太多次。对我来说,你的嵌套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

请使用
搜索
功能查找SO上关于
延迟扩展的条目
。问题在于,
%errorlevel%
没有特殊状态,也不受解析规则的约束。如果动态设置的
errorlevel
为[not]
n
**或大于**
n
,您可能会在代码中使用
if[not]errorlevel n
,这将执行
true
代码。谢谢您的解释和调整,但不幸的是,程序仍然没有打开。我有一个等式,为什么还有一个等式?启动“”“infinite_loop.exe”Hallelujah,该程序功能齐全,我刚刚在上次查找之前添加了,我正在尝试启动程序“ttasklist/fi”STATUS eq NOT response“>D:\tasklist.txt”,它正在工作!泰铢:)很荣幸,如果您能将我的回答标记为正确,我将不胜感激。至于第一个引号的作用,它指定了程序运行时的标题,只有在运行控制台应用程序时才真正使用。@J.Chudej确保您更新了我的代码,我在
tasklist>D:\tasklist.txt
之前添加了
find/C“infinite_loop.exe”D:\tasklist.txt
,与您的原始代码一样(我的错)是的,我把它作为一个注释输入,我把任务列表添加到了文件中,它可以正常工作。我只是添加了exe。文件目录和生成日志,当程序重新启动时,将时间、日期和字符串写入文本文件。:)谢谢您的帮助,您的答案标记为正确。:)只是提醒一下,您还没有添加实际启动程序的代码。它应该添加到if语句中,在那里您可以
echo!错误等级这是我的错,我有echo%errorlevel%用于检查,而不是启动x。原因是该if语句不完整好的,这样会更好吗?我补充了OP也遗漏的内容。