PowerShell Basics

Die Windows PowerShell ist die neue Skripting Umgebung von Microsoft und Bestandteil von Vista und Server 2008, kann aber auch unter XP SP2 und Server 2003 installiert werden.
Die PowerShell basiert auf dem .NET Framework 2.0 und bietet auf den ersten Blick eine Shell ähnlich der cmd.exe, in der die bekannten internen und externen cmd-Kommandos ausgeführt werden können. Allerdings ist die PowerShell weitaus umfangreicher und erlaubt unter Anderem den direkten Zugriff auf Betriebssystem Schnittstellen, wie .NET-Klassen, Windows Management Instrumentation WMI und das Component Object Model COM.

Die PowerShell kann interaktiv benutzt werden, um Kommandos oder eine Serie von Kommandos einzugeben, sie ist aber auch ein neuer Scripting Host, um umfangreiche PowerShell-Skripte (*.ps1) darin laufen lassen zu können.
Viele aus den Unix Shells bekannten Mechanismen, wie Pipes, Aliase, History, TAB-Expansion etc. sind in die PowerShell integriert. Ein Aufruf von get-childitem, dir oder ls liefert als Ergebnis ein Listing der aktuellen Verzeichnis- oder einer anderen hierarchischen Struktur (z.B. die Registry), ähnlich einem ls -al unter Linux.

Auch wenn die PowerShell in gewisser Weise an die Bash erinnert, geht sie über die Möglichkeiten einer Unix Shell hinaus, da sie ein objektorientiertes Skripting ermöglicht. Die Ergebnisse von Zugriffen auf .NET-Klassen, WMI-Klassen, Registry oder das Dateisystem werden als Objekte zurückgeliefert, die über Eigenschaften und Methoden zur weiteren Verarbeitung verfügen. So liefert get-service | get-member u.a. die verfügbaren Eigenschaften (Property) und Methoden, die für ein Windows-Dienst Objekt zur Verfügung stehen.
Das ist ein sehr wesentliches Merkmal der PowerShell, dass die Ausgaben nicht als Textstreams erfolgen, die dann mit String-Funktionen geparst werden müssen, sondern als Objekte, auf die direkter Zugriff besteht.
Die PowerShell bietet natürlich auch viele Funktionen zur Bearbeitung von Strings oder zur Formatierung von Zahlen und Datumswerten. Auch die aus Perl bekannten Hash Tables, assoziative Arrays genannt, werden unterstützt.

Viele Funktionen und Kommandos sind in sogenannten Cmdlets Command-Lets zusammengefasst, die als .NET Klassen implementiert sind und die Kernelemente der PowerShell bilden. Die Benennung der Cmdlets folgt dabei einem einheitlichen Namensschema in der Form Verb-Noun. Häufige Verben sind Get-, Set-, Add-, Remove- die für sich sprechen, was mit dem nachfolgendem Hauptwort (Noun) gemacht werden soll. Beispiele sind get-service, set-service, start-service, stop-service.
Das grundsätzliche Namensschema eines Cmdlets hat die Struktur Verb-Noun [[-Param] Arg[s]], wobei manche Parameter optional sind.
So liefert get-acl -path Pfadname und get-acl Pfadname das selbe Ergebnis, nämlich die Access-Control-List für Pfadname.
Einige mächtige Cmdlets dienen der Formatierung von Ausgaben. Die Ergebnisse von Abfragen können z.B. mit Format-Table in Tabellenform oder mit ConvertTo-HTML in HTML ausgegeben werden.
Die Entwicklung eigener Cmdlets erfordert in der Version 1.0 das Visual Studio .NET. In zukünftigen Versionen sollen Cmdlets selbst aus PowerShell Skripten entwickelt werden können.
Das Cmdlet get-command gibt Informationen zu allen, in der jeweiligen Version von PowerShell verfügbaren, Command-Lets aus. Dabei genügt es get-co einzugeben und dann die TAB Taste zu drücken.

Hier noch exemplarisch ein paar PowerShell Kommandos mit kurzer Erklärung:

get-variable
$pshome
$profile

Das Cmdlet Get-Variable gibt die internen PowerShell Variablen aus.
Die Variable $PShome zeigt auf den Installations Pfad von PowerShell.
Die Variable $Profile gibt den Namen der benutzerspezifischen Profildatei aus
(siehe auch PowerShell Profile).

get-command

Das Cmdlet Get-Command gibt Informationen zu allen, in der jeweiligen Version von PowerShell verfügbaren, CmdLets aus.

get-command -type all | Sort-Object CommandType

Mit Get-Command -Type all | Sort-Object CommandType werden alle verfügbaren Elemente der PowerShell ausgegeben und nach dem Typ (Alias, Function, Cmdlet ...) sortiert.

(get-command -type all).count

Der Aufruf von (Get-Command -Type all).count liefert die Anzahl aller verfügbaren Elemente der PowerShell. Das ist u.a. abhängig von der installierten Software.

get-command -verb set

Damit werden alle Cmdlets ausgegeben, die das Verb 'Set' haben.

get-command -noun service

Damit werden alle Cmdlets ausgegeben, die das Hauptwort (Noun) 'Service' haben.
Für den Zugriff auf Windows Dienste mit der PowerShell siehe auch PowerShell and WMI.

get-help get-service -detailed | more

Mit dem Cmdlet Get-Help wird die Hilfe zu get-service mit zusätzlichen Informationen angezeigt. Über das Pipe zu More wird die Ausgabe automatisch nach jeder Seite angehalten.

help get-service -full
man get-service -full

Der Alias help sorgt implizit dafür, dass die Ausgabe automatisch nach jeder Seite angehalten wird.
Für Freunde der Unix Shells gibt es auch den Alias man.

gal | sort name

Damit werden Informationen zu den Aliasen ausgegeben und nach Aliasname sortiert. gal selbst ist ein Alias für get-alias.



Eine stetig wachsende Community, wie z.B. die PowerShell AG versorgt die interessierte Gemeinde mit einer Vielzahl von Beispielen, Skripten und guten Dokumenatationen. Schon jetzt ist absehbar, dass in der Administration von MS Windows Umgebungen an PowerShell kein Weg vorbeiführt.

Derzeit gibt es die Windows PowerShell Version 2.0 CTP 'Community Technology Preview' zum Download, womit man sich einen Eindruck über das zukünftige Release der Microsoft Skripting Umgebung verschaffen kann.

Tip! Bei mir brauchte nach der Installation der PowerShell Version 2.0 CTP die Eingabe von Get-Help einen Fehler. Das kann dadurch behoben werden, dass ein neues Verzeichnis
%systemroot%\system32\WindowsPowerShell\v1.0\de-DE angelegt wird und alle Dateien aus %systemroot%\system32\WindowsPowerShell\v1.0\en-US dorthin kopiert werden.