Вывод команды WMIC командного файла в виде переменной выдачи

691
NirmalKD

Я пытаюсь получить вывод команды 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
C: \ Windows \ System32> for / F "tokens = *"% q in ('WMIC / узел: Comp1 PATH win32_UserProfile WHERE LocalPath = "C: \\ users \\ ABC1" GET Status ^ | Find / V "Status" " ') установите pro =% q Неверный глагол. NirmalKD 6 лет назад 0
Удалось заставить его работать с этой командой NirmalKD 6 лет назад 0
C: \ Windows \ System32> for / F "tokens = *"% a IN ('WMIC / узел: Comp1 PATH win32_UserProfile WHERE "LocalPath =' C: \\ users \\ ABC1 '" GET Status ^ | Find / V " Статус "^ | Find / V" "') do prop =% a: \ Windows \ System32> set prop = 0: \ Windows \ System32> set prop = NirmalKD 6 лет назад 0
Любая идея, как я могу удалить все пробелы из вывода этой команды NirmalKD 6 лет назад 0
Я попытался найти его и нашел, что большинство ответов немного сложны. NirmalKD 6 лет назад 0
Можете ли вы сказать мне точную команду в цикле `FOR`, которую вы используете, которая дает ожидаемый результат с пробелами или чем-то еще? Pimp Juice IT 6 лет назад 0
for / F "tokens = *"% a IN ('WMIC / узел: Comp1 PATH win32_UserProfile WHERE "LocalPath =' C: \\ users \\ ABC1 '" GET Status ^ | Find / V "Status" ^ | Find / V "" ') установите prop =% a NirmalKD 6 лет назад 0
Вы правильно поняли предложение Дейва работать на вас? Подумайте о том, чтобы принять его ответ, отметив маленькую серую галочку в левом верхнем углу от ответа Дэйва, и включите ее в зеленый цвет, чтобы дать ему и себе немного доверия. Pimp Juice IT 6 лет назад 0

1 ответ на вопрос

1
dbenham

Команда, выполняемая 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 ... 
Позвольте мне попробовать ваше предложение .. спасибо NirmalKD 6 лет назад 0