Hemsida » hur » Geekskola Arbeta med samlingar i PowerShell

    Geekskola Arbeta med samlingar i PowerShell

    Eftersom PowerShell är baserat på. Net Framework och innehåller olika andra tekniker som WMI och CIM, finns det alltid mer än ett sätt att åstadkomma samma sak. Kom med oss ​​för denna korta post där vi lär oss hur vi väljer den bästa metoden för att uppnå våra uppgifter.

    Var noga med att läsa de föregående artiklarna i serien:

    • Lär dig hur du automatiserar Windows med PowerShell
    • Att lära sig använda Cmdlets i PowerShell
    • Lär dig hur man använder objekt i PowerShell
    • Learning Formatering, filtrering och jämförelse i PowerShell
    • Lär dig använda Remoting i PowerShell
    • Använda PowerShell för att få datorinformation

    Och håll dig uppdaterad för resten av serien hela veckan.

    Använda Batch Cmdlets

    Tidigare i serien när vi introducerade dig till rörledningen visade vi dig hur du kan ta objekten som en cmdlet matar ut och skickar dem som inmatning till en annan cmdlet med något liknande:

    Get-Process-Name anteckningsblock | Stop-Process

    Detta skulle döda alla processer med namnet "anteckningsblock". Men du undrar nog hur PowerShell kan döda alla instanser av anteckningsblock med ett enda kommando. Svaret ligger inom hjälp av Stop-Process cmdlet.

    hjälp Stop-Process-Full

    Om du tittar på den sista raden av kod i syntaxavsnittet kan du se att parametern InputObject accepterar ett objekt av typen Process [], och när du ser en typ följt av två kvadratparentes så betyder det att parametern accepterar en eller flera av föregående typ. I det här fallet accepterar den ett eller flera processobjekt. Tekniskt sett skulle vi säga att cmdletet InputObject accepterar en process array. När du har en cmdlet som stöder batchoperationer på det här sättet, använd det. Detta är val nummer ett.

    Använda WMI

    Även om WMI inte är den bästa tekniken som ska skickas från Microsoft HQ, kommer den in på andra sidan på listan över hur man arbetar med samlingar av objekt. Vi kunde enkelt få en lista med körprocesser från Win32_Process-klassen som så:

    Get-WmiObject-klass Win32_Process

    Eftersom WMI-frågan returnerar sin egen typ av objekt måste du leta efter en metod som kan stoppa processen, så det kan leda till att bli medlem.

    Get-WmiObject-klass Win32_Process | Get-medlem

    Det ser ut att det närmaste att stoppa är termineringsmetoden, så det måste vara det. För att ringa en metod på ett WMI-objekt, rör det dig helt enkelt till Invoke-WmiMethod och ange namnet på metoden.

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

    Bra, det gjorde tricket. När du får en ReturnValue på 0 i WMI, kom ihåg att kommandot kördes framgångsrikt.

    Uppräkning

    Om de andra två metoderna misslyckas, om du måste göra något för en massa objekt kan du räkna upp hela objektet och agera på varje enskilt objekt. Först måste du hitta den metod du skulle använda för att stoppa en enda process.

    Get-Process | Get-Member-MemberType Metod

    Perfekt, det verkar som om vi kan använda Kill-metoden och sedan röra in i ForEach-Object för att döda dem alla.

    Get-Process-Name anteckningsblock | ForEach-Object-Process $ _. Kill ()

    Här tog vi alla processobjekt som Get-Process återvände och skickade dem till cmcleten ForEach-Object. Precis som cmdlet där objektet representerade, representerade vi varje objekt i rörledningen med $ _ som vi kunde ringa till Kill () -metoden på. Med allt sagt och gjort är uppräkning av en samling mycket långsammare än ovanstående metoder och bör endast användas som ett sista resultat.

    Sammanfattning

    Choice One

    Get-Process-Name anteckningsblock | Stop-Process

    Val två

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

    Val tre

    Get-Process-Name anteckningsblock | ForEach-Object-Process $ _. Kill ()

    Det är allt för den här gången, vi ses nästa vecka för mer PowerShell-kul.