編輯

編輯

我試圖從 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 子句括在雙引號中,然後使用單引號作為值(這是我在與 FOR /F 一起使用時使用 WMIC 編寫 WHERE 子句的首選方法)

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

我不認為真正:需要逃避,但我也不明白它會造成任何傷害。

在 for /F 中使用 WMIC 選擇多個值時,您可能會遇到相同的問題 - 未加引號/未轉義的逗號會變成空格。但在這些情況下,引用不是一個選擇 - 您必須轉義逗號。

像這樣的事情是行不通的:

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 ...

相關內容