如何让批处理脚本仅在显示器数量变化时重启指定应用
批处理脚本改造方案
需求说明
原有脚本每10秒检测一次PC连接的显示器数量,检测到连接2台显示器时调用指定脚本重启目标应用后退出,设置为开机自启时,开机默认单显示器场景下,第二台显示器接入触发重启的逻辑可正常运行。
现需要调整脚本为常驻后台运行模式,在显示器接入、断开等数量变动场景都能自动触发一次应用重启,同时要避免数量无变化时重复触发重启的问题。
原有问题脚本
:test powershell -Command "exit (Get-CimInstance -Namespace root\wmi -ClassName WmiMonitorBasicDisplayParams | Select-String -Pattern 'InstanceName').length" set nMons=%ERRORLEVEL% if %errorlevel% equ 2 start C:\BookOfSixNew\ShellStartEdge.bat timeout 10 goto:test
改造后完整脚本
核心实现逻辑:新增变量存储上一次检测到的显示器数量,每次检测后将当前值和历史值对比,仅当二者不一致时才执行重启操作,执行完成后更新历史值为当前数量,避免重复触发。
@echo off setlocal enabledelayedexpansion :: 初始化基准值,记录脚本启动时的显示器数量 powershell -Command "exit (Get-CimInstance -Namespace root\wmi -ClassName WmiMonitorBasicDisplayParams | Select-String -Pattern 'InstanceName').length" set lastMons=%ERRORLEVEL% :loop :: 读取当前显示器数量 powershell -Command "exit (Get-CimInstance -Namespace root\wmi -ClassName WmiMonitorBasicDisplayParams | Select-String -Pattern 'InstanceName').length" set currMons=%ERRORLEVEL% :: 数量发生变化时触发重启,完成后更新基准值 if not !currMons! equ !lastMons! ( start C:\BookOfSixNew\ShellStartEdge.bat set lastMons=!currMons! ) :: 静默等待10秒进入下一轮检测 timeout /t 10 /nobreak >nul goto loop
关键改动说明
- 开头添加
setlocal enabledelayedexpansion开启延迟扩展,解决批处理循环内变量无法实时读取的问题 - 脚本启动时先记录初始显示器数量作为基准值,避免首次运行就误触发重启
- 每轮检测分别获取当前显示器数量,和上一次记录的数值做对比,仅数值变化时才执行启动脚本的操作,支持显示器接入、断开等所有数量变动场景
- 触发重启后立刻更新基准值为当前数量,保证同个数量状态下只会触发一次重启
timeout命令增加/nobreak >nul参数,屏蔽按键打断逻辑、隐藏倒计时输出,让脚本后台运行更静默
内容的提问来源于stack exchange,提问作者alexlearneer
相关产品推荐
相关产品推荐

