批处理文件 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 字符) .
我需要从下面的命令中获取 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
:
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 字符) .