如果我需要按模块的FileName过滤进程,则以下代码可以完成此工作:
Get-Process | where { $_.Modules.FileName -eq "xxx\yyy.dll”) }
但是,如果我需要通过以字符串开头的FileName来过滤模块,则以下代码似乎无效:
Get-Process | where { $_.Modules.FileName.StartsWith("xxx\yyy.dll”)) }
结果,我在输出中看到了所有进程。我很困惑,为什么在StartsWith
的情况下过滤似乎不起作用答案 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
}
}