You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell通过多类标识匹配获取目标进程的问题与实现

多标识匹配定位Windows进程的PowerShell实现

功能需求

需要实现传入任意一类进程标识,即可返回可执行后续操作(如终止进程)的进程对象的功能,本次以Autodesk Desktop Connector进程为例,支持三类定位标识:

  • 任务管理器显示的进程描述名:Autodesk Desktop Connector
  • 系统记录的实际进程名:DesktopConnector.Applications.Tray
  • 进程对应可执行文件名:desktopconnector.applications.tray.exe
    该功能主要用于解决Autodesk安装、卸载程序不会自动停止关联进程,导致更新、卸载流程失败,必须手动结束进程才能正常执行的问题。

初始版本问题

最初编写的测试代码同时承担匹配结果验证、不同匹配逻辑命中/失败耗时统计的功能:

$strings = @('DesktopConnector.Applications.Tray','Autodesk Desktop Connector','desktopconnector.applications.tray.exe', 'Nope')

foreach ($string in $strings) {
    (Measure-Command {
        if (($process = (Get-Process -Name:$string -errorAction:SilentlyContinue)) -or 
            ($process = ((Get-Process).Where({$PSItem.MainModule.FileVersionInfo.FileDescription -eq $string})) -or
            ($process = ((Get-Process).Where({$PSItem.Path.EndsWith($string)}))
            ))) {
            Write-Host "$string $($process.id) " -NoNewLine
        }
    }).TotalSeconds
} 

测试过程中出现三类异常:

  • 传入实际进程名走第一个判断分支时,可正常返回预期的[System.Diagnostics.Process]类型对象
  • 传入任务管理器显示的文件描述走第二个判断分支时,仅返回无实用价值的[Bool]布尔类型值
  • 传入可执行文件名走第三个判断分支时,会因$PSItem.Path为null抛出空引用错误
    经排查问题和.Where()方法的使用逻辑有关:第二个条件中.Where()返回的集合结果未做提取,第三个条件的判断谓词未做空值校验,但初期未找到可行的修正方案。

最终可用代码

调整后的代码兼顾执行性能、可读性与功能完整性,补全了变量赋值、空值校验的缺失逻辑:

$strings = @('DesktopConnector.Applications.Tray','Autodesk Desktop Connector','desktopconnector.applications.tray.exe', 'Nope')

foreach ($string in $strings) {
    (Measure-Command {
        # 优先调用性能最高的进程名精确匹配,匹配失败再遍历全量进程匹配描述、可执行文件名
        if (($process = Get-Process -Name $string -ErrorAction SilentlyContinue) -or 
            ($process = Get-Process | Where-Object {
                # 对Path属性加空值校验,规避系统进程无Path属性导致的报错
                $_.MainModule.FileVersionInfo.FileDescription -eq $string -or
                ($null -ne $_.Path -and $_.Path -like "*$string")
            })) {
            Write-Host "$string 匹配到进程ID:$($process.id) " -NoNewLine
        }
    }).TotalSeconds
}

代码逻辑说明:

  • 优先使用Get-Process -Name做精确匹配,该方式不需要遍历全量进程属性,执行效率最高
  • 精确匹配失败后再遍历全量进程,同时匹配文件描述、可执行文件名两个维度
  • 对Path属性增加非空判断,规避系统空闲进程、内核进程等无对应可执行路径的对象触发报错
  • 所有匹配分支的结果统一赋值给$process变量,保证后续调用进程ID、终止进程等操作可以正常执行

内容的提问来源于stack exchange,提问作者Gordon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 08:36:17