![警告](https://linux22.com/image/1590131/%E8%AD%A6%E5%91%8A.png)
有时游戏没有响应,我必须进入任务管理器将其关闭,然后重新启动。这可能非常烦人且耗时。虽然我知道如何taskkill
通过批处理文件使用和启动应用程序,但我不知道如何测试应用程序是否没有响应。我也不知道让它在后台运行而不占用太多资源的正确方法。如何对特定可执行文件或任何进程执行此操作?
答案1
警告
从技术上来说这是可行的,但由于以下原因,这可能不是一个明智的想法:
- 有时,当有大量数据需要处理时,进程会停止响应,并且可能过一会儿就会恢复。
- 终止一个进程而不给它恢复的机会可能会导致数据丢失或其他问题。
脚本
话虽如此,我认为以下批处理文件可能适用于非常简单的情况。它允许您等待一段时间再终止应用程序。
@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=FALSE
并SET _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