Laman » bagaimana untuk » Sekolah Geek Bekerja dengan Koleksi di PowerShell

    Sekolah Geek Bekerja dengan Koleksi di PowerShell

    Oleh kerana PowerShell didasarkan pada Rangka Kerja Bersih dan menggabungkan pelbagai teknologi lain seperti WMI dan CIM, selalu ada lebih dari satu cara untuk mencapai perkara yang sama. Datang menyertai kami untuk jawatan pendek ini di mana kami belajar cara memilih kaedah terbaik untuk mencapai tugas kami.

    Pastikan anda membaca artikel sebelumnya dalam siri ini:

    • Ketahui Bagaimana Mengotomatikkan Windows dengan PowerShell
    • Belajar Menggunakan Cmdlets di PowerShell
    • Belajar Cara Menggunakan Objek di PowerShell
    • Pemformatan Pembelajaran, Penapisan dan Pembandingan di PowerShell
    • Belajarlah Menggunakan Remoting dalam PowerShell
    • Menggunakan PowerShell untuk Dapatkan Maklumat Komputer

    Dan tunggu selama siri sepanjang minggu.

    Menggunakan Cmdlets Batch

    Terdahulu dalam siri ini, apabila kami memperkenalkan anda ke saluran paip, kami menunjukkan kepada anda bagaimana anda boleh mengambil objek yang satu output cmdlet dan lulusnya sebagai masukan ke cmdlet lain menggunakan sesuatu seperti ini:

    Get-Process -Name notepad | Proses Berhenti

    Ini akan membunuh sebarang proses dengan nama "notepad". Tetapi anda mungkin tertanya-tanya bagaimana PowerShell dapat membunuh setiap notepad dengan satu arahan. Jawapannya terletak dalam bantuan cmdlet Stop-Process.

    membantu Stop-Process-Full

    Jika anda melihat baris terakhir kod dalam bahagian sintaks, anda dapat melihat bahawa parameter InputObject menerima objek jenis Proses [], dan apabila anda melihat jenis yang diikuti oleh dua kurungan persegi seperti itu ia bermakna parameter itu menerima satu atau lebih jenis sebelumnya. Dalam kes ini, ia menerima satu atau lebih objek proses. Secara teknikal, kita akan mengatakan bahawa cmdlet InputObject menerima proses array. Setiap kali anda mempunyai cmdlet yang menyokong operasi kumpulan dengan cara ini, gunakannya. Ini adalah pilihan nombor satu.

    Menggunakan WMI

    Walaupun WMI bukan sekadar teknologi terbaik untuk dihantar dari Microsoft HQ, ia datang pada saat kedua dalam senarai bagaimana untuk bekerja dengan koleksi objek. Kita boleh dengan mudah mendapatkan senarai proses berjalan dari kelas Win32_Process seperti:

    Get-WmiObject -Class Win32_Process

    Memandangkan pertanyaan WMI mengembalikan objek semacam itu sendiri, anda perlu mencari kaedah yang boleh menghentikan proses itu, sehingga membolehkan paip itu untuk Dapatkan Ahli.

    Get-WmiObject -Class Win32_Process | Dapatkan Ahli

    Nampaknya perkara yang paling dekat untuk dihentikan ialah kaedah tamat, jadi itu mestilah. Untuk memanggil kaedah pada Objek WMI, anda hanya paip ke Invoke-WmiMethod dan nyatakan nama kaedah.

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

    Hebat, yang melakukan silap mata itu. Setiap kali anda mendapat ReturnValue 0 di WMI, ingatlah bahawa arahan itu berjaya dilaksanakan.

    Penghitungan

    Gagal dua kaedah lain, jika anda perlu melakukan sesuatu untuk sekumpulan objek, anda boleh menghitung keseluruhan objek dan bertindak pada setiap objek individu. Mula-mula anda perlu mencari kaedah yang anda gunakan untuk menghentikan satu proses.

    Get-Process | Kaedah Get-Member -MemberType

    Sempurna, nampaknya kita boleh menggunakan kaedah Kill dan kemudian paip ke ForEach-Object untuk membunuh mereka semua.

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

    Di sini, kita mengambil semua objek proses yang Proses Get-kembali dan lulusnya ke cmdlet ForEach-Object. Sama seperti cmdlet Dimensi-Objek, kami mewakili setiap objek dalam talian paip dengan $ _ yang kami dapat panggil ke kaedah Kill () pada. Dengan semua yang dikatakan dan dilakukan, menghitung koleksi jauh lebih lambat daripada kaedah di atas dan hanya boleh digunakan sebagai hasil terakhir.

    Ringkasan

    Pilihan Satu

    Get-Process -Name notepad | Proses Berhenti

    Pilihan Dua

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

    Pilihan Tiga

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

    Itu sahaja untuk masa ini orang, lihat minggu depan untuk lebih menyeronokkan PowerShell.