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