使用wmic搜索具有特定命令行的进程时如何过滤掉wmic进程?

How to filter out wmic process when searching for a process with a specific command line using wmic?

我试图直接从命令提示符和批处理脚本中通过 运行 以下命令找到名称为 myapp 的应用程序:

D:\Files>wmic process where "commandline like '%myapp%'" get processid, commandline

CommandLine                                                                  ProcessId  
wmic  process where "commandline like '%myapp%'" get processid, commandline  10744     
myapp myarg1 myarg2 myarg3                                                   2423 

我想过滤掉 wmic 进程条目本身。我尝试了以下命令:

D:\Files>wmic process where "commandline like '%myapp%' and commandline not like '%wmic%'" get processid, commandline

Node - XXXXXXXXXXX
ERROR:
Description = Invalid query

但是输出如上所示的错误。

我尝试使用 more +1 手动跳过第一行,但输出行(进程)的顺序可能会发生变化。

如何删除 wmic 进程条目?

用方括号括起来指定一个范围内的任何一个字符 []

在您的评论中使用 java 示例:

batch-file 中(类似语句的双 %%

@echo off
wmic process where "commandline like '%%[m]y-complex-application.jar%%'" get processid, commandline

in cmd(类似语句的单个 %

wmic process where "commandline like '%[m]y-complex-application.jar%'" get processid, commandline

为什么这样有效

[] 指定应该或可能匹配的字符范围。例如,当执行 ... like '%[abc]md% 时,它将匹配任何与 amdbmdcmd 相关的内容。这里的技巧是 [] 中的字符作为文字字符匹配,而不是 []。因此,在我们搜索 [m]yapp 的情况下,它会逐字转换字符串以准确找到单词 myapp,但是,您的 wmics like 语句根本不包含该单词, 它包含单词 [m]yapp 并且不会匹配它。

然后,一些无用的信息。此技巧也适用于 Linux' grep 命令以及 windows' findstr

示例 (findstr):

echo myapp | findstr /R "[m]yapp"

结果:

示例 (Linux' grep):

ps -ef | grep "[t]nslsnr"

有和没有 []

的结果

直接在 中 运行 您的特定命令和 return 您需要的实例的正确方法是:

wmic process where "commandline like '%myapp%' and not commandline like 'wmic%'" get processid, commandline

这种机制的思想是排除wmic命令行本身。它通过询问在任何地方包含字符串 myapp 但不包含以字符串 wmic.

开头的命令行来做到这一点

如果此命令在 中 运行,则百分比字符需要加倍,即

wmic process where "commandline like '%%myapp%%' and not commandline like 'wmic%%'" get processid, commandline