Windows-Systemkomponenten

Windows Powershell richtig nutzen

Mit der Windows Powershell lassen sich viele Probleme ganz einfach lösen. Und sie bietet mehr Möglichkeiten als die klassische Kommandozeile CMD. Dieser Artikel liefert viele Praxistipps zur Nutzung der PowerShell.

Per Kommandozeile kann man viele Aufgaben einfach und vor allem schnell erledigen. Warum es nicht mehr unbedingt die CMD sein muss, zeigen wir Ihnen an einigen Beispielen, die für sich sprechen. Aktueller Stand der Powershell ist Version 3.0 unter Windows 8 und RT, unter Windows 7 läuft die ältere Version 2.0, man kann die neue Version aber nachinstallieren.

Powershell versus textbasierte Shells

Powershell und textbasierte Eingabeaufforderung: Eine knappe und nachvollziehbare Powershell-Pipeline erledigt das, was in der Cmd.exe eine komplexe Batchdatei erfordert.
Powershell und textbasierte Eingabeaufforderung: Eine knappe und nachvollziehbare Powershell-Pipeline erledigt das, was in der Cmd.exe eine komplexe Batchdatei erfordert.

Angenommen, Sie möchten sich die Dateien eines großen Ordners nach den Dateierweiterungen sortieren lassen, aber die Liste sollte die kompletten Pfadnamen anzeigen. Irgendwie ist diese Aufgabe mit der CMD unter Windows oder einem Unix-Terminal schon machbar: Man muss die richtigen Kommandos kennen und deren Textauswurf geschickt filtern und sortieren. Auf dem Bild sehen Sie eine Batchdatei, die diese Aufgabe leistet. Eventuell geht das auch noch effizienter - aber wirklich einfach auf keinen Fall. Sie müssen in jedem Fall einen neue Funktion in Form einer Batchdatei basteln und dann dafür sorgen, dass diese im Systempfad erreichbar ist.

Verblüffend einfach erledigen sich solche Aufgabenstellungen mit der Powershell unter Windows 7 und 8:

dir -recurse | sort extension | select fullname

Das ist nicht nur vergleichsweise simpel, sondern nebenbei auch noch deutlich schneller als die Ausgabeverarbeitung der textbasierten CMD-Shell.

Das entscheidende Alleinstellungsmerkmal der Powershell heißt: Objektorientierung im Verbund mit Pipelines, die mit dem Zeichen "|" realisiert werden. Pipelines gibt es auch bei textbasierten Kommandointerpretern, aber die Filter-Pipes wie "Sort" oder "Find" in der Cmd-Eingabeaufforderung liefern einfach nur Text; die Pipes in der Powershell transportieren hingegen das gesamte Objekt inklusive aller Eigenschaften und Methoden.

Die unglaubliche Vermehrung der Eigenschaften: Erst ein "select *", also die Auswahl aller Eigenschaften zeigt den vollen Umfang der objekte - hier der Prozess "Winword".
Die unglaubliche Vermehrung der Eigenschaften: Erst ein "select *", also die Auswahl aller Eigenschaften zeigt den vollen Umfang der objekte - hier der Prozess "Winword".

Der Befehl oben listet also alle Dateien auf, sortiert diese nach der Extension, und danach können Sie mit "select" jede Eigenschaft abrufen, die Sie sehen wollen. Ein erweitertes "select length,extension,fullname" zeigt dann neben den Pfadnamen auch noch Dateilängen und Erweiterungen. Ein weiteres Beispiel zeigt den Unterschied zwischen der Textausgabe klassischer Shells und der objektorientierten Powershell:

$a=get-process

Das Kommando schreibt die laufenden Prozesse in die Variable $a (Variablen, gleich welchen Typs, werden mit"$" gekennzeichnet). Nachfolgendes

$a

zeigt dann die Prozessliste mit acht wesentlichen Eigenschaften an. Diese Repräsentation ist aber nur freundliche Kurzzusammenfassung der Shell. Die Variable $a enthält in Wahrheit deutlich mehr:

$a | select *

Jetzt zeigt die Variable zu jedem Prozess nicht mehr nur acht, sondern über 60 Eigenschaften. Um herauszufinden, welche Eigenschaften und Methoden für ein Objekt insgesamt vorliegen, und welche davon Sie interessieren, gibt es einen systematischen Weg:

dir c:\| get-member

"dir" (eigentlich "get-childitem") liefert in diesem Fall Datei-Objekte. Deshalb erscheint eine umfangreiche Liste der Eigenschaften und Methoden für Dateien und Ordner, so etwa "Delete", "Attributes", "Length" oder "CreationTime". Über "get-member" ermittelte Eigenschaften helfen dann, die Ausgabe oder eine Objekt-Variable genau auf das inhaltlich Gewünschte einzugrenzen:

dir c: -recurse -include *.xls? | where {$_.creationtime -gt "01.01.2013"} | select lastaccesstime, length, fullname

Der "Dir"-Befehl filtert Excel-Dateien, der "Where"-Filter lässt davon nur die jüngst genutzten Dateien übrig, und "Select" reduziert dann die angezeigten Objekteigenschaften.