编辑

编辑

我正在尝试从 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 ...

相关内容