Zum Hauptinhalt springen

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