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.