Hjemmeside » hvordan » Geek School Arbejder med samlinger i PowerShell

    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.