Batch-File

如何在批處理文件中解析 WMIC 輸出並與數組進行比較?

  • August 8, 2016

我正在編寫一個批處理腳本來從 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 沒有正式的數組概念,但可以模擬。但是對於這個應用程序,我只是定義了一個包含所有可能值的變數,然後使用延遲擴展搜尋和替換來刪除找到的站點。如果結果與起始字元串不同,則表明已找到該站點,因此必須呼叫解除安裝過程。

引用自:https://serverfault.com/questions/792596