批处理文件 wmic 用法

batch file wmic usage

我需要从下面的命令中获取 pid 如果我在如下命令行中使用它,它会起作用:

wmic process where "name="java.exe" and CommandLine like '%%cassandra%%'" get ProcessId | FINDSTR /v ProcessId | FINDSTR /r /v "^$"

但如果在 .bat 文件中使用则失败:

FOR /F "tokens=2" %%G IN ('wmic process where ^(name^="java.exe"^ and CommandLine like '%%cassandra%%') get ProcessId ^| FINDSTR /v ProcessId ^| FINDSTR /r /v "^$"') DO (
   set PARENT_PID=%%G
)
echo !PARENT_PID!

有人可以帮忙吗?

你的转义点不正确,不确定你是否启用了delayedexpansion,但我不会在这个例子中使用它:

@echo off
for /F "tokens=2 delims==" %%G IN ('wmic process where (name^="java.exe" and commandline like '%%cassandra%%'^) get ProcessId /value') DO if not defined parent_pid set "parent_pid=%%G"
echo %parent_pid%

您会注意到,我为 wmic 使用了 /value 开关并删除了 findstr /v 命令,因为我使用 = 作为分割值的分隔符。

还要注意,如果你有多个进程运行相同的命令行和名称,你只会得到一个结果,因为你只设置了一次值,所以在那种情况下,不要设置一个多变的。即:

@echo off
for /F "tokens=2 delims==" %%G IN ('wmic process where (name^="java.exe" and commandline like '%%cassandra%%'^) get ProcessId /value') DO echo %%G

您在 for /F 循环中使用的代码与您在命令提示符中尝试的代码不同,因为有额外的括号。然后你正在转义开头 ( 但忘记了结尾 ),这更重要,因为它结束了 in 关键字后面的括号块。

无论如何,您应该更改 wmic 命令行并引用整个 where 子句:

wmic Process where "Name='java.exe' and CommandLine like '%%cassandra%%'" get ProcessId

因此,在 for /F:

中使用 this 时,您不必费心构建转义序列
set "PARENT_PID="
for /F "skip=1 delims=" %%P in ('
    wmic Process where "Name='java.exe' and CommandLine like '%%cassandra%%'" get ProcessId
') do for /F "tokens=1" %%Q in ("%%P") do set "PARENT_PID=%%Q"
echo/%PARENT_PID%

第二个 for /F 循环用于删除来自 for /F wmic 命令的 Unicode-to-ASCII/ANSI 转换的事实(孤立的 carriage-return 字符) .