I'm attempting to kill a parent process and it's child process (There will only be one child) on a remote computer. When executing this script (Which is part of a larger one) i get the following error. PowerShell Newbie, so any suggestions for improvement beyond solving the error are most welcome.
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
Script:
$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
Kesalahan yang Anda dapatkan adalah karena baris berikut diekspresikan dengan tidak benar:
Get-Process $args[0] -ErrorAction SilentlyContinue | ForEach Kill-ChildProcess -id {$_.ID};
Kesalahan mencoba (dengan cara microsoft) untuk memberi tahu Anda bahwa itu memerlukan blok skrip setelah ForEach
. Ganti baris dengan berikut ini untuk melanjutkan kesalahan tersebut:
Get-Process $args[0] -ErrorAction SilentlyContinue | ForEach {Kill-ChildProcess -id $_.ID}
Selain itu, hanya sebagai tambahan, tetapi PowerShell tidak memerlukan terminator baris kecuali Anda memproses beberapa perintah pada baris yang sama di shell. Singkatnya, Anda tidak perlu mengakhiri setiap baris dengan ;
.
Setelah ForEach-Object (atau alias: ForEach,%)
tempatkan kode yang mengikuti kurung kurawal {}
.
Jadi ubah baris ini dari yang Anda miliki:
Get-Process $args[0] -ErrorAction SilentlyContinue | ForEach Kill-ChildProcess -id {$_.ID};
menjadi ini, yang dengan benar menempatkan kurung kurawal di sekitar kode setelah ForEach-Object
:
Get-Process $args[0] -ErrorAction SilentlyContinue | ForEach { Kill-ChildProcess -id $_.ID }
Beri tahu kami jika itu menyelesaikan pesan kesalahan spesifik yang Anda posting.
Juga, berikut adalah beberapa informasi tentang penggunaan ForEach-Object
untuk referensi Anda:
Mulai di Windows PowerShell 3.0, ada dua cara berbeda untuk buat perintah
ForEach-Object
.Blok skrip.
Anda dapat menggunakan blok skrip untuk menentukan operasi. Di dalam naskah blok, gunakan variabel
$ _
untuk mewakili objek saat ini. Itu blok skrip adalah nilai parameter Proses. Blok skrip dapat berisi skrip Windows PowerShell.Misalnya, perintah berikut mendapatkan nilai ProcessName properti dari setiap proses di komputer.
Get-Process | ForEach-Object {$ _. ProcessName}
Pernyataan operasi .
Anda juga dapat menulis pernyataan operasi, yang lebih mirip bahasa alami. Anda dapat menggunakan pernyataan operasi untuk menentukan a nilai properti atau panggil metode. Pernyataan operasi diperkenalkan di Windows PowerShell 3.0.
Misalnya, perintah berikut juga mendapatkan nilai Properti ProcessName dari setiap proses di komputer.
Get-Process | ForEach-Object ProcessName
Saat menggunakan format blok skrip, selain menggunakan skrip blok yang menjelaskan operasi yang dilakukan pada setiap input objek, Anda dapat memberikan dua blok skrip tambahan.
Mulai
blok skrip, yang merupakan nilai parameter Begin, dijalankan sebelumnya objek masukan pertama diproses. Blok skripEnd
, yaitu nilai parameter End, dijalankan setelah objek input terakhir adalah diproses.