我玩的游戏受到崩溃问题的困扰,这些问题本质上是非本地的,并且无法在我这边修复。我正在努力让它更容易处理。我运行游戏的多个实例,当一个实例崩溃时,我必须找出哪些实例仍在运行,以便从尚未运行的路径打开适当的可执行文件。我从其他堆栈交换文章中拼凑了这段代码,这些代码正确地输出了正在运行的进程和路径,但我在用它做任何事情时都遇到了麻烦。
SETLOCAL EnableExtensions
set EXE=DiabloImmortal.exe
FOR /F %%x IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF %%x == %EXE% goto ProcessFound
goto ProcessNotFound
:ProcessFound
wmic process where "name='%EXE%'" get ProcessID, ExecutablePath
goto END
:ProcessNotFound
echo %EXE% is not running
goto END
:END
echo Finished!
pause
这就是输出的样子...
ExecutablePath ProcessId
C:\Program Files (x86)\Diablo Immortal1\Engine\Binaries\Win64\DiabloImmortal.exe 16464
C:\Program Files (x86)\Diablo Immortal2\Engine\Binaries\Win64\DiabloImmortal.exe 15612
我有 4 个目录,名称类似,但编号为 1-4,数字是目录路径的最后一个字符。
C:\Program Files (x86)\Diablo Immortal1
C:\Program Files (x86)\Diablo Immortal2
C:\Program Files (x86)\Diablo Immortal3
C:\Program Files (x86)\Diablo Immortal4
所以我需要它做的是..有了这个给定的输出,它应该注意到#3没有运行并启动这个程序。
C:\Program Files (x86)\Diablo Immortal3\Diablo Immortal Launcher.exe
我不希望它立即启动所有缺少的实例,因为每个实例必须完全登录才能启动另一个实例。所以我会根据需要多次运行批处理文件...
我尝试使用 FOR 循环,但我的批处理脚本充其量是生疏的,而且我一开始就不太熟悉它。我觉得最好的方法是循环或 switch 风格的语句与正则表达式组合,这对我来说也很麻烦!
我知道与游戏相关的这一点对于大多数观看它的人来说并不是非常重要。我工作,和很多人一样有两个孩子,这是我的一个小缺点,但最近它变得不可能享受这个结果。感谢您的宝贵时间以及您可能添加的任何贡献,我非常感激!
未经测试
@echo off
set "EXE=DiabloImmortal.exe"
:loop
for %%i in (1,2,3,4) do (
wmic process where "name='%EXE%'" get ExecutablePath /format:csv|find "Diablo Immortal%%i" >nul || (
echo %%i not running - restarting...
ECHO "C:\Program Files (x86)\Diablo Immortal%%i\Engine\Binaries\Win64\DiabloImmortal.exe"
REM
)
)
timeout 2 >nul
goto :loop
我通过
ECHO
禁用了错过的实例的执行。在删除大写字母ECHO
以启动 EXE 之前尝试一下它是否按预期工作。
基本上,这会检查 4 个实例中的每一个实例是否正在运行程序,如果缺少则启动它。
根据您的需要调整
timeout
(不过,请务必保留它;否则,脚本将尽可能快地运行,给您的 CPU 带来不必要的负载)。最小值为 1(一秒),但设置得尽可能高(也许每 5 分钟(300 秒)检查一次就足以满足您的需求)
如果您需要在实例启动之间延迟(如果由于某种原因缺少多个实例),请在循环内执行另一个
timeout
(我放置 REM
的位置)。