Geek School Arbeider med samlinger i PowerShell
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 dette korte innlegget hvor 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ære å bruke Cmdlets i PowerShell
- Lære hvordan du bruker objekter i PowerShell
- Læreformatering, filtrering og sammenligning i PowerShell
- Lær å bruke Remoting i PowerShell
- Bruke PowerShell til å få informasjon om datamaskinen
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-Name notisblokk | Stop-Process
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.
hjelp Stopp-prosess -Full
Hvis du ser på siste linje av kode 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, betyr det at parameteren aksepterer en eller fler av den foregående type. I dette tilfellet aksepterer det ett eller flere prosessobjekter. Teknisk sett vil vi si at InputObject cmdlet aksepterer en prosess matrise. 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 på sekunden 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 lete etter en metode som kan stoppe prosessen, så vi kan pipe det til Get-Member.
Get-WmiObject -Class Win32_Process | Get-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 Terminate
Flott, det gjorde kunsten. Når du får en ReturnValue på 0 i WMI, husk bare at kommandoen kjøres vellykket.
oppregning
Mangler de to andre metodene, hvis du må gjøre noe til en haug med 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 | Få-medlem-medlemmetype 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 ett
Get-Process-Name notisblokk | Stop-Process
Valg to
Get-WmiObject -Class Win32_Process -Filter "name = 'notepad.exe'" | Invoke-WmiMethod-Name Terminate
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.