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