Windows 批处理-如何将程序状态存储在变量中?

Windows 批处理-如何将程序状态存储在变量中?,windows,batch-file,taskkill,Windows,Batch File,Taskkill,我主要想写一个脚本,如果程序变得“没有响应”,它可以帮助程序重新启动。然后,我想用时间将其记录到一个简单的文本文件中,以便稍后检查它需要重新启动的频率,但是如何正确地检查状态并将其存储在一个变量中,以便脚本决定是否重新启动或忽略它(否则它将无法运行或运行正常) 我发现我可以做一些像 taskkill /im "myProgram.exe" /fi "STATUS eq NOT RESPONDING" /f >nul && start

我主要想写一个脚本,如果程序变得“没有响应”,它可以帮助程序重新启动。然后,我想用时间将其记录到一个简单的文本文件中,以便稍后检查它需要重新启动的频率,但是如何正确地检查状态并将其存储在一个变量中,以便脚本决定是否重新启动或忽略它(否则它将无法运行或运行正常)

我发现我可以做一些像

taskkill /im "myProgram.exe" /fi "STATUS eq NOT RESPONDING" /f >nul && start "" "C:\Program Files (x86)\myProgram\myProgram.exe"
这是我从

这很好,让我有了一部分的进展,但当我在日志中添加要写入的内容时,我发现它似乎无论如何都会写入日志,而不仅仅是在状态为“无响应”的情况下。如果我想用if/else语句处理它,它也没有给我提供太多的灵活性

这是我用附加位尝试的

taskkill /im "myProgram.exe" /fi "STATUS eq NOT RESPONDING" /f >nul && SET message=%time% %date% - myProgram is was not running so restarted it && ECHO %message% >> myProgram_restart_LOG.txt && START "" "C:\Program Files (x86)\myProgram\myProgram.exe"

(我猜,
&&
不是以链中的前一条语句成功为条件的,但无论如何都会执行?

&&
是有条件的。问题是您正在设置一个变量并试图直接访问它。因此,您可以调用echo来访问Variable:

taskkill /im "myProgram.exe" /fi "STATUS eq NOT RESPONDING" /f >nul && SET message=%time% %date% - myProgram is was not running so restarted it && call ECHO %message% >> myProgram_restart_LOG.txt & START "" "C:\Program Files (x86)\myProgram\myProgram.exe"
或者,直接将消息回显到日志文件

taskkill /im "myProgram.exe" /fi "STATUS eq NOT RESPONDING" /f >nul && SET echo %time% %date% - myProgram is was not running so restarted it >> myProgram_restart_LOG.txt & START "" "C:\Program Files (x86)\myProgram\myProgram.exe"
但我不确定您为什么要在批处理文件中链接,因此我会:

taskkill /im "myProgram.exe" /fi "STATUS eq NOT RESPONDING" /f >nul
if errorlevel 0 (
    echo %time% %date% - myProgram is was not running so restarted it>> myProgram_restart_LOG.txt
    START "" "C:\Program Files (x86)\myProgram\myProgram.exe"
)

&&
是有条件的。问题是您正在设置一个变量并试图直接访问它。因此,您可以调用echo来访问Variable:

taskkill /im "myProgram.exe" /fi "STATUS eq NOT RESPONDING" /f >nul && SET message=%time% %date% - myProgram is was not running so restarted it && call ECHO %message% >> myProgram_restart_LOG.txt & START "" "C:\Program Files (x86)\myProgram\myProgram.exe"
或者,直接将消息回显到日志文件

taskkill /im "myProgram.exe" /fi "STATUS eq NOT RESPONDING" /f >nul && SET echo %time% %date% - myProgram is was not running so restarted it >> myProgram_restart_LOG.txt & START "" "C:\Program Files (x86)\myProgram\myProgram.exe"
但我不确定您为什么要在批处理文件中链接,因此我会:

taskkill /im "myProgram.exe" /fi "STATUS eq NOT RESPONDING" /f >nul
if errorlevel 0 (
    echo %time% %date% - myProgram is was not running so restarted it>> myProgram_restart_LOG.txt
    START "" "C:\Program Files (x86)\myProgram\myProgram.exe"
)

您的条件命令
&
仅对命令的结果是必需的,对于其他命令,您只需连接到一行,因此这些命令需要
&
。然后,您需要做的就是将条件命令插入括号中以保持在一起。例如,
“%\uuuuu APPDIR\uuuuu%taskkill.exe”/im“myProgram.exe”/fi“状态eq未响应”/f>NUL 2>&1&((Echo%TIME%%DATE%)1>“myProgram\u restart\u LOG.txt”&Start”“%ProgramFiles(x86)%\myProgram\myProgram.exe”)
,Gerhard的解决方案的一个很好的替代方案您的条件命令
&
仅对命令的结果是必需的,对于其他命令,您只需连接到一行,因此这些命令需要
&
。然后,您需要做的就是将条件命令插入括号中以保持在一起。例如,
“%\uuuuuu APPDIR\uuuuu%taskkill.exe”/im“myProgram.exe”/fi“STATUS eq NOT response”/f>NUL 2>&1&((Echo%TIME%%DATE%)1>“myProgram\u restart\u LOG.txt”&Start“”%ProgramFiles(x86)%\myProgram\myProgram.exe”)
感谢COMO,这是Gerhard解决方案的一个很好的替代方案