18Aug

Geek School: Lernen, wie man Objekte in PowerShell verwendet

Das Verständnis von Objekten ist eines der grundlegenden Konzepte zum "Erhalten" von PowerShell. Begleiten Sie uns, wie wir Objekte erforschen und wie sie PowerShell besser machen als jede andere Shell heute.

Lesen Sie sich die vorherigen Artikel in der Serie durch:

  • Erfahren Sie, wie Sie Windows mit PowerShell automatisieren
  • Lernen, Cmdlets in PowerShell

zu verwenden Und bleiben Sie für den Rest der Serie die ganze Woche dran.

Objects

Haben Sie sich jemals gefragt, was PowerShell von einer traditionellen Linux-Shell wie Bash oder der Legacy-Eingabeaufforderung unterscheidet? Die Antwort ist wirklich einfach: Traditionelle Shells geben Text aus, was das Formatieren und Filtern erschwert. Natürlich gibt es Tools, die Ihnen helfen, die Arbeit zu erledigen( sed und grep kommen Ihnen in den Sinn), aber am Ende des Tages, wenn Sie irgendeine Art von schwerem Text analysieren wollen, müssen Sie reguläre Ausdrücke wie dieHandrücken.

PowerShell nutzt das zugrunde liegende. Net-Framework und verwendet einen anderen Ansatz, bei dem Objekte anstelle von Text verwendet werden. Objekte sind nur eine Darstellung von etwas. Sie sind eine Sammlung von Teilen und Aktionen, um sie zu benutzen. Werfen wir einen Blick auf die Teile eines Fahrrades und wie wir sie benutzen können.

Objekte in. Net sind bis auf zwei kleine Unterschiede sehr ähnlich: die "Teile" heißen -Eigenschaften und die "Anweisungen" heißen -Methoden .Wenn wir einen Windows-Dienst als Objekt darstellen wollten, könnten wir entscheiden, dass es angemessen ist, ihn mit drei Eigenschaften zu beschreiben: Dienstname, Status und Beschreibung. Wir müssen auch mit dem Dienst interagieren, damit wir dem Objekt eine Start-, eine Stopp- und eine Pausemethode geben können.

Sie können die Eigenschaften und Methoden eines Objekts anzeigen, indem Sie es an das Cmdlet Get-Member übergeben. Die Objekte, die von einem PowerShell-Cmdlet ausgegeben werden, sind größtenteils untergeordnete Typen des. NET-Frameworks. Sie können jedoch eigene Objekte erstellen, wenn Sie eine Sprache wie C # verwenden oder den PSObject-Typ verwenden müssen.

Die Pipeline

Es gibt viele Linux-Shells mit einer Pipeline, die es Ihnen ermöglichen, den Text, den ein Befehl als Eingabe an den nächsten Befehl in der Pipeline ausgibt, zu senden. PowerShell bringt dies auf die nächste Ebene, indem es Ihnen ermöglicht, die Objekte, die ein Cmdlet ausgibt, als Eingabe für das nächste Cmdlet in der Pipeline zu verwenden. Der Trick besteht darin, zu wissen, welche Art von Objekt ein Cmdlet zurückgibt, was bei Verwendung des Cmdlets Get-Member wirklich einfach ist.

Get-Service |Get-Member

Aus Gründen, die über den Rahmen dieses Artikels hinausgehen, werden Eigenschaften und Methoden gemeinsam als Klassenmember 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 weitere wichtige Information zurück, den zugrunde liegenden Objekttyp. Im obigen Screenshot sehen wir, dass Get-Service Objekte des folgenden Typs zurückgibt:

System. ServiceProcess. ServiceController

Da PowerShell mit Objekten und nicht mit Text arbeitet, können nicht alle Cmdlets über die Pipeline [1] miteinander verknüpft werden. Das bedeutet, dass wir ein Cmdlet finden müssen, das ein System. ServiceProcess. ServiceController-Objekt aus der Pipeline akzeptieren möchte.

Get-Command -ParameterType System. ServiceProcess. ServiceController

Beachten Sie, dass ein Cmdlet namens Stop-Service vorhanden ist. Werfen wir einen Blick auf die Hilfe dafür.

Get-Help -Name Stop-Dienst

Es sieht so aus, als ob der InputObject-Parameter ein Array von ServiceController-Objekten als Eingabe akzeptiert. Wenn Sie einen Parameter mit dem Namen InputObject sehen, wird normalerweise eine Eingabe von der Pipeline akzeptiert, aber um sicherzugehen, werfen wir einen Blick auf die vollständige Hilfe für diesen Parameter.

Get-Help -Name Stop-Service-Full

Unser Verdacht war richtig. An diesem Punkt wissen wir Folgendes:

  • Get-Service gibt ServiceController-Objekte zurück
  • Stop-Service hat einen Parameter namens InputObject, der einen oder mehrere ServiceController als Eingabe akzeptiert.
  • Der InputObject-Parameter akzeptiert Pipeline-Eingaben.

Mit diesen Informationen könnten wir Folgendes tun:

Get-Service -Name 'Apple Mobile Device' |Stop-Service

Das ist alles für diese Zeit Leute. Das nächste Mal schauen wir uns an, wie wir Objekte in der Pipeline formatieren, filtern und vergleichen können.

Hausaufgaben

  • Lesen Sie auf der Objekt-Pipeline
nach

Wenn Sie Fragen haben, können Sie mich twittern @taybgibb, oder einfach einen Kommentar hinterlassen.