Я пытаюсь убить родительский процесс и его дочерний процесс (будет только один дочерний процесс) на удаленном компьютере. При выполнении этого сценария (который является частью более крупного сценария) я получаю следующую ошибку. Новичок в 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, запускается после обработки последнего входного объекта.