11Sep

Geek School: Arbeider med samlinger i PowerShell

click fraud protection

Siden PowerShell er basert på. Net Framework og inkorporerer ulike andre teknologier som WMI og CIM, er det alltid mer enn én måte å oppnå det samme. Kom med oss ​​for denne korte innlegget der vi lærer å velge den beste metoden for å utføre oppgavene våre.

Husk å lese de forrige artiklene i serien:

  • Lær hvordan du automatiserer Windows med PowerShell
  • Lær å bruke Cmdlets i PowerShell
  • Lær hvordan du bruker objekter i PowerShell
  • Læringsformatering, filtrering og sammenligning i PowerShell
  • Lær å bruke Remoting iPowerShell
  • Bruke PowerShell til å få datamaskininformasjon

Og hold deg innstilt for resten av serien hele uken.

Bruke Batch Cmdlets

Tidligere i serien, da vi introduserte deg til rørledningen, viste vi deg hvordan du kan ta objektene som en cmdlet utgir og sende dem som input til en annen cmdlet ved å bruke noe slikt:

Get-Process -Navn notisblokk |Stopp-Prosess

Dette ville drepe noen prosess med navnet "notisblokk".Men du lurer nok på hvordan PowerShell kan drepe alle forekomster av notisblokk med en enkelt kommando. Svaret ligger i hjelp av Stop-Process cmdlet.

instagram viewer

hjelp Stopp prosess - Full

Hvis du ser på den siste koden i syntaksekseksjonen, kan du se at parameteren InputObject aksepterer et objekt av typen Prosess [], og når du ser en type etterfulgt av to firkantede parenteser somat det betyr at parameteren aksepterer en eller flere av den forrige typen. I dette tilfellet aksepterer det ett eller flere prosessobjekter. Teknisk sett vil vi si at InputObject cmdlet aksepterer en prosess array .Når du har en cmdlet som støtter batchoperasjoner på denne måten, bruk den. Dette er valg nummer ett.

Bruke WMI

Selv om WMI ikke er det beste stykket teknologien som skal sendes fra Microsoft HQ, kommer det inn i andre på listen over hvordan man arbeider med samlinger av objekter. Vi kunne lett få en liste over kjørende prosesser fra Win32_Process-klassen slik:

Get-WmiObject -Class Win32_Process

Siden WMI-spørringen returnerer sin egen type objekt, må du se etter en metode som kan stoppe prosessen, såLa det røre det til Get-Member.

Get-WmiObject -Class Win32_Process |Få-medlem

Ser ut som det nærmeste å stoppe, er termineringsmetoden, så det må være den ene. For å ringe en metode på et WMI-objekt, rør du det bare til Invoke-WmiMethod og spesifiser navnet på metoden.

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

Flott, det gjorde kunsten. Når du får en ReturnValue på 0 i WMI, husk bare at kommandoen kjøres vellykket.

Oppsummering

Hvis du ikke gjør noe for en gruppe objekter, kan du oppsummere hele objektet og handle på hvert enkelt objekt. Først må du finne metoden du vil bruke for å stoppe en enkelt prosess.

Get-Process |Get-Member-MemberType Metode

Perfekt, det ser ut til at vi kan bruke Kill-metoden og deretter røre inn i ForEach-Object for å drepe dem alle.

Get-Process-Name notisblokk |ForEach-Object -Process{ $ _. Kill()}

Her tok vi alle prosessobjektene som Get-Process returnerte og sendte dem til ForEach-Object cmdlet. I likhet med cmdlet hvor objektet representerte, representerte vi hvert objekt i rørledningen med $ _ som vi kunne kalle til Kill() -metoden på.Med alt det som er sagt og gjort, er oppsummering en samling mye tregere enn de ovennevnte metodene, og bør bare brukes som et siste resultat.

Sammendrag

Valg En

Get-Process-Name notisblokk |Stopp-Prosess

Valg to

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

Valg Tre

Get-Process-Name notisblokk |ForEach-Object-Process{ $ _. Kill()}

Det er alt for denne gangen folk, ser deg neste uke for mer PowerShell-moro.