18Aug
Att förstå objekt är ett av de grundläggande begreppen för att "få" PowerShell. Följ med oss när vi utforskar objekt och hur de gör PowerShell bättre än något annat skal där ute idag.
Var noga med att läsa tidigare artiklar i serien:
- Lär dig hur du automatiserar Windows med PowerShell
- Lär dig använda Cmdlets i PowerShell
och håll dig uppdaterad för resten av serien hela veckan.
Objekt
Har du någonsin undrat vad som sätter PowerShell bortsett från ett traditionellt Linux-skal som Bash, eller till och med den äldre kommandotolken? Svaret är väldigt enkelt: Traditionella skalar utmatar text, vilket gör det svårt att göra saker som formatering och filtrering. Självklart finns det verktyg som hjälper dig att få jobbet gjort( sed och grep kommer i åtanke), men i slutet av dagen, om du vill göra någon form av tung textparsning, behöver du veta vanliga uttryck somtillbaka på din hand.
PowerShell utnyttjar det underliggande. Net-ramverket och tar ett annat tillvägagångssätt, med hjälp av objekt istället för text. Objekt är bara en representation av något. De är en samling av delar och åtgärder för att använda dem. Låt oss ta en titt på cykelens delar och hur vi kan använda dem.
Objekt i. Net är mycket desamma utom för två små skillnader: "Delarna" heter -egenskaper och "Instruktioner" kallas -metoder .Om vi ville representera en Windows-tjänst som ett objekt kan vi bestämma att det är lämpligt att beskriva det med tre egenskaper: Tjänstenamn, Stat och Beskrivning. Vi måste också interagera med tjänsten, så vi kan ge objektet en start, en stopp och en paus-metod.
Du kan se ett objekts egenskaper och metoder genom att skicka det till Get-Member cmdlet. Föremålen som en PowerShell-cmdlet-utmatning är till stor del underliggande typer från. Net-ramverket, men du kan skapa egna objekt om du behöver använda ett språk som C # eller använda PSObject-typen.
Pipeline
Det finns gott om Linux-skal med en pipeline, så att du kan skicka texten som ett kommando utmatas som inmatning till nästa kommando i pipelinen. PowerShell tar det här till nästa nivå genom att låta dig ta objekten som en cmdlet matar ut och skickar dem som ingång till nästa cmdlet i rörledningen. Tricket är att veta vilken typ av objekt en cmdlet returnerar, vilket är väldigt enkelt när man använder Get-Member cmdlet.
Get-Service |Get-Member
Av anledningar som ligger utanför ramen för denna artikel heter egenskaper och metoder gemensamt klassmedlemmar, vilket förklarar varför du använder Get-Member-cmdletet för att få en lista över alla metoder och egenskaper som ett objekt har. Get-Member-cmdlet returnerar emellertid också en annan viktig information, den underliggande objekttypen. I ovanstående skärmdump kan vi se att Get-Service returnerar objekt av typen:
System. ServiceProcess. ServiceController
Eftersom PowerShell behandlar objekt och inte text, kan inte alla cmdlets kopplas samman med rörledningen [1].Det betyder att vi måste hitta en cmdlet som ser ut att acceptera ett System. ServiceProcess. ServiceController-objekt från rörledningen.
Get-Command -ParameterType System. ServiceProcess. ServiceController
Observera att det finns en cmdlet kallad Stop-Service;låt oss ta en titt på hjälpen för det.
Get-Help -Name Stopptjänst
Det ser ut att parametern InputObject tar en rad ServiceController-objekt som inmatning. Vanligtvis, om du ser en parameter som heter InputObject, kommer den att acceptera inmatning från pipeln, men bara för att se till att vi tittar på hela hjälpen för den här parametern.
Get-Help -Name Stop-Service-Full
Våra misstankar var korrekta. Så vid denna punkt vet vi följande:
- Get-Service returnerar ServiceController-objekt
- Stop-Service har en parameter som heter InputObject som accepterar en eller flera ServiceControllers som input.
- Parametern InputObject accepterar pipelineingång.
Med hjälp av denna information kan vi göra följande:
Get-Service -Name 'Apple Mobile Device' |Stop-Service
Det är allt för den här gången folks. Nästa gång tittar vi på hur vi kan formatera, filtrera och jämföra objekt i pipelinen.
Hemläxa
- Läs upp på Objektledningen
Om du har några frågor kan du tweeta mig @taybgibb, eller bara lämna en kommentar.