Aufgaben einfach automatisieren

PowerShell 4.0 im Überblick

Frank-Michael Schlede arbeitet seit den achtziger Jahren in der IT und ist seit 1990 als Trainer und Fachjournalist tätig. Nach unterschiedlichen Tätigkeiten als Redakteur und Chefredakteur in verschiedenen Verlagen arbeitet er seit Ende 2009 als freier IT-Journalist für verschiedene Online- und Print-Publikationen. Er lebt und arbeitet in Pfaffenhofen an der Ilm.
Thomas Bär, der seit Ende der neunziger Jahre in der IT tätig ist, bringt weit reichende Erfahrungen bei der Einführung und Umsetzung von IT-Prozessen im Gesundheitswesen mit. Dieses in der Praxis gewonnene Wissen hat er seit Anfang 2000 in zahlreichen Publikationen als Fachjournalist in einer großen Zahl von Artikeln umgesetzt. Er lebt und arbeitet in Günzburg.

Speicherung von Pipeline-Objekten

Zu den eher kleineren Verbesserungen, die sich aber bei der täglichen Arbeit mit der PowerShell schnell als nützlich erweisen können, zählt ohne Zweifel die Möglichkeit, mittels des allgemein verfügbaren Parameters "-PipelineVariable" Objekte innerhalb einer Pipeline zwischenzuspeichern. Dies kann dann nützlich sein, wenn der Nutzer beispielsweise auf ein Objekt zugreifen möchte, dass sich bei der Abarbeitung einer Pipe am Ende nicht mehr im Zugriff befindet. Bei dem folgenden Aufruf:

Get-ChildItem *.txt | Select-String <Suchstring> | Get-Member

werden Dateiobjekte, die vom Cmdlet "Get-Childitem" weitergeben werden, während der Abarbeitung in der Pipe durch die Matchinfo-Objekte von Select-String ersetzt -- was grundsätzlich auch richtig ist, denn das soll ja am Ende der Bearbeitung herauskommen.

Verbesserung: Der neue standardmäßig zur Verfügung stehende Parameter "-PipelineVariable" hilft dabei, Informationen zwischen zu speichern, die sonst beim "Weiterreichen" in der Pipe verloren gehen würden. Ohne diese Speicherung, wäre hier kein Zugriff über die Eigenschaft "Directory.Basename" möglich gewesen.
Verbesserung: Der neue standardmäßig zur Verfügung stehende Parameter "-PipelineVariable" hilft dabei, Informationen zwischen zu speichern, die sonst beim "Weiterreichen" in der Pipe verloren gehen würden. Ohne diese Speicherung, wäre hier kein Zugriff über die Eigenschaft "Directory.Basename" möglich gewesen.

Soll nun aber beispielsweise in einem derartigen Aufruf auf das FileInfo-Objekt von "Get-Childitem" zugegriffen werden, so mussten die Anwender bisher eine Zwischenvariabel anlegen und diese mit Hilfe einer Schleife abarbeiten, um darauf zugreifen zu können. Durch den neuen Parameter "-PipelineVariable" ist das nun nicht mehr nötig, diese Objekte werden in der mitgegebenen Variablen zwischengespeichert und stehen damit auch am Ende der Pipeline noch zur Verfügung. Das folgende Beispiel des Software-Entwicklers Keith Hill, das wir ein wenig abgewandelt haben, zeigt das sehr schön:

Get-Childitem *.txt -PipelineVariable var1 | Select-String micha | Foreach {"$($var1.Directory.Basename)\$($_.Filename)"}

Dieser Aufruf gibt die Dateien, in denen der String "micha" gefunden wurde, in der Form:

Verzeichnisname\Dateiname

auf dem Bildschirm ohne den führenden Pfad aus. Der Zugriff auf die Eigenschaft "Directory.Basename" wäre aber am Ende der Pipeline ohne die Zwischenvariable nicht möglich, da das Fileinfo-Objekt nach Aufruf von "Select-String" nicht mehr zur Verfügung steht.

Neu und nützlich: Get-FileHash

Wenn die Suche nach einer bestimmten PowerShell-Funktion im Internet eine ganze Reihe unterschiedlicher Lösungen für genau dieses Problem präsentiert, so ist ziemlich sicher, dass ein entsprechender Bedarf bei den Anwendern besteht. So ist es auch mit "Get-FileHash" und Microsoft liefert diese Funktionalität nun mit der PowerShell 4.0 als Cmdlet mit. So berechnet der Aufruf:

Get-Filehash $pshome\powershell.exe | Format-List

den Hashwert für die ausführbare PowerShell-Datei und zeigt ihn in formatierter Form an. Durch den Parameter "-Algorithm <Zeichenkette>" kann der Anwender zudem angeben, mit welcher kryptografischen Hash-Funktion er den Inhalt der übergebenen Datei berechnet haben möchte. Dabei stehen SHA1, SHA256, SHA384, SHA512, MACTripleDES, MD5 und RIPEMD160 zur Verfügung, wobei die Microsoft-Entwickler in der Dokumentation noch einmal explizit darauf hinweisen, dass sowohl MD5 als auch SHA1 nicht mehr als sicher betrachtet werden.

Kleines, nützliches Cmdlet in der PowerShell 4.0: Mit Get-HashFile lassen schnell und einfach entsprechende Überprüfungen durchführen.
Kleines, nützliches Cmdlet in der PowerShell 4.0: Mit Get-HashFile lassen schnell und einfach entsprechende Überprüfungen durchführen.

Gibt der Nutzer keinen Algorithmus an, so verwendet das Cmdlet automatisch SHA256. Das Cmdlet gibt nach dem Aufruf ein Objekt zurück, das den Pfad zu der geprüften Datei, den berechneten Hash-Wert und den zur Berechnung verwendeten Hash beinhaltet. Interessant ist dabei noch der Parameter "-LiteralPath" der im Gegensatz zum bekannten "-Path"-Parameter einen übergebenen Pfad genauso annimmt, wie er eingegeben wird, ohne dabei Wildcard-Zeichen zu interpretieren. Befinden sich im Pfad Escape-Zeichen, so werden sie bei Verwendung dieses Parameters ignoriert, wenn der Pfad in einfachen Hochkommas eingeschlossen wird.

Zur Startseite