Geek School Erlernen der Verwendung von Objekten in PowerShell
Das Verstehen von Objekten ist eines der grundlegenden Konzepte, um PowerShell „zu bekommen“. Begleiten Sie uns bei der Erkundung von Objekten und wie PowerShell besser als jede andere Shell heute ist.
Lesen Sie unbedingt die vorherigen Artikel der Serie:
- Erfahren Sie, wie Sie Windows mit PowerShell automatisieren
- Verwenden von Cmdlets in PowerShell
Und bleiben Sie die ganze Woche für den Rest der Serie dran.
Objekte
Haben Sie sich jemals gefragt, was PowerShell von einer traditionellen Linux-Shell wie Bash oder sogar der alten Eingabeaufforderung unterscheidet? Die Antwort ist sehr einfach: Traditionelle Shells geben Text aus, was es schwierig macht, Dinge wie Formatierung und Filterung auszuführen. Natürlich gibt es Tools, mit denen Sie die Arbeit erledigen können (sed und grep), aber wenn Sie am Ende des Tages schwere Textanalyse durchführen möchten, müssen Sie reguläre Ausdrücke wie das kennen von deiner Hand zurück.
PowerShell nutzt das zugrunde liegende .NET-Framework und verwendet einen anderen Ansatz, wobei Objekte anstelle von Text verwendet werden. Objekte sind nur eine Darstellung von etwas. Sie sind eine Sammlung von Teilen und Aktionen, um sie zu verwenden. Werfen wir einen Blick auf die Teile eines Fahrrades und wie wir sie verwenden könnten.
Objekte in .Net sind bis auf zwei kleine Unterschiede weitgehend gleich: Die "Parts" werden aufgerufen Eigenschaften und die "Anweisungen" werden aufgerufen Methoden. Wenn wir einen Windows-Dienst als Objekt darstellen möchten, entscheiden wir möglicherweise, dass er mit drei Eigenschaften beschrieben werden soll: Dienstname, Status und Beschreibung. Wir müssen auch mit dem Dienst interagieren, sodass wir dem Objekt möglicherweise eine Start-, eine Stopp- und eine Pause-Methode geben.
Sie können die Eigenschaften und Methoden eines Objekts anzeigen, indem Sie es an das Cmdlet Get-Member übergeben. Die Objekte, die ein PowerShell-Cmdlet ausgibt, basieren weitgehend auf Typen aus dem .NET-Framework. Sie können jedoch eigene Objekte erstellen, wenn Sie eine Sprache wie C # oder den Typ PSObject verwenden müssen.
Die Pipeline
Es gibt viele Linux-Shells mit einer Pipeline, mit denen Sie den Text, den ein Befehl als Eingabe ausgibt, an den nächsten Befehl in der Pipeline senden können. PowerShell bringt dies auf die nächste Ebene, indem Sie die Objekte, die ein Cmdlet ausgibt, als Eingabe an das nächste Cmdlet in der Pipeline übergeben. Der Trick besteht darin, zu wissen, welchen Objekttyp ein Cmdlet zurückgibt. Dies ist bei der Verwendung des Cmdlets Get-Member sehr einfach.
Get-Service | Get-Member
Aus Gründen, die über den Rahmen dieses Artikels hinausgehen, werden Eigenschaften und Methoden gemeinsam als Klassenmitglieder bezeichnet. Dies erklärt, warum Sie das Cmdlet Get-Member verwenden, um eine Liste aller Methoden und Eigenschaften eines Objekts abzurufen. Das Cmdlet Get-Member gibt jedoch auch eine andere wichtige Information zurück, den zugrunde liegenden Objekttyp. Im obigen Screenshot können wir sehen, dass Get-Service Objekte des Typs zurückgibt:
System.ServiceProcess.ServiceController
Da PowerShell Objekte und nicht Text behandelt, können nicht alle Cmdlets mithilfe der Pipeline [1] miteinander verknüpft werden. Das bedeutet, dass wir ein Cmdlet suchen müssen, das ein System.ServiceProcess.ServiceController-Objekt aus der Pipeline akzeptiert.
Get-Command -ParameterType System.ServiceProcess.ServiceController
Beachten Sie, dass es ein Cmdlet namens Stop-Service gibt. Werfen wir einen Blick auf die Hilfe dafür.
Get-Help -Name Stop-Service
Es sieht so aus, als würde der InputObject-Parameter ein Array von ServiceController-Objekten als Eingabe verwenden. Wenn Sie einen Parameter mit dem Namen InputObject sehen, werden normalerweise Eingaben von der Pipeline akzeptiert. Wir möchten uns jedoch nur die vollständige Hilfe für diesen Parameter ansehen.
Get-Help -Name Stop-Service-Full
Unser Verdacht war richtig. An diesem Punkt wissen wir also Folgendes:
- Get-Service gibt ServiceController-Objekte zurück
- Stop-Service hat einen Parameter namens InputObject, der einen oder mehrere ServiceControllers als Eingabe akzeptiert.
- Der Parameter InputObject akzeptiert eine Pipeline-Eingabe.
Mit diesen Informationen können wir Folgendes tun:
Get-Service -Name 'Apple Mobile Device' | Dienst anhalten
Das ist alles für diese Zeit, Leute. Beim nächsten Mal schauen wir uns an, wie wir Objekte in der Pipeline formatieren, filtern und vergleichen können.
Hausaufgaben
- Lesen Sie in der Objekt-Pipeline nach
Wenn Sie Fragen haben, können Sie mir @taybgibb twittern oder einfach einen Kommentar hinterlassen.