![如何解析批处理文件中的 WMIC 输出并与数组进行比较?](https://linux22.com/image/687178/%E5%A6%82%E4%BD%95%E8%A7%A3%E6%9E%90%E6%89%B9%E5%A4%84%E7%90%86%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%20WMIC%20%E8%BE%93%E5%87%BA%E5%B9%B6%E4%B8%8E%E6%95%B0%E7%BB%84%E8%BF%9B%E8%A1%8C%E6%AF%94%E8%BE%83%EF%BC%9F.png)
我正在编写一个批处理脚本,用于从 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 没有正式的数组概念,尽管可以模拟。但对于此应用程序,我只是定义了一个包含所有可能值的变量,然后使用延迟扩展搜索和替换来删除找到的站点。如果结果与起始字符串不同,则表示找到了该站点,因此必须调用卸载过程。