2016-10-04 33 views
0

下午好, 我在輸出powershell自定義對象時遇到了一些麻煩。輸出重疊字段的數組

它是一個數組,顯示人們和他們擁有什麼水果(信息通過許多其他過程收集,並且是一個真正的PITA來改變)例如;

First, last,<fruit> 
Joe, Bloggs, apple=$true, banana=$true, pear=$true 
Fred, Smith, apple=$true, melon=$true, banana=$true 
Mick, Jones, pear=$true, melon=$true 

如果我使用 $ array | FL * 一切都看起來不錯:採用外GridView控件或出口CSV或$數組時

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 

不幸|英尺*對於這個問題那隻能說明領域是共同所有記錄,例如

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

我想它做的是顯示所有的組合,但只是錯過了不存在的,

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

(最簡單的方法也只是爲t o在加入每種水果的水果「之類

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

爲每個記錄/人鍵/值」,但不會爲最終目標而努力相當這麼好)提前

謝謝。

回答

1

格式表使用的第一個元素的屬性列表,所以你需要手動構建存在的陣列中的所有屬性的列表:

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

(上面的代碼是PS3.0 + ,所以在使用PS2.0的($_.PSObject.Properties | Select -expand Name)代替$_.PSObject.Properties.Name

或者固定第一元件使得格式-表/導出-CSV /的ConvertTo-CSV正常工作爲是:

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

現在的cmdlet將輸出所有屬性:

  • $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

這絕對完美,謝謝 – Nerden