2016-10-04 2 views
0

Guten Nachmittag, Ich habe ein kleines Problem mit der Ausgabe eines Powershell-Objekts.Ausgabe eines Arrays mit überlappenden Feldern

Es ist ein Array zeigt Menschen und welche Früchte haben sie (die Informationen werden durch eine Reihe von anderen Prozessen gesammelt und wäre eine echte PITA zu ändern) z.

Wenn ich $ array | fl * alles sieht gut aus:

First: Joe 
Last: Bloggs 
apple: True 
Banana: True 
Pear: True 

First: Mick 
Last: Jones 
apple: True 
melon: True 
banana: True 

First: Fred 
Last: Smith 
Pear: True 
melon: True 

leider bei der Verwendung von Out-Gridview oder export-csv oder $ array | ft * was das betrifft es Felder nur zeigt, die gemeinsam sind für alle Datensätze zB

$array|ft * 
First  Last 
----  ---- 
Joe  Bloggs 
Mick  Jones 
Fred  Smith 

Was würde ich es tun möchte ist, alle Kombinationen zeigen, sondern nur die, die zu kurz kommen, die nicht existieren,

$array|ft * 
First  Last  Apple  Banana  Pear  Melon 
----  ----  ----  ----  ----  ---- 
Joe  Bloggs True  True  True 
Mick  Jones True  True    True 
Fred  Smith       True  True 

(Der einfachste Weg wäre nur t o jede Frucht auf eine Frucht „Schlüssel/Wert für jeden Datensatz/Person wie

First: Joe 
Last: Bloggs 
Fruit: {apple, banana, melon} 

“ beitreten, aber das wäre nicht ganz so gut funktionieren für das Endziel)

Vielen Dank im Voraus .

Antwort

1

Format-Table verwendet die Eigenschaftsliste des ersten Elements, so dass Sie manuell die Liste aller Eigenschaften bauen müssen, die in der Anordnung vorhanden sein:

$fruits = $array | ForEach { $_.PSObject.Properties.Name -ne 'First' -ne 'Last' } | 
        Sort -unique 
$properties = @('First', 'Last') + $fruits 
$array | ft $properties 

(Der obige Code ist für PS3.0 + so in PS2.0 verwenden ($_.PSObject.Properties | Select -expand Name) statt $_.PSObject.Properties.Name)

Oder beheben, um das erste Element so dass Format-Table/Export-Csv/ConvertTo-Csv korrekt funktionieren wie:

$missing = @{} 
$array | ForEach { $_.PSObject.Properties | Select -expand Name } | 
     Sort -Unique | 
     Where { $array[0].$_ -eq $null } | 
     ForEach { $missing.$_ = $null } 
$array[0] | Add-Member -NotePropertyMembers $missing 

nun die Cmdlets gibt alle Eigenschaften:

  • $array | ft

    First Last apple Banana Pear melon 
    ----- ---- ----- ------ ---- ----- 
    Joe Bloggs True True True  
    Mick Jones True True  True 
    Fred Smith    True True 
    
  • $array | ConvertTo-Csv -NoTypeInformation

    "First","Last","apple","Banana","Pear","melon" 
    "Joe","Bloggs","True","True","True", 
    "Mick","Jones","True","True",,"True" 
    "Fred","Smith",,,"True","True" 
    
+0

Das funktioniert absolut perfekt, danke – Nerden