Beranda » bagaimana » Sekolah Geek Bekerja dengan Koleksi di PowerShell

    Sekolah Geek Bekerja dengan Koleksi di PowerShell

    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 seri ini:

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

    Dan tetap disini selama sisa seri sepanjang minggu.

    Menggunakan Cmdlet Batch

    Sebelumnya dalam seri, ketika kami memperkenalkan Anda ke pipeline, kami menunjukkan kepada Anda bagaimana Anda dapat mengambil objek yang dihasilkan oleh satu cmdlet dan meneruskannya sebagai input ke cmdlet lain menggunakan sesuatu seperti ini:

    Get-Process -Name notepad | Stop-Proses

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

    bantu Stop-Proses -Full

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

    Menggunakan WMI

    Meskipun WMI bukan teknologi terbaik untuk dikirim dari kantor pusat Microsoft, WMI menempati urutan kedua dalam daftar cara bekerja dengan koleksi objek. Kita bisa dengan mudah mendapatkan daftar proses yang berjalan dari kelas Win32_Process seperti:

    Dapatkan-WmiObject -Class Win32_Process

    Karena kueri WMI mengembalikan jenis objeknya sendiri, Anda perlu mencari metode yang dapat menghentikan proses, jadi mari kita beri pipa itu ke Get-Member.

    Dapatkan-WmiObject -Class Win32_Process | Dapatkan Anggota

    Sepertinya hal yang paling dekat untuk berhenti adalah metode terminate, jadi itu yang harus dilakukan. Untuk memanggil metode pada objek WMI, Anda cukup pipa itu ke Invoke-WmiMethod dan tentukan nama metode.

    Dapatkan-WmiObject -Class Win32_Process -Filter “name = 'notepad.exe'” | Invoke-WmiMethod -Name Terminate

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

    Pencacahan

    Gagal dua metode lainnya, jika Anda harus melakukan sesuatu pada banyak objek, Anda dapat menghitung seluruh objek dan bertindak pada masing-masing objek. 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 pipa ke ForEach-Object untuk membunuh mereka semua.

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

    Di sini kami mengambil semua objek proses yang Get-Process kembali dan meneruskannya ke cmdlet ForEach-Object. Sama seperti cmdlet Where-Object, kami mewakili setiap objek dalam pipeline dengan $ _ yang dapat kami panggil ke metode Kill () aktif. Dengan semua yang dikatakan dan dilakukan, menghitung koleksi jauh lebih lambat daripada metode di atas dan hanya boleh digunakan sebagai hasil terakhir.

    Ringkasan

    Pilihan Satu

    Get-Process -Name notepad | Stop-Proses

    Pilihan Dua

    Dapatkan-WmiObject -Class Win32_Process -Filter “name = 'notepad.exe'” | Invoke-WmiMethod -Name Terminate

    Pilihan Tiga

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

    Itu saja untuk saat ini, kawan, sampai jumpa minggu depan untuk lebih banyak kesenangan PowerShell.