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.
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.
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.