警告

警告

有时游戏没有响应,我必须进入任务管理器将其关闭,然后重新启动。这可能非常烦人且耗时。虽然我知道如何taskkill通过批处理文件使用和启动应用程序,但我不知道如何测试应用程序是否没有响应。我也不知道让它在后台运行而不占用太多资源的正确方法。如何对特定可执行文件或任何进程执行此操作?

答案1

警告

从技术上来说这是可行的,但由于以下原因,这可能不是一个明智的想法:

  1. 有时,当有大量数据需要处理时,进程会停止响应,并且可能过一会儿就会恢复。
  2. 终止一个进程而不给它恢复的机会可能会导致数据丢失或其他问题。

脚本

话虽如此,我认为以下批处理文件可能适用于非常简单的情况。它允许您等待一段时间再终止应用程序。

@ECHO off

SET _AppLocation=C:\Path\To\Exe
SET _Application=EXCEL.EXE
SET _Parameters=
SET _Delay=5

:Start
SET _NotResponding=FALSE
SET _PID=FALSE
FOR /F "tokens=1,2 delims=," %%a IN ('tasklist /fi "STATUS eq NOT RESPONDING" /fi "IMAGENAME eq %_Application%" /NH /FO CSV ^| FIND "%_Application%"') DO SET _NotResponding=TRUE & SET _PID=%%~b
IF %_NotResponding%==TRUE (
    ECHO %_Application% ^(%_PID%^) is not responding. Waiting %_Delay% seconds...
    TIMEOUT /T %_Delay%
    ECHO Killing and restarting...
    FOR /F %%a IN ('tasklist /fi "STATUS eq NOT RESPONDING" /fi "PID eq %_PID%" /NH /FO CSV') DO TASKKILL /F /fi "PID eq %_PID%"
    %_AppLocation%\%_Application% %_Parameters%
)
TIMEOUT /T 1 >nul
GOTO:Start

解释

  • 配置:

    • _Applocation是应用程序的完整目录路径。您无法通过命令获取此信息TASKLIST,但这是重新启动应用程序所必需的。
    • _Application是完整的文件名,包括扩展名。
    • _Parameters是启动应用程序所需的所有参数。您无法从命令中获取此参数TASKLIST,但这是重新启动应用程序所必需的。
    • _Delay指定等待应用程序恢复的秒数。
  • 循环:

    • :Start为我们正在创建的无限循环设置一个起点。

    • SET _NotResponding=FALSESET _PID=FALSE用于存储我们需要等待一段时间以便应用程序恢复的信息。

    • tasklist /fi "STATUS eq NOT RESPONDING" /fi "IMAGENAME eq %_Application%" /NH /FO CSV ^| FIND "%_Application%"如果应用程序没有响应,则会返回一些有关应用程序的信息。(如果您想在循环外使用它FOR,请删除该^字符。)

      如果应用程序没有运行或者正在运行并响应,则不会返回任何内容,因此 for 循环将没有任何内容可处理并将退出。

    • FOR /F "tokens=1,2 delims=," %%a IN ('...') DO将处理函数输出的每一行TASKLIST,但只存储最后一行以供以后处理。如果您正在运行同一应用程序的多个实例,并且它们都停止响应,则此方法只会处理其中一个。

    • SET _NotResponding=TRUE & SET _PID=%%~b将存储进程 ID,并让脚本的下一部分知道运行。

    • IF %_NotResponding%==TRUE()仅当应用程序有无响应实例时才会运行括号内的代码。TIMEOUT /T %_Delay%将等待指定的秒数,然后才判定应用程序不可恢复。

    • tasklist /fi "STATUS eq NOT RESPONDING" /fi "PID eq %_PID%" /NH /FO CSV将检查该进程 ID 是否仍然没有响应。

    • TASKKILL /F /fi "PID eq %_PID%"如果仍然没有响应,将会强制终止该进程。

    • %_AppLocation%\%_Application% %_Parameters%将重新启动该应用程序。

    • TIMEOUT /T 1将等待一会儿,以便该批处理文件不会不断地检查。

    • GOTO:Start将返回到循环的开始并再次执行所有这些步骤。

要退出此无限循环,您需要关闭运行脚本的控制台或按Ctrl+C

进一步阅读

相关内容