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也遗漏的内容。