Batch-File
如何在批處理文件中解析 WMIC 輸出並與數組進行比較?
我正在編寫一個批處理腳本來從 SCCM 客戶端提取 SCCM 站點程式碼。我想提取客戶站點程式碼並將其與一組站點程式碼進行比較。如果有匹配項,我將解除安裝客戶端。我有解除安裝部分。這必須作為批處理文件完成。
我可以使用以下 WMIC 命令獲取站點程式碼
WMIC /namespace:\\root\ccm path sms_client CALL GetAssignedSite
這會產生以下輸出
Executing (sms_client)->GetAssignedSite() Method execution successful. Out Parameters:[abstract] class __PARAMETERS { [out, ID(0): DisableOverride ToInstance] string sSiteCode = "BBB"; [out] uint32 ReturnValue; };
如何提取和比較批處理腳本中的站點程式碼——本例中為“BBB”。
這是我以 Powershell 為例,但這必須是一個批處理文件。
$SiteCode = ([wmiclass]'ROOT\ccm:SMS_Client').GetAssignedSite() $SCCMSiteCodes = @('AAA', 'BBB', 'CCC', 'GGG', 'VVV') If ($SCCMSiteCodes -Contains $SiteCode.sSiteCode) { uninstall SCCM client }
我最終將使用 psexec 命令針對伺服器列表執行 .bat 文件。
謝謝您的幫助。
再次感謝,德本漢姆。我通過添加第二個 IF 語句稍微修改了程式碼。
SETLOCAL enableDelayedExpansion SET "SCCMSiteCodes= 'AAA' 'BBB' 'CCC' 'GGG 'VVV' " FOR /f delims^=^"^ tokens^=2^ eol^= %%A in ( 'wmic /namespace:\\root\ccm path sms_client CALL GetAssignedSite^|findstr sSiteCode' ) DO ( IF "!SCCMSiteCodes:'%%A'=!" neq "!SCCMSiteCodes!" ( CALL :TEE SCCM client - Sitecode match found REM Your uninstall CALL goes here ) IF "!SCCMSiteCodes:'%%A'=!" equ "!SCCMSiteCodes!" ( CALL :TEE SCCM client - Sitecode match not found GOTO NOTFOUIND ) )
我發現了另一個觸發解除安裝的場景,但我不確定為什麼,因為它不包含任何站點程式碼。在這種情況下,伺服器沒有到達 SCCM 管理伺服器,因此它沒有收到站點程式碼。
對於這些伺服器,響應
WMIC /namespace:\\root\ccm path sms_client CALL GetAssignedSite
是
Executing (sms_client)->GetAssignedSite() ERROR: Description = Can't enumerate any more, because the associated data is missing
我正在研究,但還沒有找到答案。有什麼建議麼?
這是一種方法:
@echo off setlocal enableDelayedExpansion set "SCCMSiteCodes= 'AAA' 'BBB' 'CCC' 'GGG 'VVV' " for /f delims^=^"^ tokens^=2^ eol^= %%A in ( 'wmic /namespace:\\root\ccm path sms_client CALL GetAssignedSite^|findstr sSiteCode' ) do ( if "!SCCMSiteCodes:'%%A'=!" neq "!SCCMSiteCodes!" ( REM Your uninstall CALL goes here ) )
該程式碼使用了一些不直覺的東西:
- 奇數 FOR /F 選項字元串是需要將標記分隔符設置為引號的結果。它還將令牌編號設置為 2,並通過將 EOL 設置為空來禁用 EOL 功能。
- Batch 沒有正式的數組概念,但可以模擬。但是對於這個應用程序,我只是定義了一個包含所有可能值的變數,然後使用延遲擴展搜尋和替換來刪除找到的站點。如果結果與起始字元串不同,則表明已找到該站點,因此必須呼叫解除安裝過程。