在shell脚本中parsingwmic的输出

我试图parsingWMIC的输出,然后得到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 

使用tokens =时,delims参数将被忽略

当你需要第三个标记时,你应该使用标记= 3

这在我的系统上得到了单个正在运行的进程的PID。

 @echo off FOR /F %%A IN ('"wmic process where name="java.exe" get ProcessID,commandline |findstr [0-9] " ') DO echo "%%A" pause 
 for /f "tokens=1*delims==" %%a in ('wmic process where 'name^="java.exe" AND CommandLine like "%%Testserver%%"' get ProcessID /format:list^|find /i "ProcessID"') do set "ProcessID=%%b" echo %ProcessID%