1

Я пытаюсь получить вывод команды WMIC для установки в качестве переменной, по какой-то причине она не работает. Может ли кто-нибудь помочь. Это то, что я пытаюсь сделать

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

Что-то не так, что я делаю?

1 ответ1

1

Команда, выполняемая FOR /F, подвергается дополнительному синтаксическому анализу, который преобразует все разделители маркеров cmd.exe без кавычек / неэкранированные в пробелы. Так WHERE LocalPath="value" становится
WHERE LocalPath "value" .

Вы можете избежать =

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

Или вы можете заключить все предложение WHERE в двойные кавычки, а затем использовать одинарные кавычки для значения (это мой предпочтительный способ написания предложений WHERE с помощью WMIC при использовании с 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

Я не думаю , : на самом деле нужно бежать, но я не вижу , как это может причинить никакого вреда либо.

Вы можете столкнуться с той же проблемой при выборе нескольких значений с помощью WMIC в for /F - запятые / неэкранированные запятые превращаются в пробелы. Но в этих случаях цитирование не вариант - вы должны избегать запятых.

Как то так не получится

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

Вы должны избежать запятых:

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

РЕДАКТИРОВАТЬ

Ну, на самом деле, есть хитрость, которая иногда позволяет полностью устранить все побег. Поскольку команда, выполняемая FOR /F, выполняется через CMD /C, вы можете использовать тот факт, что CMD /C будет обрезать двойные кавычки.

Таким образом, что-то вроде следующего будет работать без каких-либо экранирований, пока keyword не содержит символов, которые нужно экранировать (оно не цитируется во время первого раунда анализа)

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .