【问题标题】:Identify process with powershell -Query option satisfying CommandLine like '%pattern%'使用满足命令行的 powershell -Query 选项识别进程,例如 '%pattern%'
【发布时间】:2021-11-25 01:01:14
【问题描述】:

最近我发现可以像这样向WmiObject 发出 sql 查询:

Get-WmiObject -Query "SELECT * FROM Win32_Process WHERE Name='java.exe'"

我想进一步限制包含 CommandLine 参数的输出,例如:

Get-WmiObject -Query "SELECT * FROM Win32_Process WHERE Name='java.exe' AND CommandLine like '%glassfish%'"

Get-WmiObject -Query "SELECT * FROM Win32_Process WHERE Name='java.exe' AND CommandLine like '*glassfish*'"

但是,这不会返回任何答案。我如何在那里制定近似匹配查询?当然可以

Get-WmiObject -Query "SELECT * FROM Win32_Process WHERE Name='java.exe'" | Where-Object { $_.CommandLine -match "glassfish" }

但这看起来并不优雅。

编辑:我的进程中有一条 glassfish 正在运行(如果我删除“CommandLine like ...”:

【问题讨论】:

  • CommandLine like '%glassfish%' 是正确的语法。您是否验证了第一个命令的输出实际上具有 CommandLine 值包含 glassfish 的结果?
  • 顺便说一句,该语言实际上被称为 WQL(WMI 查询语言),虽然它与 SQL 有非巧合的相似之处,但存在很大差异,尤其是在涉及连接时。 (当该语言被称为 ANSI SQL 的“子集”时,文档完全是谎言,但它肯定不是。)
  • 感谢 cmets,是的,我在我的进程中看到了 glassfish(当我在没有类似 '%glassfish%' 的情况下运行时),我用屏幕截图更新了描述
  • 该死,我复制粘贴了你的行,它向我展示了一个过程。为什么一开始对我不起作用?
  • 嗯,你是对的,它有效。您为什么不从中创建一个答案,然后单击以使其成为答案,然后关闭工单

标签: sql powershell get-wmiobject approximate


【解决方案1】:

这个:

Get-WmiObject -Query "SELECT * FROM Win32_Process WHERE Name='java.exe' AND CommandLine like '%glassfish%'"

...使用正确的语法,WQL 中的通配符确实是%


如果要将变量子字符串传递给查询,请确保使用另一个反斜杠转义引号和反斜杠:

# define substring to looks for
$cmdLineSubstring = 'glassfish'

# escape quotes and backslashes
$cmdLineSubstring = $cmdLineSubstring -replace '[\\\p{Pi}\p{Pf}''"]','\$0'

$query = "SELECT * FROM Win32_Process WHERE Name = 'java.exe' AND CommandLine LIKE '%${cmdLineSubstring}%'"

【讨论】:

    猜你喜欢
    • 2021-08-21
    • 2017-03-29
    • 2021-01-28
    • 2021-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多