gpt4 book ai didi

java - 在 shell 脚本中解析 wmic 的输出

转载 作者:可可西里 更新时间:2023-11-01 11:55:05 25 4
gpt4 key购买 nike

我正在尝试解析 WMIC 的输出,然后获取 PID。

我的脚本如下:

@echo off

setLocal enableExtensions enableDelayedExpansion

FOR /F "tokens=1* delims=" %%A IN ('"wmic process where(name="java.exe") get ProcessID,commandline| FINDSTR /v "CommandLine" | FINDSTR "TestServer""') DO (
set "line=%%A"
@REM echo "%%A"
for /F "tokens=* delims= " %%C in ("%%A") do (
echo "%%C"
echo "%%D"
)
)

输出如下:

"java  com.test.TestServer                                       7560       "
"%D"
"java com.test.TestServer 7380 "
"%D"

我的目标是获取进程 ID。

我曾尝试在 FOR 循环中使用空格作为分隔符。然而没有运气。

所以我的问题是如何格式化 WMIC 的列并获取列?

最佳答案

WMIC 使用 SQL 语法的一个子集。通过使用带有 % 作为通配符的 LIKE 运算符,您可以在功能上将 FINDSTR 测试放在 WMIC WHERE 子句中。由于它在批处理脚本中,因此 % 需要加倍。

由于 WMIC 输出中不再需要 CommandLine 值,因此解析 ProcessID 变得容易得多。我添加了 SessionID 以在末尾放置一个未使用的值,以便更容易解析该值,而不必担心 FOR/F 在将 WMIC unicode 输出转换为 ANSI 时以某种方式引入的不需要的回车符。

@echo off
setlocal
set "pid="
for /f "skip=1" %%A in (
'wmic process where "name='java.exe' and commandline like '%%TestServer%%' and not commandline like '%%CommandLine%%'" get processid^, sessionid'
) do if not defined pid set "pid=%%A"

编辑以回应评论中的问题

WMIC unicode 的 FOR/F 转换还引入了不需要的行,这些行看起来是空的,但实际上包含一个回车符。在我上面的代码中,我假设您需要一行,所以我使用 IF DEFINED 来有效地忽略不需要的尾随“空白”行。

如果您需要多个值,则需要另一种方法。额外的 FOR/F 循环将删除不需要的回车符,因此这些行真正变为空,因此被忽略。根据您的评论,您似乎不再需要忽略包含“CommandLine”的命令行。

我不知道你需要用这些值做什么,所以下面的代码只是简单地回应了每个值。我使用 SKIP=1 代替通过 FINDSTR 传递结果以避免出现标题行。

@echo off
for /f "skip=1" %%A in (
'wmic process where "name='java.exe' and commandline like '%%TestServer%%'" get processid'
) do for /f %%B in ("%%A") do echo %%B

关于java - 在 shell 脚本中解析 wmic 的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19349241/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com