If-Koubou

Geek School: Bekerja dengan Koleksi di PowerShell

Geek School: Bekerja dengan Koleksi di PowerShell (Bagaimana caranya)

Karena PowerShell didasarkan pada .Net Framework dan menggabungkan berbagai teknologi lain seperti WMI dan CIM, selalu ada lebih dari satu cara untuk mencapai hal yang sama. Bergabunglah bersama kami untuk posting singkat ini di mana kami belajar bagaimana memilih metode terbaik untuk menyelesaikan tugas kami.

Pastikan untuk membaca artikel sebelumnya dalam rangkaian:

  • Pelajari Cara Mengotomatiskan Windows dengan PowerShell
  • Belajar Menggunakan Cmdlet di PowerShell
  • Mempelajari Cara Menggunakan Objek di PowerShell
  • Belajar Memformat, Memfilter dan Membandingkan dalam PowerShell
  • Belajar Menggunakan Remoting di PowerShell
  • Menggunakan PowerShell untuk Mendapatkan Informasi Komputer

Dan nantikan terus sisa serial ini sepanjang minggu.

Menggunakan Batch Cmdlet

Sebelumnya di dalam seri, ketika kami memperkenalkan Anda ke pipeline, kami menunjukkan Anda bagaimana Anda dapat mengambil objek yang satu cmdlet output dan meneruskannya sebagai masukan ke cmdlet lain menggunakan sesuatu seperti ini:

Dapatkan-Proses -Name notepad | Stop-Process

Ini akan membunuh proses apa pun dengan nama "notepad". Tetapi Anda mungkin bertanya-tanya bagaimana PowerShell mampu membunuh setiap instance dari notepad dengan satu perintah. Jawabannya ada pada bantuan cmdlet Stop-Process.

membantu Stop-Process -Full

Jika Anda melihat baris kode terakhir di bagian sintaks, Anda dapat melihat bahwa parameter InputObject menerima objek bertipe Proses [], dan kapan pun Anda melihat tipe yang diikuti oleh dua tanda kurung siku seperti itu berarti parameter tersebut menerima satu atau lebih dari tipe sebelumnya. Dalam hal ini, ia menerima satu atau lebih objek proses. Secara teknis, kami akan mengatakan bahwa cmdlet InputObject menerima proses larik. Setiap kali Anda memiliki cmdlet yang mendukung operasi batch dengan cara ini, gunakanlah. Ini adalah pilihan nomor satu.

Menggunakan WMI

Meskipun WMI bukanlah teknologi terbaik untuk dikirimkan dari Microsoft HQ, WMI berada di urutan kedua dalam daftar cara bekerja dengan koleksi objek. Kita bisa dengan mudah mendapatkan daftar proses yang berjalan dari kelas Win32_Process seperti:

Get-WmiObject -Class Win32_Process

Karena kueri WMI mengembalikan jenis objeknya sendiri, Anda harus mencari metode yang dapat menghentikan proses, sehingga memungkinkan pipa untuk Mendapatkan Anggota.

Get-WmiObject -Class Win32_Process | Dapatkan-Anggota

Sepertinya hal yang paling dekat untuk dihentikan adalah metode pengakhiran, jadi itu harus menjadi satu. Untuk memanggil metode pada Objek WMI, Anda cukup menyalurkannya ke Invoke-WmiMethod dan menentukan nama metode.

Get-WmiObject -Class Win32_Process -Filter "name = 'notepad.exe'" | Invoke-WmiMethod -Name Hentikan

Hebat, itu berhasil. Setiap kali Anda mendapatkan ReturnValue 0 di WMI, ingatlah bahwa perintah berhasil dijalankan.

Pencacahan

Gagal dengan dua metode lainnya, jika Anda harus melakukan sesuatu pada sekelompok objek, Anda dapat menyebutkan seluruh objek dan bertindak pada setiap objek individual. Pertama Anda harus menemukan metode yang akan Anda gunakan untuk menghentikan satu proses.

Dapatkan-Proses | Get-Member -MemberType Method

Sempurna, sepertinya kita bisa menggunakan metode Kill dan kemudian menyalurkannya ke ForEach-Object untuk membunuh mereka semua.

Dapatkan-Proses -Name notepad | ForEach-Object -Process $ _. Kill ()

Di sini kami mengambil semua objek proses yang Get-Process dikembalikan dan meneruskannya ke cmdlet ForEach-Object. Sama seperti cmdlet Di mana-Obyek, kami mewakili setiap objek dalam pipa dengan $ _ yang dapat kami panggil ke metode Kill () di. Dengan semua yang dikatakan dan dilakukan, enumerasi koleksi jauh lebih lambat daripada metode di atas dan seharusnya hanya digunakan sebagai hasil akhir.

Ringkasan

Pilihan Satu

Dapatkan-Proses -Name notepad | Stop-Process

Pilihan Dua

Get-WmiObject -Class Win32_Process -Filter "name = 'notepad.exe'" | Invoke-WmiMethod -Name Hentikan

Pilihan Tiga

Dapatkan-Proses -Name notepad | ForEach-Object -Process $ _. Kill ()

Itu saja untuk orang-orang kali ini, sampai jumpa minggu depan untuk lebih banyak kesenangan PowerShell.