11Sep

Geek School: Bekerja dengan Koleksi di PowerShell

click fraud protection

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

Pastikan untuk membaca artikel sebelumnya dalam seri:

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

Dan menantikan rangkaian seri sepanjang minggu ini.

Menggunakan Batch Cmdlets

Sebelumnya pada seri ini, ketika kami memperkenalkan Anda ke pipa, kami menunjukkan kepada Anda bagaimana Anda dapat mengambil benda-benda yang menghasilkan satu cmdlet dan memberi mereka masukan ke cmdlet lain menggunakan sesuatu seperti ini:

instagram viewer

Get-Process -Nama notepad |Stop-Process

Ini akan membunuh proses apapun dengan nama "notepad".Tapi Anda mungkin bertanya-tanya bagaimana PowerShell mampu membunuh setiap instance notepad dengan satu perintah. Jawabannya terletak 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 tipe Process [], dan setiap kali Anda melihat sebuah tipe diikuti oleh dua tanda kurung siku sepertibahwa itu berarti bahwa parameter tersebut menerima satu atau lebih dari tipe sebelumnya. Dalam kasus ini, ia menerima satu atau lebih objek proses. Secara teknis, kita akan mengatakan bahwa cmdlet InputObject menerima sebuah proses array .Kapan pun 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, namun hal itu masuk pada 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 permintaan WMI mengembalikan jenis objeknya sendiri, Anda perlu mencari metode yang dapat menghentikan prosesnya, jadiBiarkan pipa itu ke Get-Member.

Dapatkan-WmiObject -Class Win32_Proses |Get-Member

Sepertinya hal yang paling dekat untuk dihentikan adalah metode penghentian, jadi itu pasti salah satunya. Untuk memanggil metode pada Objek WMI, Anda cukup menyalurkannya ke Invoke-WmiMethod dan tentukan nama metodenya.

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

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

Enumeration

Gagal dua metode lainnya, jika Anda harus melakukan sesuatu pada sekelompok objek, Anda dapat menghitung keseluruhan objek dan bertindak pada masing-masing objek. Pertama, Anda harus menemukan metode yang akan Anda gunakan untuk menghentikan satu proses.

Get-Process |Get-Member -MemberType Method

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

Get-Process -Name notepad |ForEach-Object -Process{ $ _. Kill()}

Di sini kita mengambil semua objek proses yang Get-Process kembali dan meneruskannya ke cmdlet ForEach-Object. Sama seperti cmdlet Where-Object, kami mewakili setiap objek dalam pipa dengan $ _ yang bisa kami panggil ke metode Kill() .Dengan semua yang dikatakan dan dilakukan, pencacahan koleksi jauh lebih lambat dari pada metode di atas dan seharusnya hanya digunakan sebagai hasil akhir.

Ringkasan

Pilihan Satu

Get-Process -Name notepad |Stop-Process

Pilihan Dua

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

Pilihan Tiga

Get-Process -Name notepad |ForEach-Object -Process{ $ _. Kill()}

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