Esta é uma maneira de criar esse tipo de lista.
Primeiro, armazene todos os PIDs para o nome do processo em questão em uma matriz.
Em seguida, filtre a lista de processos para incluir apenas aqueles em que o PID principal também está nessa matriz.
Isso funciona porque o pai dos filhos iexplore será outro iexplore que está na matriz PID, e o pai do PRIMEIRO proce iexplore provavelmente era o Explorer, cujo PID não está nessa matriz.
$pids = (gwmi -Class win32_process -Filter 'name like "%iexplore%"' | select processid).processid
"PIDs"
$pids
"All Children"
gwmi -Class win32_process -Filter 'name like "%iexplore%"' | where { $_.parentprocessid -in $pids } | select -prop commandline,processid
"Children > Size"
gwmi -Class win32_process -Filter 'name like "%iexplore%"' | where { $_.parentprocessid -in $pids -and $_.ws -gt 500MB } | select -prop commandline,processid
"Parent(s)"
gwmi -Class win32_process -Filter 'name like "%iexplore%"' | where { $_.parentprocessid -notin $pids } | select -prop commandline,processid
Observe que você não pode fazer isso com um único pipeline que começa com Get-WmiObject -ComputerName $[list of servers]
. Isso cria uma coleção única de processos em vários dispositivos. Não há relacionamento de processo pai entre processos em diferentes dispositivos. Você precisará aninhar a enumeração do processo dentro de um loop que é executado em cada servidor.
foreach ($server in $listOfServers) {
$pids = (gwmi -comp $server win32_process -Filter 'name like "%iexplore%"' | select processid).processid
# Report only, no kill
gwmi -comp $server win32_process -Filter 'name like "%iexplore%"' | where { $_.parentprocessid -in $pids -and $_.ws -gt 500MB } | select -prop commandline,processid
# Kill, uncomment to enable
# gwmi -comp $server win32_process -Filter 'name like "%iexplore%"' | where { $_.parentprocessid -in $pids -and $_.ws -gt 500MB } | foreach { $_.terminate() }
}