11Sep

Geekskola: Arbeta med samlingar i PowerShell

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

Var noga med att läsa tidigare artiklar i serien:

  • Lär dig att automatisera Windows med PowerShell
  • Lär dig använda Cmdlets i PowerShell
  • Lär dig använda objekt i PowerShell
  • Lär dig formatering, filtrering och jämförelse i PowerShell
  • Lär dig använda Remoting iPowerShell
  • 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 -Namn 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.

help 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å kvadratparentesar somatt det innebär 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 InputObject cmdlet 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 i listan över hur man arbetar med samlingar av objekt. Vi kan enkelt få en lista över körprocesser från Win32_Process-klassen så här:

Get-WmiObject -Class Win32_Process

Eftersom WMI-frågan returnerar sin egen typ av objekt måste du leta efter en metod som kan stoppa processen, såLåt oss leda det till Get-Member.

Get-WmiObject -Class Win32_Process |Get-Member

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

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

Great, 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 du inte gör något för en massa objekt kan du räkna upp de andra två metoderna och 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 ser ut att 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 cm-koden 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

Val En

Get-Process-Name anteckningsblock |Stopp-Process

Val två

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

Choice 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.