Powershell - 通过多个名称过滤WMIObject进程

时间:2011-09-22 09:42:27

标签: powershell wmi

我正在尝试获取正在运行的进程列表并按两个进程名称进行筛选 - 任何人都可以告诉我如何使其正常工作吗?

到目前为止,我已将其工作并过滤掉一个进程名称:

$rn = Get-WMIObject Win32_Process -computer servername `
  -credential mydomain\administrator -filter "Name='program1.exe'" |
  select -expand path
$lst = Get-Content “C:\path\path2\List.txt”
Compare-Object $lst $rn

我想要它做的是过滤两个进程名称,但我尝试过的任何工作都没有。有什么想法吗?

4 个答案:

答案 0 :(得分:5)

以下是如何获取一组完整的Process对象,这些对象与您感兴趣的进程名称列表相匹配。

$ProcessNames = @( 'explorer.exe', 'notepad.exe' )

Get-WmiObject Win32_Process -Computer 'localhost' |
  Where-Object { $ProcessNames -contains $_.Name } | 
  Select-Object ProcessID, Name, Path |
  Format-Table -AutoSize

此示例查找所有进程,然后通过将其发送到管道筛选器来筛选该列表,管道筛选器检查流程名称是否包含在有趣流程名称列表中。以这种方式使用管道的主要好处是您可以轻松访问返回进程的其他属性(例如ProcessID)。

ProcessID Name         Path
--------- ----         ----
     5832 explorer.exe C:\Windows\Explorer.EXE
     4332 notepad.exe  C:\Windows\system32\NOTEPAD.EXE
     2732 notepad.exe  C:\Windows\system32\notepad.exe

答案 1 :(得分:4)

使用OR,AND,LIKE等WQL运算符:

Get-WMIObject Win32_Process -computer servername -credential mydomain\administrator -filter "Name='program1.exe' OR Name='program2.exe'"

答案 2 :(得分:1)

创建一系列您正在处理的流程:

$processes = @('winword.exe', 'notepad.exe', 'excel.exe') | `
    % {
       $rn = Get-WMIObject Win32_Process -computer servername -credential mydomain\admin -filter "Name='$_'" | select -expand path 
       #$lst = Get-Content “C:\path\path2\List.txt” 
       #Compare-Object $lst $rn
       write-host $rn
    }

我已经评论了你的比较,所以你可以看到我们如何清楚地循环数组。

答案 3 :(得分:0)

如果我理解的话,试试这个:

$rn = Get-WMIObject Win32_Process -computer servername -credential mydomain\administrator -filter "Name='program1.exe OR Name='program2.exe'"
Compare-Object $rn[0].path $rn[1].path # if there are only one instance for process with name program1.exe and program2.exe