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

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

Я пытаюсь получить вывод из команды 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

Команда, выполняемая 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 ...

Связанный контент