Killing Parent and Child processes on Remote with Powershell

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
3
задан 16 November 2015 в 19:40
2 ответа

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 ; .

4
ответ дан 3 December 2019 в 05:41

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 skrip End , yaitu nilai parameter End, dijalankan setelah objek input terakhir adalah diproses.

1
ответ дан 3 December 2019 в 05:41

Теги

Похожие вопросы