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.