Aufgaben einfach automatisieren

PowerShell 4.0 im Überblick

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 Anwender beispielsweise auf ein Objekt zugreifen möchte, das 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" weitergegeben 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 zwischenzuspeichern, 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 zwischenzuspeichern, 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 Zwischenvariable anlegen und diese mithilfe 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 Softwareentwicklers 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, ist es 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. Der Aufruf:

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

Berechnet 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 sich schnell und einfach entsprechende Überprüfungen durchführen.
Kleines, nützliches Cmdlet in der PowerShell 4.0: Mit Get-HashFile lassen sich 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, werden sie bei Verwendung dieses Parameters ignoriert, wenn der Pfad in einfachen Hochkommas eingeschlossen wird.