Suchen

System-Administration mit Microsofts PowerShell Teil 3 Cmdlets und Pipeline-Processer – Die Herzstücke der PowerShell

| Autor / Redakteur: Markus Widl / Dipl.-Ing. (FH) Andreas Donner

Cmdlets stellen die wesentlichen Funktionseinheiten der PowerShell dar. Mit Ihnen werden Objekte verwaltet, welche die unterschiedlichsten Systemelemente repräsentieren. Die Cmdlets können über den Pipeline-Processor hintereinander ausgeführt werden. Beide Konzepte werden im 3. Teil der PowerShell-Artikelserie behandelt.

Firmen zum Thema

( Archiv: Vogel Business Media )

Die PowerShell ist vollständig auf Objekten aufgebaut, was die Informationsverarbeitung gegenüber der einfachen Behandlung von einzelnen Werten deutlich vereinfacht. Doch was sind Objekte? Entwickler wissen, um was es sich dabei handelt, wenn sie objektorientierte Sprachen wie C++, C# und Java oder objektbasierte Sprachen wie VBScript verwenden. Für alle anderen beginnt der Artikel mit einer kurzen Einführung.

Klassen und Objekte

Nehmen wir als Beispiel ein Bankkonto. Dieses wird durch verschiedene Werte, den sogenannten Eigenschaften, näher beschrieben. Dazu gehören etwa der Eigentümer, die Kontonummer und der aktuelle Saldo. Außerdem gibt es zwei Aktivitäten, die Methoden, zur Einzahlung und Auszahlung, mit denen indirekt der Wert des Saldos geändert wird. Dieser Aufbau, bestehend aus Eigenschaften und Methoden, der als Grundlage (Blaupause) für jedes Bankkonto gilt, wird in der Objektorientierung Klasse genannt. Davon abgeleitet werden die Objekte, im Beispiel also die verschiedenen Bankkonten mit unterschiedlichen Werten. Alle haben einen gemeinsamen Aufbau, der durch die Klasse bestimmt wird.

Bildergalerie

Ein anderes systemnahes Beispiel: Eine Klasse beschreibt Windows-Dienste. Eigenschaften sind dort etwa der Dienstname und der Status, zu den Methoden gehören Start und Stop.

Doch zurück zur PowerShell. Wozu sind Objekte hier wichtig? Die wesentlichen Funktionseinheiten der PowerShell, die Cmdlets (sprich: „Commandlet“) verarbeiten Objekte und liefern auch grundsätzlich immer Objekte zurück. Einige Beispiele hierzu folgen.

Der Cmdlets-Aufbau

Die Befehlsnamen der Cmdlets sind stets gleich aufgebaut. Sie beginnen mit einem Verb, beispielsweise set, get, format, start, stop, copy und move. Dem Verb folgt ein Minuszeichen sowie ein Substantiv in der Einzahl wie process, service und item. Dem Befehlsnamen folgen je nach Anwendungsfall Parameter, die mit einem Minuszeichen eingeleitet werden und gegebenenfalls Argumenten, welche die Parameter näher bestimmen. Der Aufbau sieht also, vereinfacht dargestellt, wie folgt aus:

cmdlet -par1 -par2 arg1 arg2

Und hier ein konkretes Beispiel zum Auslesen des Anwendungs-Ereignisprotokolls (die Groß-/Kleinschreibung spielt dabei keine Rolle):

get-eventlog -logname application

Hilfe zu den Cmdlets

Nachdem nun der grundsätzliche Aufbau der Cmdlets beschrieben wurde, stellt sich die Frage, welche Cmdlets vorhanden sind und wie diese eingesetzt werden. Eine Liste aller Cmdlets wird über folgenden Befehl, ebenfalls ein Cmdlet, aufgerufen:

get-command

Eine kurze Beschreibung zu einem bestimmten Cmdlet wird über get-help angezeigt. Beispiel:

get-help get-eventlog

Der Parameter „-full“ liefert eine ausführliche Erklärung und „-examples“ einige Beispiele:

get-help get-eventlog -fullget-help get-eventlog -examples

Die PowerShell stellt auch einige allgemeine Informationen zu verschiedenen Themen bereit. Dies ist etwa mit den Man-Pages aus dem Linux-Umfeld vergleichbar. Die verfügbaren Texte werden wie folgt ermittelt:

get-help about_*

Und ein konkreter Hilfetext wird dann beispielswiese so ausgegeben:

get-help about_core_commands

Cmdlets mit dem Pipeline-Processor verketten

Häufig ist ein einzelnes Cmdlet nicht ausreichend, um eine bestimmte Aufgabe zu bewältigen. Nehmen wir ein Beispiel aus dem 1. Teil der Artikelserie. Dort wurde eine Liste aller Dienste, bestehend aus dem Dienstnamen und dem Status erstellt, nach dem Namen sortiert und schließlich in einer CSV-Datei (CSV = „Comma Separated Value“) gespeichert. Der Code hierfür sieht folgendermaßen aus:

get-service | select-object -property name, status | sort-object -property name | export-csv -path „c:\services.csv“

In diesem Beispiel werden die Cmdlets get-service, select-object, sort-object und export-csv hintereinander verknüpft. Dabei kommt der Pipeline-Processor zum Einsatz. Wie vorhin schon erwähnt, liefern die Cmdlets Objekte. Diese werden dann über die Pipeline an das nächste Cmdlet weitergeleitet. Dieses Cmdlet kann die Objekte dann verarbeiten, beispielsweise ihre Reihenfolge ändern oder die Informationen in einer Datei speichern.

Die Verkettung über die Pipeline programmiert man über das Pipe-Symbol „|“ (der senkrechte Strich auf der Taste mit den Größer- und Kleiner-Zeichen).

Für das konkrete Beispiel bedeutet dies, dass get-service Objekte aller vohandenen Dienste liefert. Über die Pipeline werden diese an select-object übergeben, wonach nur noch die Eigenschaften Name und Status verarbeitet werden. sort-object bringt die Objekte in die gewünschte Reihenfolge und zuletzt speichert export-csv die Informationen aus den Objekten in der Datei „c:\services.csv“ im CSV-Format ab.

Standardausgabe am Ende der Pipeline

Am Ende jeder Pipeline-Verarbeitung steht die Standardausgabe. Diese gibt in der Shell Informationen aus den verbliebenen Objekten, meist in Tabellenform, auf dem Bildschirm aus. Im obigen Beispiel wird nichts ausgegeben, da export-csv nichts zurückliefert. Wird das letzte Cmdlet weggelassen, erscheint eine Tabelle mit den gewünschten Informationen.

Bei vielen Objekten wählt die Standardausgabe einen bestimmten Satz an Eigenschaften für die Ausgabe aus. get-process liefert etwa die Eigenschaften Handles, NPM, PM, WS, VM, CPU, ID und ProcessName. Das sind aber noch lange nicht alle Eigenschaften. Um eine Übersicht aller Eigenschaften (und Methoden) zu erhalten, wird das Cmdlet get-member ausgeführt. Beispiel:

get-process | get-member

Mit where-object Objekte auswählen

Ein wichtiges Cmdlet soll an dieser Stelle noch besprochen werden. Es wählt bestimmte Objekte aus der Pipeline aus und gibt nur diese weiter. Ein Beispiel: Es sollen alle Dienste verarbeitet werden, deren Status auf „stopped“ steht. Der Cmdlet-Aufruf sieht dann wie folgt aus:

get-service | where-object { $_.status -eq „stopped“ }

Das Auswahlkriterium wird also in geschweifte Klammern geschrieben. „$_“ ist eine vordefinierte Variable, die das jeweils aktuelle Objekt beinhaltet. Von diesem wird die Eigenschaft „status“ abgefragt. „-eq“ ist ein Vergleichsoperator, der bereits in Teil 2 der Artikelserie besprochen wurde.

Funktionen und Filter in der Pipeline

Auch Funktionen und Filter wurden im 2. Teil besprochen. Beide können wie Cmdlets in der Pipeline-Verarbeitung eingesetzt werden. Sie unterscheiden sich in einem Punkt: Eine Funktion wird einmal für alle Objekte in der Pipeline gemeinsam aufgerufen, ein Filter jeweils einmal für jedes Objekt. Um also beispielsweise einen Befehl zu entwickeln, der die Summe einer bestimmten Eigenschaft berechnet, wird eine Funktion eingesetzt, was jedoch auch den Nachteil hat, dass die Pipeline-Verarbeitung solange angehalten wird, bis sämtliche Objekte zur Verfügung stehen. Bei einem Filter kann die Pipeline weiterarbeiten, obwohl das vorhergehende Cmdlet noch weitere Objekte liefert.

In den weiteren Artikelfolgen werden die hier dargestellten Techniken weiter vertieft und anhand von Beispielen angewandt. Der nächste Teil beschäftigt sich mit dem Anlegen von Scriptdateien und Profilen.

Artikelfiles und Artikellinks

(ID:2002198)