: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
此回圈的作用是每 10 秒檢查一次連接到我的 PC 的顯示幕數量,如果檢測到超過 2 個顯示幕,則重新啟動某個應用程式,然后腳本關閉。
我需要幫助保持此腳本運行,但我只希望它在監視器計數更改時重新啟動應用程式。
此腳本在啟動時運行,當有 1 臺顯示幕連接到我的 PC 時。
從這一點開始,它會一直檢查我的顯示幕計數,直到連接第二臺顯示幕,當它找到第二臺顯示幕時,它會重新啟動應用程式并立即關閉。
現在一切都很好,但從現在開始,我希望腳本保持活動狀態,以繼續檢查監視器,以防其中一個監視器斷開連接并稍后重新連接,此時它應該再次重新啟動應用程式。
我的問題是,如果腳本在連接第二臺顯示幕后仍然處于活動狀態,它會每 10 秒搜索一次顯示幕,并且因為已經連接了 2 臺顯示幕,它會每 10 秒重新啟動一次應用程式。
我怎樣才能避免這種情況?
我希望腳本在找到第二臺監視器后暫停檢查我的監視器計數,直到監視器計數發生實際差異,例如一臺監視器斷開連接。
uj5u.com熱心網友回復:
您需要您的腳本知道預期監視器的數量以實作任何更改。使用變數保存舊值以將其與新值進行比較:
@echo off
setlocal
REM get first number (at startup)
%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -NoLogo -NoProfile -Command "Exit (Get-CimInstance -NameSpace Root\WMI -Query \"SELECT * FROM WmiMonitorBasicDisplayParams WHERE Active = 'TRUE'\").Active.Length"
set OldNumber=%errorlevel%
:loop
timeout 10 >nul
REM get CurrentNumber
%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -NoLogo -NoProfile -Command "Exit (Get-CimInstance -NameSpace Root\WMI -Query \"SELECT * FROM WmiMonitorBasicDisplayParams WHERE Active = 'TRUE'\").Active.Length"
set CurrentNumber=%errorlevel%
echo DEBUG: CurrentNumber/old = %CurrentNumber%/%OldNumber%
if %CurrentNumber% gtr %OldNumber% (
set OldNumber=%CurrentNumber%
echo Found a new monitor
)
if %CurrentNumber% lss %OldNumber% (
set OldNumber=%CurrentNumber%
echo A monitor is now missing
)
goto :loop
只需添加在監視器連接或斷開連接時應執行的命令。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/497707.html
上一篇:批處理檔案不執行命令
