按模块的FileName

时间:2018-10-21 04:29:27

标签: powershell

如果我需要按模块的FileName过滤进程,则以下代码可以完成此工作:

Get-Process | where { $_.Modules.FileName -eq "xxx\yyy.dll”) }

但是,如果我需要通过以字符串开头的FileName来过滤模块,则以下代码似乎无效:

Get-Process | where { $_.Modules.FileName.StartsWith("xxx\yyy.dll”)) }

结果,我在输出中看到了所有进程。我很困惑,为什么在StartsWith

的情况下过滤似乎不起作用

1 个答案:

答案 0 :(得分:2)

成员modules可能是一个集合。因此,它也需要迭代。像这样

(get-process) | % {
    if($_.modules -ne $null) { # No modules, no action
        $_.modules | ? { $_.filename.tolower().startswith("c:\program") }
    }
}

对于这个问题,实际上有两次迭代。让我们使用显式变量,而不是通过管道传递和打印实际模块文件。无论如何,传递多个$_都不容易阅读语法。像这样

foreach ($p in get-process) {
    if ($p.modules -ne $null){
        write-host $p.id $p.ProcessName
        foreach($m in $p.modules){
            if ($m.filename.tolower().startswith("c:\program") ) {
                write-host `t $m.moduleName $m.FileName # ` markdown bug
            }
        } 
        write-host
    }
}