Deoarece PowerShell se bazează pe .Net Framework și încorporează diverse alte tehnologii precum WMI și CIM, există întotdeauna mai multe metode de a realiza acelaș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:
Și stați liniștit pentru restul seriei toată săptămâna.
Mai devreme în serie, când v-am introdus în conductă, v-am arătat cum puteți să luați obiectele pe care le obțineți 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ă omoare fiecare instanță a notepad-ului cu o singură comandă. Răspunsul constă în ajutorul cmdletului Stop-Process.
ajutor Stop-Process -Full
Dacă vă uitați la ultima linie de cod din secțiunea de sintaxă, puteți vedea că parametrul InputObject acceptă un obiect de tip Process [], și ori de câte ori vedeți un tip urmat de două paranteze pătrate, aceasta î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.
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
Întrucât interogarea WMI returnează un fel de obiect propriu, va trebui să căutați o metodă care să oprească procesul, astfel încât să permită țevii ca Get-Member.
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 una. Pentru a apela o metodă pe un obiect WMI, pur și simplu o conduceți la Invoke-WmiMethod și specificați numele metodei.
Get-WmiObject - Clasa 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, nu uitați că comanda a fost executată cu succes.
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 o conducem în ForEach-Object pentru ai ucide pe toți.
Get-Process -Turn notepad ForEach-Object -Process $ _.Kill ()
Aici am luat toate obiectele procesului pe care Get-Process le-a returnat și le-a transferat în fișierul ForEach-Object. La fel ca în cazul cmdletului 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.
Alege una
Get-Process -Turn notepad Stop-proces
Alegerea a doua
Get-WmiObject - Clasa Win32_Process -Filter "name = 'notepad.exe" "| Invoke-WmiMethod - Termină
Alegerea a treia
Get-Process -Turn notepad ForEach-Object -Process $ _.Kill ()
Asta e tot pentru cei de această dată, văd săptămâna viitoare pentru mai multă distracție PowerShell.