如何解析批处理文件中的 WMIC 输出并与数组进行比较?

如何解析批处理文件中的 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 文件。

谢谢您的帮助。

再次感谢 dbenham。我通过添加第二个 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

我正在研究,但还没有找到答案。有什么建议吗?

答案1

以下是一种方法:

@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 没有正式的数组概念,尽管可以模拟。但对于此应用程序,我只是定义了一个包含所有可能值的变量,然后使用延迟扩展搜索和替换来删除找到的站点。如果结果与起始字符串不同,则表示找到了该站点,因此必须调用卸载过程。

相关内容