Назад | Перейти на главную страницу

Как разобрать вывод 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 }

Я закончу запускать файл .bat с командой psexec для списка серверов.

Спасибо за помощь.

Еще раз спасибо, 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

Я занимаюсь исследованием, но пока не нашел ответа. Какие-либо предложения?

Вот один из способов сделать это:

@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 нулевое значение.
  • Пакетная обработка не имеет формальной концепции массива, хотя ее можно эмулировать. Но для этого приложения я просто определил переменную, содержащую все возможные значения, а затем использовал поиск с отложенным расширением и замену, чтобы удалить найденный сайт. Если результат отличается от начальной строки, значит, сайт был найден, поэтому необходимо вызвать процесс удаления.