Powershell - фильтрация процессов WMIObject по нескольким именам - PullRequest
1 голос
/ 22 сентября 2011

Я пытаюсь получить список запущенных процессов и отфильтровать по двум именам процессов - может кто-нибудь сказать мне, как это работает?

До сих пор он работал и отфильтровывал одно имя процесса:

$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 ]

5 голосов
/ 29 марта 2013

Вот как получить полный набор объектов 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
4 голосов
/ 22 сентября 2011

Используйте операторы WQL, такие как OR, AND, LIKE и т. Д .:

Get-WMIObject Win32_Process -computer servername -credential mydomain\administrator -filter "Name='program1.exe' OR Name='program2.exe'"
1 голос
/ 22 сентября 2011

Создайте массив процессов, которые вы ищете:

$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
    }

Я закомментировал ваше сравнение, чтобы вы могли видеть, как мы четко проходим цикл.

0 голосов
/ 22 сентября 2011

если я правильно понял, попробуйте это:

$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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...