11Sep

Geek School: Lucrul cu colecții în PowerShell

click fraud protection

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ățați să utilizați cmdlets în PowerShell
  • Învățați cum să utilizați obiecte în PowerShell
  • Învățați formaterea, filtrarea și compararea în PowerShell
  • Aflați cum să utilizați Remoting înPowerShell
  • Folosind PowerShell pentru a obține informația despre computer

Și stați acordat pentru restul seriilor toată săptămâna.

Utilizarea modulelor de tip

Mai devreme în serie, când v-am introdus în conductă, am arătat cum puteți prelua obiectele pe care le emite unul cmdlet și le transmiteți ca intrări în alt cmdlet utilizând ceva de genul:

Get-Process -Fișier de numeStop-Process

instagram viewer

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.

ajuta 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ătratecă înseamnă că parametrul acceptă unul 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 matrice de proces .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 Microsoft HQ, aceasta se află pe locul al doilea pe lista de lucru cu colecțiile de obiecte. Am putut obține cu ușurință o listă de procese care rulează din clasa Win32_Process, după cum urmează:

Get-WmiObject -Class Win32_Process

Deoarece interogarea WMI returnează un tip propriu de obiect, va trebui să căutați o metodă care să oprească procesul,permite țevii asta pentru a obține Membru.

Obțineți-WmiObject -Class Win32_Process |Get-Member

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, asta a făcut trucul. Ori de câte ori primiți ReturnValue de 0 în WMI, nu uitați că comanda a fost executată cu succes.

Enumerarea

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-ProcessMetoda Get-Member -MemberType

Perfect, se pare că putem folosi metoda Kill și apoi țeavă în ForEach-Object pentru a le ucide pe toate.

Get-Process -Name notepadPentru toate obiectele de proces pe care Get-Process le-a returnat și le-au 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.

Rezumat

Alegerea unui proces

Get-Process -Name notepadOprire proces

Alegerea două

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

Alegerea trei

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

Asta e tot pentru oamenii de această dată, văd săptămâna viitoare pentru mai mult distracție PowerShell.