Școala Geek care lucrează cu colecții în PowerShell
Deoarece PowerShell se bazează pe .Net Framework și încorporează diverse alte tehnologii precum WMI și CIM, există întotdeauna mai multe metode de realizare a aceluiași lucru. Vino alături de noi pentru acest post scurt unde învățăm cum să alegem cea mai bună metodă pentru a ne îndeplini sarcinile.
Asigurați-vă că citiți articolele anterioare din seria:
- Aflați cum să automatizați Windows cu PowerShell
- Învățarea de a folosi Cmdlets în PowerShell
- Învățați cum să utilizați obiecte în PowerShell
- Formatul de învățare, filtrarea și compararea în PowerShell
- Aflați cum să utilizați Remoting în PowerShell
- Folosind PowerShell pentru a obține informații despre computer
Și stați pe toată săptămâna pentru restul seriei.
Folosind modulele batch
Mai devreme în serie, când v-am introdus în conductă, v-am arătat cum puteți să luați obiectele pe care o extrage câte un cmdlet și să le transmiteți ca intrări unui alt cmdlet folosind ceva de genul:
Get-Process -Turn notepad Stop-proces
Acest lucru ar ucide orice proces cu numele "notepad". Dar probabil vă întrebați cum PowerShell este capabil să ucidă fiecare instanță a notepad-ului cu o singură comandă. Răspunsul constă în ajutorul cmdletului Stop-Process.
ajutor Stop-Process -Full
Dacă te uiți la ultima linie de cod din secțiunea de sintaxă, poți vedea că parametrul InputObject acceptă un obiect de tip Process [], și ori de câte ori vezi un tip urmat de două paranteze pătrate ca asta înseamnă că parametrul acceptă una sau mai multe de tipul precedent. În acest caz, acceptă unul sau mai multe obiecte de proces. Din punct de vedere tehnic, am spune că cmdletul InputObject acceptă un proces mulțime. Ori de câte ori aveți un cmdlet care acceptă operațiile lotului în acest mod, utilizați-l. Aceasta este prima alegere.
Utilizarea WMI
Deși WMI nu este cea mai bună tehnologie de transportat de la sediul Microsoft, acesta se află pe locul al doilea pe lista de lucru cu colecțiile de obiecte. Am putea obține cu ușurință o listă de procese care rulează din clasa Win32_Process așa:
Obțineți-WmiObject -Class Win32_Process
Deoarece interogarea WMI returnează propriul tip de obiect, va trebui să căutați o metodă care să oprească procesul, astfel încât permite țevii ca să obțină.
Obțineți-WmiObject -Class Win32_Process | Get-membru
Se pare că cel mai apropiat lucru pe care trebuie să-l oprești este metoda terminată, așa că trebuie să fie cea. Pentru a apela o metodă pe un obiect WMI, pur și simplu o conduceți la Invoke-WmiMethod și specificați numele metodei.
Obțineți-WmiObject -Class Win32_Process -Filter "name = 'notepad.exe" "| Invoke-WmiMethod - Termină
Mare, a făcut truc. Ori de câte ori primiți ReturnValue de 0 în WMI, amintiți-vă că comanda a fost executată cu succes.
Enumerare
Dacă nu reușiți celelalte două metode, dacă trebuie să faceți ceva la o grămadă de obiecte, puteți enumera întregul obiect și puteți acționa asupra fiecărui obiect individual. Mai întâi trebuie să găsiți metoda pe care ați folosi-o pentru a opri un singur proces.
Get-Process | Obțineți-Membru -MembruTip Metoda
Perfect, se pare că putem folosi metoda Kill și apoi conducem în ForEach-Object pentru a le ucide pe toate.
Get-Process -Turn notepad ForEach-Object -Process $ _. Kill ()
Aici am luat toate obiectele procesului pe care Get-Process le-a returnat și le-a transmis în fișierul ForEach-Object. La fel ca și cmdletul Where-Object, am reprezentat fiecare obiect în conductă cu $ _ pe care am putut să-l apelăm la metoda Kill (). Cu tot ceea ce sa spus și făcut, enumerarea unei colecții este mult mai lentă decât metodele de mai sus și ar trebui utilizată doar ca un ultim rezultat.
rezumat
Alege una
Get-Process -Turn notepad Stop-proces
Alegerea a doua
Obțineți-WmiObject -Class Win32_Process -Filter "name = 'notepad.exe" "| Invoke-WmiMethod - Termină
Alegerea a treia
Get-Process -Turn notepad ForEach-Object -Process $ _. Kill ()
Asta e tot pentru oamenii de această dată, văd săptămâna viitoare pentru mai mult distracție PowerShell.