You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让批处理脚本仅在显示器数量变化时重启指定应用

批处理脚本改造方案

需求说明

原有脚本每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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 13:27:22