EDITAR

EDITAR

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 é o 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?

Responder1

O comando executado por FOR /F passa por uma análise extra que converte todos os delimitadores de token cmd.exe sem aspas/sem escape em espaços. Assim WHERE LocalPath="value"se torna
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 depois usar aspas simples para o valor (esta é minha maneira preferida de escrever 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

Não acho que :realmente precise ser evitado, mas também não vejo como isso possa causar algum dano.

Você pode encontrar o mesmo problema ao selecionar vários valores com WMIC em um for /F - as vírgulas sem aspas/sem escape são transformadas em espaços. Mas nestes casos citar não é uma opção – você deve escapar das vírgulas.

Algo assim 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 todas as fugas. Como o comando executado por FOR /F é executado via CMD /C, você pode aproveitar o fato de que CMD /C removerá as aspas duplas.

Portanto, algo como o seguinte funcionará sem nenhum escape, desde que keywordnão tenha nenhum caractere que precise de escape (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 ...

informação relacionada