11Sep
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.