Завершить дерево процессов в PowerShell с помощью идентификатора процесса - PullRequest
1 голос
/ 29 апреля 2019

Допустим, я запускаю несколько процессов из PowerShell:

$p1 = $(Start-Process -PassThru ./example.exe)
$p2 = $(Start-Process -PassThru ./example.exe)

example.exe собирается порождать несколько дочерних процессов с одинаковыми именами.

Как мне убить просто $p1 и его дочерние процессы, не убивая $p2 и его дочерние процессы?

Просто запуск Stop-Process $p1 убивает только родительский процесс $p1, оставляя его дочерние процессы.

Все ответы, которые я видел до сих пор, включают в себя уничтожение всех процессов с определенным именем, но здесь это не сработает.

Ответы [ 2 ]

0 голосов
/ 01 мая 2019

Так что я не мог найти хороший способ сделать это, поэтому я написал вспомогательную функцию, которая использует рекурсию для перехода по дереву процессов:

function Kill-Tree {
    Param([int]$ppid)
    Get-CimInstance Win32_Process | Where-Object { $_.ParentProcessId -eq $ppid } | ForEach-Object { Kill-Tree $_.ProcessId }
    Stop-Process -Id $ppid
}

Чтобы использовать его, поместите его где-нибудь в сценарий PowerShell, а затем просто назовите его так:

Kill-Tree <process_id>
0 голосов
/ 29 апреля 2019

Start-Process с -Passthru возвращает объект System.Diagnostics.Process . Этот объект имеет свойство Id , которое генерируется Windows и является уникальным.

Stop-Process имеет несколько подписей Один ищет процесс по Id, один по имени, а другой - по объекту Process.

Вы используете -Passthru и фиксируете вывод start-process в $p1, так что вы можете просто передать этот объект в Stop-Process.

Stop-Process $p1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...