Saída do comando WMIC do arquivo em lote como variável

1

Eu estou tentando obter uma saída de um comando WMIC para definir como variável, por algum motivo, não funciona. Alguém pode ajudar? É isso que estou tentando fazer

for /f "tokens=*" %q IN (' WMIC /Node^:Comp1 PATH Win32_UserProfile WHERE LocalPath="C:\users\ABC1" GET Status ^| find /V "Status" ') do set pat= %q

Há algo de errado que estou fazendo?

    
por NirmalKD 06.03.2018 / 00:54

1 resposta

1

O comando executado por FOR / F passa por uma análise extra que converte todos os delimitadores de token cmd.exe não-referenciados / sem escape em espaços. Então, WHERE LocalPath="value" torna-se WHERE LocalPath "value" .

Você pode escapar do =

for /f "tokens=*" %q IN (
  'WMIC /Node^:Comp1 PATH Win32_UserProfile WHERE LocalPath^="C:\users\ABC1" GET Status ^| find /V "Status" '
) do set pat= %q

Ou você pode colocar toda a cláusula WHERE entre aspas duplas e, em seguida, usar aspas simples para o valor (essa é a minha maneira preferida de escrever as cláusulas WHERE com WMIC quando usado com FOR / F)

for /f "tokens=*" %q IN (
  'WMIC /Node^:Comp1 PATH Win32_UserProfile WHERE "LocalPath='C:\users\ABC1'" GET Status ^| find /V "Status" '
) do set pat= %q

Eu não acho que o : realmente precise ser escapado, mas também não vejo como isso pode causar algum dano.

Você pode ter o mesmo problema ao selecionar vários valores com WMIC em a para / F - as vírgulas não citadas / sem escape são transformadas em espaços. Mas nesses casos, citar não é uma opção - você deve escapar das vírgulas.

Algo parecido com isso não funcionará:

for /f "delims=" %%A in ('wmic ...... get value1,value2,value3') do ...

Você deve escapar das vírgulas:

for /f "delims=" %%A in ('wmic ...... bet value1^,value2^,value3') do ...

EDITAR

Bem, na verdade, existe um truque que às vezes permite eliminar completamente todos os escapes. Como o comando executado por FOR / F é executado via CMD / C, você pode tirar proveito do fato de que o CMD / C removerá entre aspas duplas.

Portanto, algo como o seguinte funcionará sem nenhum escape, desde que o keyword não tenha nenhum caractere que precise ser salvo (não é citado durante a primeira rodada de análise)

for /f "delims=" %%A in (
  '"wmic .... where this='x' and that='y' get value1,value2,value3 | find "keyword"'
) do ...
    
por 06.03.2018 / 07:07