Ungeahnte Möglichkeiten mit Select-Object

Es sind oft die Kleinigkeiten, die die tägliche Praxis mit der PowerShell angenehm gestalten oder gar die Augen für „ganz neue Möglichkeiten“ eröffnen. Ein solcher „Augenöffner“ war der letzte Eintrag im PowerShell Teamblog, in dem Jeffrey Snover auf die wenig bekannten Möglichkeiten des ExpandObject-Parameters von Select-Object hinwies, den ich natürlich kannte, allerdings nicht wusste (oder es vermutlich einfach nur vergessen hatte;), dass sich mit ihm nicht nur Collections-Properties Element für Element ausgeben, sondern auch Eigenschaften von einem Objekt trennen lassen.

Bislang war es immer recht lästig, dass z.B. ein

Get-Itemproperty -path „Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion“

zwar alle Einträge mit ihren Werten liefert, es sich aber um ein einzelnes Objekt handelt, bei jedem jeder Eintrag eine Property darstellt. Ein harmloses

Get-itemproperty -path „Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion“ -Name ProductID

liefert nicht die ProductID als Zeichenkette, sondern ein

PSPath        : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\ Microsoft\Windows NT\CurrentVersion
PSParentPath  : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT
PSChildName   : CurrentVersion
PSProvider    : Microsoft.PowerShell.Core\Registry
ProductId     : 00426-066-9939937-86724

Ein

Get-Itemproperty -path „registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion“ -Name ProductID | Select ProductID

liefert zwar nur die ProductID, allerdings als ein Objekt mit ProductID als einzige Property:

ProductId
———
00426-066-9939937-86724

Um nur den Wert zu erhalten, hatte ich in meinen PowerShell-Kursen ein paar Mal allen Ernstes eine Lösung vorgestellt, bei der der Objekt-Output per Out-String zunächst in einen String konvertiert wird, der dann per Split-Operator und dem Zeilenumbruchzeichen `n in ein String-Array zerlegt wird, wo dann per Select-Object und dem Skip-Parameter die Kopfzeile übersprungen wird, so dass nur die Zeile mit dem Wert übrigbleibt (wobei der Split-Operator dank dem Stream-Parameter von Out-String gar nicht erforderlich wäre). Für einen PowerShell-Einführungskurs ist das vielleicht eine nette Übung, in der Praxis jedoch „ein wenig“ umständlich.

Mit dem ExpandProperty-Parameter wird alles ganz einfach:

Get-Itemproperty -path „Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion“ -Name ProductID | Select -Exp ProductID
00426-066-9939937-12345

Ich bin selber ein wenig beschämt, diesen Parameter über die Jahre komplett verkannt zu haben (und in meinem PowerShell-Buch auch nicht unter diesem Aspekt erwähnt zu haben – der ExpandProperty-Parameter kommt natürlich an verschiedenen Stellen vor, z.B. auf Seite 114). Aber wie es Jeffrey Snover in seinem Blog-Eintrag zugibt, habe ich als kleinen Trost prominente Gesellschaft.

Der folgende Befehl listet dank ExpandProperty-Parameter die Versionsnummern der installierten .NET Framework-Versionen auf:

Get-Childitem Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework) -match „v“ | Select @{Name=“v“;Expression={ ($_.Name -split „\\“)[-1] } } | Select -Exp v
v1.0
v2.0.50727
v3.0
v3.0 SP1
v4.0.30319

Advertisements

Kommentar verfassen

Bitte logge dich mit einer dieser Methoden ein, um deinen Kommentar zu veröffentlichen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s