2016-05-02 7 views
1

Wir haben PowerShell-Objekte, die PSCustomObjects in Form eines array enthalten. Um diese Informationen in eine Text- oder Excel-Datei zu exportieren, müssen wir in der Lage sein, die Daten zu glätten.Reduzieren Sie mehrere PowerShell-Arrays

Beispielcode:

$Fruits = [PSCustomObject]@{ 
    Name = 'Banana' 
    Colors = [PSCustomObject]@{ 
       Name = 'Green' 
      }, 
      [PSCustomObject]@{ 
       Name = 'Yellow' 
      } 
    Taste = [PSCustomObject]@{ 
       Name = 'Good' 
      }, 
      [PSCustomObject]@{ 
       Name = 'Bad' 
      }, 
      [PSCustomObject]@{ 
       Name = 'Awful' 
      } 
} 

Erzeugt:

$Fruits | fl * 

Name : Banana 
Colors : {@{Name=Green}, @{Name=Yellow}} 
Taste : {@{Name=Good}, @{Name=Bad}, @{Name=Awful}} 

der Lage sein, um einen sauberen Export zu haben, sollte das gewünschte Ergebnis so etwas wie diese:

Name | Color | Taste 
---- | ----- | ----- 
Banana | Yellow | Good 
Banana | Green | Bad 
Banana |   | Awful 

Wie ist es möglich, dieses Objekt zu entwirren?

+0

Sie vermissen eine Farbe: Braun = Awful. – Matt

+0

Ich weiß heutzutage alles über Obst, deshalb habe ich die Birnen weggelassen;) Aber eine braune Banane .. Ich würde es trotzdem nehmen! : D – DarkLite1

Antwort

2

Sie müssten die Spalte mit den meisten Werten finden und diese als Grenzwert für eine For/While-Schleife verwenden. Ex.

$maxLines = $Fruits.psobject.Properties | Where-Object { $_.TypeNameOfValue -match 'Object\[\]|ICollection' } | Foreach-Object { $_.Value.Count } | Sort-Object -Descending | Select-Object -First 1 
0..($maxLines-1) | ForEach-Object { 
    New-Object psobject -Property @{ 
     Name = $Fruits.Name 
     Color = $Fruits.Colors[$_] | Foreach-Object { $_.Name } 
     Taste = $Fruits.Taste[$_] | Foreach-Object { $_.Name } 
    } 
} | Select-Object Name, Color, Taste 

Ausgang:

Name Color Taste 
---- ----- ----- 
Banana Green Good 
Banana Yellow Bad 
Banana  Awful 
+0

Danke Frode, das war genau das, was ich gesucht habe. – DarkLite1

+0

Nur was ich verbesserte, war: 'Taste = if ($ R.Taste | Select-Object -Index $ _) {$ R.Taste [$ _] | Select-Object -ExpandProperty Name}; 'um Fehler zu vermeiden, wenn nichts verfügbar ist. – DarkLite1

+1

Es sollte gut funktionieren in PS 3.0+ Ich denke (getestet auf PS5), aber in PS2 würde es fehlschlagen. Es gab auch einen Fehler beim Erkennen der Array-Spalten in PS2, also habe ich die Antwort aktualisiert, um beide zu beheben. –

Verwandte Themen