批量检测程序无响应

时间:2018-12-27 01:12:53

标签: batch-file

我正在尝试编写一个批处理脚本,以检测.exe是否没有响应,如果没有响应,它将运行一段代码将其杀死,然后还执行其他一些操作。我知道如何终止该进程并在没有响应的情况下重新启动它,但是除了将其转换为if语句或调用goto来重新启动之外,我不确定如何做。

taskkill /im "exeName.exe" /fi "STATUS eq NOT RESPONDING" /f >nul && start "" "pathToExe"

我遇到了其他与此类似的Stack Overflow帖子,但是它们仅检查流程的错误级别,并且不检查程序是否没有响应以及在此之后如何执行代码。

我将如何处理?预先感谢。

2 个答案:

答案 0 :(得分:0)

假设我正确地解释了您的问题,并且您想在不终止任务的情况下进行测试,那么呢:

tasklist /fi "status eq not responding" /nh | find "exeName.exe" >NUL
if %errorlevel% == 0 (
    echo Oops, we've hung...
)

tasklist采用与/fi status相同的taskkill选项,即使文档指出只允许RUNNING-Windows 8上的taskkill /?至少显示完整的选择。然后,我们使用find来检查可执行文件是否在没有响应的任务列表中。

顺便说一句,如果您想改用PowerShell

$foo = get-process exeName
if (!$foo.Responding) {
    echo "Oops, we've hung..."
}

答案 1 :(得分:0)

可以轻松完成:

taskkill /FI "STATUS eq NOT RESPONDING" /IM "yourexe.exe" /F | findstr /c:"SUCCESS" >nul
if %errorlevel% EQU 0 (echo Successfully detected and terminated "yourexe.exe" which didn't respond) else (echo Ooops! We didn't find or could not terminate process "yourexe.exe")

如果您只是想检测过程是否没有响应,请使用tasklist

tasklist /FI "STATUS eq NOT RESPONDING" | findstr /c:"yourexe.exe">nul
if %errorlevel% EQU 0 (echo We have detected that process with image name "yourexe.exe" is not responding.) else (echo We didn't found process with image name "yourexe.exe" because it doesn't exist.)

在两种情况下,我们都使用findstr命令,因为即使未找到/终止的进程taskkill / tasklist也会返回errorlevel 0