Como analisar a saída WMIC em um arquivo de lote e comparar com uma matriz?

1

Estou escrevendo um script em lote para extrair códigos de sites do SCCM de clientes do SCCM. Eu gostaria de puxar o código do site do cliente e compará-lo a uma matriz de códigos de site. Se houver uma correspondência, eu desinstalarei o cliente. Eu tenho a parte de desinstalação. Isso tem que ser feito como um arquivo em lotes.

Eu posso obter o código do site com o seguinte comando WMIC

WMIC /namespace:\root\ccm path sms_client CALL GetAssignedSite

Isso produz a seguinte saída

Executing (sms_client)->GetAssignedSite()
Method execution successful.
Out Parameters:[abstract]
class __PARAMETERS
{
        [out, ID(0): DisableOverride ToInstance] string sSiteCode = "BBB";
        [out] uint32 ReturnValue;
};

Como posso extrair e comparar o código do site no script em lote - "BBB" neste exemplo.

Aqui está o que eu tenho para o Powershell como exemplo, mas isso tem que ser um arquivo de lote.

$SiteCode = ([wmiclass]'ROOT\ccm:SMS_Client').GetAssignedSite()
$SCCMSiteCodes = @('AAA', 'BBB', 'CCC', 'GGG', 'VVV')
If ($SCCMSiteCodes -Contains $SiteCode.sSiteCode) 
    { uninstall SCCM client }

Acabarei executando o arquivo .bat com um comando psexec em uma lista de servidores.

Obrigado pela ajuda.

Obrigado novamente, dbenham. Eu modifiquei o código ligeiramente adicionando uma segunda instrução 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
    )
)

Encontrei outro cenário que aciona uma desinstalação e não sei exatamente por que, uma vez que ele não contém nenhum dos sitecodes. Nesse caso, o servidor não atingiu o servidor de gerenciamento do SCCM, portanto, ele não recebeu um sitecode.

Para esses servidores, a resposta para

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

Estou pesquisando, mas ainda não encontrei uma resposta. Alguma sugestão?

    
por Javagenki 29.07.2016 / 02:45

1 resposta

1

Aqui está uma maneira de fazer isso:

@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
  )
)

O código usa algumas coisas não intuitivas:

  • A cadeia de opções ímpar FOR / F é o resultado da necessidade de definir o delimitador de token como uma cotação. Ele também define o número do token como 2 e desativa o recurso de EOL definindo EOL como nada.
  • O lote não possui um conceito de matriz formal, embora possa ser emulado. Mas para esta aplicação, acabei de definir uma variável contendo todos os valores possíveis e, em seguida, use a pesquisa de expansão atrasada e substitua para remover o site encontrado. Se o resultado for diferente da sequência inicial, o site foi localizado, portanto, o processo de desinstalação deve ser chamado.
por 29.07.2016 / 16:49