批处理脚本需求:检测未运行的Diablo Immortal实例并启动对应启动器
《Diablo Immortal》多实例崩溃自动补启批处理方案
我游玩《Diablo Immortal》时遇到非本地原因导致的崩溃问题,无法通过本地修复解决。我同时运行该游戏的4个实例,当其中某一实例崩溃后,需要自动识别仍在运行的实例,启动对应未运行实例的启动器。我自己拼凑的批处理脚本只能输出运行中的进程及路径,无法实现上述自动补启需求。
现有脚本
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个命名为Diablo Immortal1至Diablo Immortal4的目录,需要脚本检测到未运行的实例(如示例中的3号)时,启动对应目录下的Diablo Immortal Launcher.exe,且每次仅启动一个未运行的实例。
解决方案脚本
@echo off SETLOCAL EnableExtensions EnableDelayedExpansion :: 定义游戏主程序和启动器名称 set "EXE=DiabloImmortal.exe" set "LAUNCHER=Diablo Immortal Launcher.exe" :: 游戏目录的基础路径 set "BASE_PATH=C:\Program Files (x86)" :: 实例总数 set "TOTAL_INSTANCES=4" :: 初始化已运行实例标记:0=未运行,1=已运行 for /L %%i in (1,1,%TOTAL_INSTANCES%) do set "RUNNING_%%i=0" :: 遍历所有运行中的游戏进程,标记已运行的实例 for /F "skip=1 tokens=*" %%p in ('wmic process where "name='%EXE%'" get ExecutablePath /value') do ( set "PATH_LINE=%%p" :: 从路径中提取实例编号 echo !PATH_LINE! | findstr /C:"Diablo Immortal" >nul if not errorlevel 1 ( for /F "tokens=3 delims= " %%n in ("!PATH_LINE!") do ( set "INSTANCE_NUM=%%n" set "INSTANCE_NUM=!INSTANCE_NUM:\=!" set "RUNNING_!INSTANCE_NUM!=1" ) ) ) :: 按顺序启动第一个未运行的实例 for /L %%i in (1,1,%TOTAL_INSTANCES%) do ( if !RUNNING_%%i! equ 0 ( set "LAUNCHER_PATH=%BASE_PATH%\Diablo Immortal%%i\!LAUNCHER!" echo 启动实例%%i的启动器: !LAUNCHER_PATH! start "" "!LAUNCHER_PATH!" goto :END_SCRIPT ) ) echo 所有4个实例均已在运行中。 :END_SCRIPT echo 操作完成! pause ENDLOCAL
脚本说明
- 标记初始化:先给4个实例设置未运行标记,后续检测到运行实例时更新标记状态。
- 运行实例检测:通过
wmic获取进程路径,提取路径中的实例编号,同步更新标记数组。 - 单实例启动:按顺序遍历标记数组,找到第一个未运行的实例后立即启动对应启动器,启动后退出循环,保证每次只启动一个实例。
- 延迟变量扩展:启用
EnableDelayedExpansion确保循环内变量的读取和修改正常生效。
内容的提问来源于stack exchange,提问作者Josh
相关产品推荐
相关产品推荐

