11Sep

Geek School: Arbejder med samlinger i PowerShell

click fraud protection

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 hvordan du automatiserer Windows med PowerShell
  • Lær at bruge Cmdlets i PowerShell
  • Lær at bruge objekter i PowerShell
  • Læring Formatering, filtrering og sammenligning i PowerShell
  • Lær at bruge Remoting iPowerShell
  • Brug af PowerShell til at få computerinformation

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 -Navne notesblok |Stop-Process

Dette ville dræbe enhver proces med navnet "notesblok".Men du spekulerer sikkert på, hvordan PowerShell kan dræbe alle forekomster af notesblok med en enkelt kommando. Svaret ligger inden for hjælp af Stop-Process cmdlet.

instagram viewer

help Stop-Process -Full

Hvis du ser på den sidste kode i syntaxafsnittet, kan du se, at parameteren InputObject accepterer et objekt af typen Process [], og når du ser en type efterfulgt af to firkantede parenteser somat det betyder, 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 array .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-Member

Det ligner 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 metodenes navn.

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

Great, det gjorde det trick. Når du får en ReturnValue på 0 i WMI, skal du bare huske, at kommandoen udføres med succes.

-opregning

Hvis du ikke 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-MemberType Metode

Perfekt, det ser ud til, at vi kan bruge Kill-metoden og derefter rør 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 til cmclet ForEach-Object. Ligesom cmdlet hvor objektet 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.

Sammendrag

Valg One

Get-Process-Name notesblok |Stop-Process

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.