将For / F与WMIC + WHERE子句+ AND子句组合使用

时间:2013-10-21 13:01:40

标签: batch-file for-loop syntax wmic

如果在脚本中的FOR命令中包含此WMIC命令,该怎么写?

wmic service where (name="themes" and state="running") get

以下代码不起作用:

For /F %%a in (
    'wmic service where ^("name='themes'" and "state='running'"^) get'
) do (
    echo %%a
)

3 个答案:

答案 0 :(得分:11)

@echo off
For /F "usebackq delims=" %%a in (`wmic service where 'name^="themes" and state^="running"' get`) do (
    echo %%a
)

这个适用于我。我使用usebackq选项对'和替代wmic语法 - '而不是括号没有任何问题。

答案 1 :(得分:11)

又一种选择:)

@echo off
for /f "delims=" %%A in (
  'wmic service where "name='themes' and state='running'" get'
) do for /f "delims=" %%B in ("%%A") do echo %%B

复杂的WHERE子句必须引用或括号。额外的内部'不会导致FOR / F出现问题。

我添加了一个额外的FOR / F来去除附加到每行末尾的不需要的回车,作为FOR / F将WMIC unicode输出转换为ANSII的工件。如果没有额外的FOR / F,则会有一个额外的行,仅包含一个回车符,最后会产生ECHO is off.

我认为我更喜欢jeb的版本,因为它消除了整个命令中的转义需求,尽管我可能会在WHERE子句中使用单引号。例如:

@echo off
for /f "delims=" %%A in (
  '"wmic service where (name='themes' and state='running') get name, pathName"'
) do for /f "delims=" %%B in ("%%A") do echo %%B

在我的第一个代码示例中使用语法需要转义GET子句中的逗号:

@echo off
for /f "delims=" %%A in (
  'wmic service where "name='themes' and state='running'" get name^, pathName'
) do for /f "delims=" %%B in ("%%A") do echo %%B

答案 2 :(得分:10)

你可以用单引号和双引号括起完整的wmic命令,然后你不需要逃避任何事情

FOR /F "delims=" %%a in ('"wmic service where (name="themes" and state="running") get"') do (
  echo %%a
)