如何parsingbatch file中的WMIC输出并与数组进行比较?

我正在编写一个批处理脚本来从SCCM客户端中提取SCCM站点代码。 我想拉客户站点代码,并将其与网站代码数组进行比较。 如果有匹配,我会卸载客户端。 我有卸载部分。 这必须作为batch file来完成。

我可以通过以下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作为例子,但这必须是一个batch file。

 $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 managemnent服务器,因此它没有收到站点代码。

对于这些服务器,响应

 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 

我正在研究,但还没有拿出答案。 有什么build议么?

这是一个办法:

 @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选项string是需要将令牌分隔符设置为引号的结果。 它还将令牌编号设置为2,并通过将EOL设置为空,禁用EOLfunction。
  • 批处理没有正式的数组概念,尽pipe它可以被仿真。 但是对于这个应用程序,我只是定义了一个包含所有可能值的variables,然后使用延迟扩展search和replace来删除find的站点。 如果结果与起始string不同,则find站点,因此必须调用卸载过程。