我试图创建一个批处理文件,如果它停止响应,会自动重启我的应用程序。
但是我在程序中遇到了问题。成功终止未响应的任务后,它无法再次启动它。问题出在哪里?
我对批处理文件相对缺乏经验,所以感谢您的帮助。
@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文件的文件夹,并将批处理文件移动到启动文件夹。
答案 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