Geek School Arbejder med samlinger i PowerShell
Da PowerShell er baseret på. Net Framework og inkorporerer forskellige andre teknologier som WMI og CIM, er der altid mere end én måde at opnå det samme. Kom med os til denne korte post, hvor vi lærer at vælge den bedste metode til at udføre vores opgaver.
Sørg for at læse de tidligere artikler i serien:
- Lær at automatisere Windows med PowerShell
- Lære at bruge Cmdlets i PowerShell
- Lære at bruge objekter i PowerShell
- Learning Formatering, filtrering og sammenligning i PowerShell
- Lær at bruge fjernelse i PowerShell
- Brug af PowerShell til at få computeroplysninger
Og hold dig indstillet til resten af serien hele ugen.
Brug af Batch Cmdlets
Tidligere i serien, da vi introducerede dig til rørledningen, viste vi dig, hvordan du kan tage de objekter, som en cmdlet udsender og sende dem som input til en anden cmdlet ved at bruge noget som dette:
Get-Process -Name notesblok | Stop-Proces
Dette ville dræbe enhver proces med navnet "notesblok". Men du undrer dig nok, hvordan PowerShell kan dræbe alle forekomster af notesblok med en enkelt kommando. Svaret ligger inden for hjælp af Stop-Process cmdlet.
hjælp Stop-Process -Full
Hvis du ser på den sidste linje af kode i syntakseksektionen, kan du se, at parameteren InputObject accepterer et objekt af typen Process [], og når du ser en type efterfulgt af to firkantede parenteser, betyder det, at parameteren accepterer en eller flere af den foregående type. I dette tilfælde accepterer den et eller flere procesobjekter. Teknisk set vil vi sige, at InputObject cmdlet accepterer en proces matrix. Når du har en cmdlet, der understøtter batch-operationer på denne måde, skal du bruge den. Dette er valg nummer et.
Brug af WMI
Selv om WMI ikke er det bedste stykke teknologi, der skal sendes fra Microsoft HQ, kommer det ind på anden måde på listen over, hvordan man arbejder med samlinger af objekter. Vi kunne nemt få en liste over kørende processer fra Win32_Process-klassen som sådan:
Get-WmiObject -Class Win32_Process
Da WMI-forespørgslen returnerer sin egen type objekt, skal du søge efter en metode, der kan stoppe processen, så lad os røre det til Get-Member.
Get-WmiObject -Class Win32_Process | Get-medlem
Det ser ud til, at den nærmeste ting at stoppe er termineringsmetoden, så det må være den ene. For at kalde en metode på et WMI-objekt, rør du det bare til Invoke-WmiMethod og angiver navnet på metoden.
Get-WmiObject -Class Win32_Process -Filter "name = 'notepad.exe'" | Invoke-WmiMethod-Name Afslut
Godt, det gjorde tricket. Når du får en ReturnValue på 0 i WMI, skal du bare huske, at kommandoen udføres med succes.
Enumeration
Manglende de to andre metoder, hvis du skal gøre noget for en masse genstande, kan du opregne hele objektet og handle på hvert enkelt objekt. Først skal du finde den metode, du vil bruge til at stoppe en enkelt proces.
Get-Process | Get-Member-Member Type-metode
Perfekt, det ser ud til, at vi kan bruge Kill-metoden og derefter røres i ForEach-Object for at dræbe dem alle.
Get-Process -Name notesblok | ForEach-Object-Process $ _. Kill ()
Her tog vi alle de procesobjekter, som Get-Process returnerede og sendte dem videre til cmclet ForEach-Object. Meget som cmdlet hvor der var objekt, repræsenterede vi hvert objekt i rørledningen med $ _ som vi kunne kalde til Kill () -metoden på. Med alt det, der er sagt og gjort, er opsummering af en samling meget langsommere end ovennævnte metoder og bør kun bruges som et sidste resultat.
Resumé
Choice One
Get-Process -Name notesblok | Stop-Proces
Valg to
Get-WmiObject -Class Win32_Process -Filter "name = 'notepad.exe'" | Invoke-WmiMethod-Name Afslut
Valg tre
Get-Process -Name notesblok | ForEach-Object-Process $ _. Kill ()
Det er alt for denne gang folk, vi ses næste uge for mere PowerShell sjov.