PowerShell使用WMI Query如何对Win32_Process的CommandLine做模糊匹配
问题根源是PowerShell双引号字符串的变量扩展机制,和WQL本身的语法无关:
WQL的LIKE运算符标准通配符确实是%,但你把WQL语句放在双引号中时,PowerShell会自动将形如%变量名%的内容识别为环境变量引用并尝试展开。如果你的设备上没有名为glassfish的环境变量,%glassfish%会被展开为空字符串,最终发给WMI服务的查询条件实际为CommandLine like '',自然匹配不到任何进程。
正确写法
下面两种写法都可以直接在WQL层面完成过滤,不需要额外加管道:
- 用单引号包裹整个WQL语句,避免PowerShell解析内部的
%字符:
Get-WmiObject -Query 'SELECT * FROM Win32_Process WHERE Name="java.exe" AND CommandLine LIKE "%glassfish%"'
- 如果必须用双引号包裹WQL语句,用PowerShell转义符反引号(
)转义所有%`字符:
Get-WmiObject -Query "SELECT * FROM Win32_Process WHERE Name='java.exe' AND CommandLine LIKE `%glassfish`%"
补充:
Get-WmiObject在PowerShell 3.0及以上版本已经被弃用,更推荐使用兼容更高系统的Get-CimInstance,查询语法完全一致:Get-CimInstance -Query 'SELECT * FROM Win32_Process WHERE Name="java.exe" AND CommandLine LIKE "%glassfish%"'
内容的提问来源于stack exchange,提问作者arthur
相关产品推荐
相关产品推荐

