Wie aus .Net-Objekten Powershell-Objekte werden
Wenn Powershell Objekte zurückliefert, kommen diese meist aus dem .Net-Framework, aber auch aus dem veralteten Components Object Model (COM), WMI und anderen Schnittstellen. Powershell reicht die Objekte aus diesen Datenquellen nicht einfach durch, sondern "standardisiert" sie, so dass alle Objekte vom Aufbau immer gleich aussehen. Man spricht vom sogenannten "Adapted Type System" oder ATS. Anschließend kann Powershell weitere Eigenschaften zu den Objekten hinzufügen, die in der Original-Datenquelle nicht vorhanden waren. Sehr schön kann man das z.B. an Filesysteminfo-Objekten sehen, die von Powershell für Dateien ausgegeben werden. Hier hat Powershell jede Menge Eigenschaften an das Objekt angehängt, die nicht zum Original-Objekt gehören.
get-item -Path c:\Windows | select -Property Ps*
PSPath : Microsoft.PowerShell.Core\FileSystem::C:\Windows
PSParentPath : Microsoft.PowerShell.Core\FileSystem::C:\
PSChildName : Windows
PSDrive : C
PSProvider : Microsoft.PowerShell.Core\FileSystem PSIsContainer : True
Man sieht, dass zum Windows-Ordnerobjekt mehrere Eigenschaften gehören, die mit PS anfangen. Alle diesen Eigenschaften hat Powershell dem Objekt hinzugefügt, nachdem das Objektaus vom .net-Framework geliefert wurde. Diese Erweiterbarkeit von Objekten wird auch als Extended Type System oder ETS bezeichnet (s. Abschnitt Methoden auf S. 19).
Objekte haben auch noch eine Reihe von Eigenschaften, die standardmäßig nicht einmal von Get-Member angezeigt werden. Verwenden Sie für ihre Anzeige Get-Member mit dem Parameter -force.
get-item -Path c:\Windows | Get-Member -Force -MemberType MemberSet
Name MemberType Definition
---- ---------- ----------
psadapted MemberSet psadapted {Name,...
psbase MemberSet psbase {Name,...
psextended MemberSet psextended {PSPath,
psobject MemberSet psobject {BaseObject,...
PSStandardMembers MemberSet PSStandardMembers {DefaultDisplayProperty}
Die Abfrage wurde auf den Membertype Membersets eingeschränkt, weil dort die vier interessanten Objekte zu finden sind.
|
Name |
Beschreibung |
|
psbase |
Das Originalobjekt, wie Powershell es empfangen hat (die "rohe" Ansicht) |
|
psadapted |
Das von Powershell standardisierte Objekte ohne die hinzugefügten Member |
|
psextended |
Die hinzugefügten Member |
|
psobject |
Die Beschreibung des Powershell-Objekts |
Über diese vier Eigenschaften können Sie sich das unveränderte Originalobjekt ansehen, aber auch das Objekt selbst erkunden. Die Eigenschaft psobject enthält z.B. eine Auflistung aller Eigenschaften des Objekts.
$folder = get-item -Path c:\Windows
$folder.psobject.properties
> MemberType : NoteProperty IsSettable : True
> IsGettable : True
> Value : Microsoft.PowerShell.Core\FileSystem::C:\Windows
> TypeNameOfValue : System.String
> Name : PSPath IsInstance : True
> MemberType : NoteProperty
> IsSettable : True
> IsGettable : True
> Value : Microsoft.PowerShell.Core\FileSystem::C:\
> TypeNameOfValue : System.String
> Name : PSParentPath
> IsInstance : True
Um sich nur die Namen der Eigenschaften anzeigen zu lassen, geben Sie noch die Eigenschaft .Name mit an:
$folder.psobject.properties.name
> PSPath
> PSParentPath
> PSChildName
> PSDrive
> PSProvider
> PSIsContainer
> Mode
> BaseName
> Target
…
Eine gute Beschreibung zum ATS und ETS finden Sie bei Microsoft Learn. Eine Beschreibung der PS*-Membersets finden Sie unter https://devblogs.microsoft.com/powershell/whats-up-with-psbase-psextended-psadapted-and-psobject/.