Назад | Перейти на главную страницу

Удаление родительских и дочерних процессов на удаленном компьютере с помощью Powershell

Я пытаюсь убить родительский процесс и его дочерний процесс (будет только один дочерний процесс) на удаленном компьютере. При выполнении этого сценария (который является частью более крупного сценария) я получаю следующую ошибку. Новичок в PowerShell, поэтому приветствуются любые предложения по улучшению помимо устранения ошибки.

Cannot bind parameter 'Process'. Cannot convert the "Kill-ChildProcess" value of type "System.String" to type "System.Management.Automation.ScriptBlock".
        + CategoryInfo          : InvalidArgument: (:) [ForEach-Object], ParameterBindingException
        + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.ForEachObjectCommand

Сценарий:

$scriptBlock =  {                 
        function Kill-ChildProcess(){
            param($ID=$PID)
                $CustomColumnID = @{
                Name = 'Id'
                Expression = { [Int[]]$_.ProcessID }
                }

                Write-Host $ID
                $result = Get-WmiObject -Class Win32_Process -Filter "ParentProcessID=$ID" |
                Select-Object -Property ProcessName, $CustomColumnID, CommandLine

                $result | Where-Object { $_.ID -ne $null } | Stop-Process
        }


         Get-Process $args[0] -ErrorAction SilentlyContinue | ForEach Kill-ChildProcess -id {$_.ID};
         Get-Process $args[0] -ErrorAction SilentlyContinue | Stop-Process -ErrorAction SilentlyContinue;
    };


Invoke-Command -Session $session  -ArgumentList $processToKill -ScriptBlock $scriptBlock

Ошибка, которую вы получаете, связана с неправильным выражением следующей строки:

Get-Process $args[0] -ErrorAction SilentlyContinue | ForEach Kill-ChildProcess -id {$_.ID};

Ошибка пытается (в стиле Microsoft) сообщить вам, что ему нужен блок скрипта после ForEach. Замените строку следующей, чтобы продолжить после этой ошибки:

Get-Process $args[0] -ErrorAction SilentlyContinue | ForEach {Kill-ChildProcess -id $_.ID}

Кроме того, просто в сторону, но PowerShell не требует терминаторов строки, если вы не обрабатываете несколько команд в одной строке в оболочке. Короче говоря, вам не нужно заканчивать каждую строку ;.

После вашего ForEach-Object (or aliases: ForEach, %) поместите следующий код в фигурные скобки {}.

Так что измените эту строку с того, что у вас есть:

Get-Process $args[0] -ErrorAction SilentlyContinue | ForEach Kill-ChildProcess -id {$_.ID};

к этому, что правильно помещает фигурные скобки вокруг кода после ForEach-Object:

 Get-Process $args[0] -ErrorAction SilentlyContinue | ForEach { Kill-ChildProcess -id $_.ID }

Сообщите нам, решит ли это конкретное сообщение об ошибке, которое вы опубликовали.


Кроме того, вот некоторая информация об использовании ForEach-Object для справки:

Начиная с Windows PowerShell 3.0, существует два разных способа создания ForEach-Object команда.

Блок скрипта.

Вы можете использовать блок скрипта, чтобы указать операцию. Внутри блока сценария используйте $_ переменная для представления текущего объекта. Блок скрипта - это значение параметра Process. Блок скрипта может содержать любой скрипт Windows PowerShell.

Например, следующая команда получает значение свойства ProcessName каждого процесса на компьютере.

Get-Process | ForEach-Object {$_.ProcessName}

Заявление о работе.

Вы также можете написать оператор операции, который больше похож на естественный язык. Вы можете использовать оператор операции, чтобы указать значение свойства или вызвать метод. Операторы операций были введены в Windows PowerShell 3.0.

Например, следующая команда также получает значение свойства ProcessName каждого процесса на компьютере.

Get-Process | ForEach-Object ProcessName

При использовании формата блока сценария, помимо использования блока сценария, описывающего операции, выполняемые с каждым входным объектом, вы можете предоставить два дополнительных блока сценария. В Begin блок скрипта, который является значением параметра Begin, запускается до обработки первого входного объекта. В End блок скрипта, который является значением параметра End, запускается после обработки последнего входного объекта.