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