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