PowerShell-Quirks: Das erste Element bestimmt den Typ, Object Edition

Wir wissen ja schon lange, dass in PowerShell das erste Element in einem Ausdruck in der Regel den Typ des Ergebnisses bestimmt.

(Wem das noch nicht klar ist, probiert bitte das folgende Beispiel aus:

)

Besonders perfide ist dieses Phänomen allerdings bei inzwischen sehr beliebten Arrays aus PSCustomObjects, die man anfertigt, um das Ganze dann in einheitlich strukturierter Art und Weise auszugeben, z.B. nach Out-GridView oder Export-CSV. Die Konstruktion sieht dann z.B. so aus:

oder auch moderner und performanter mit Hashtables:

Für die weitere Verarbeitung entsteht, wenn man nicht aufpasst und das wirklich so schreibt wie oben abgebildet, eine blöde Situation: Das Array enthält Objekte gleichen Typs (PSCustomObject), die aber unterschiedliche Properties haben. Adressiert man die Elemente einzeln, hat man Zugriff auf alle Properties des jeweiligen Objektes. Gibt man das array als Ganzes aus, diktiert das erste Element den Satz an Properties, und die Restlichen sind nicht sichtbar! Probiert es aus:

Das gleiche passiert bei Format-Table, Export-CSV und – das hat mich überrascht – selbst dann, wenn man die Elemente einfach nacheinander ausgibt, also einfach nach dem obigen Beispiel

schreibt. Explizite Out-Default und Out-Host Befehle funktionieren hingegen korrekt und geben für das jeweilige Objekt alle dort enthaltenen Properties aus, ebenso Format-List.

Man sollte also in solchen PSCustomObject-Konstrukten stets jedem Objekt alle Properties mitgeben, auch wenn manche davon leer bleiben. Im obigen Pseudocode-Beispiel würde man folgendes machen:

Dann haben alle Objekte im Array alle Properties, ggfls. nur mit Vorgabewerten, und die Ausgabe-Welt ist in Ordnung.
Happy scripting!

Ersten Kommentar schreiben

Antworten

Deine E-Mail-Adresse wird nicht veröffentlicht.


*


Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.