2016-11-24 47 views
1

我試圖根據特定條件創建具有字段的對象數組。 我有部份代碼:具有動態字段的數組

$Array = @(1,2,3,4,5,6,3,4,5,7,9,0,8,9) 
$CurrentFolder = Split-Path -parent $MyInvocation.MyCommand.Definition 
$Report = @() 
foreach($Item in $Array) 
{ 
    $Obj = New-Object PSObject     

    $Obj | Add-Member -MemberType NoteProperty -Name "Item" -Value $Item    

    switch ($Item) 
    { 
     1 { $Obj | Add-Member -MemberType NoteProperty -Name "Field_1" -Value "Value_Field_1"} 
     2 { $Obj | Add-Member -MemberType NoteProperty -Name "Field_2" -Value "Value_Field_2"} 
     3 { $Obj | Add-Member -MemberType NoteProperty -Name "Field_3" -Value "Value_Field_3"} 
     4 { $Obj | Add-Member -MemberType NoteProperty -Name "Field_4" -Value "Value_Field_4"} 
     5 { $Obj | Add-Member -MemberType NoteProperty -Name "Field_5" -Value "Value_Field_5"} 
     6 { $Obj | Add-Member -MemberType NoteProperty -Name "Field_6" -Value "Value_Field_6"} 
     7 { $Obj | Add-Member -MemberType NoteProperty -Name "Field_7" -Value "Value_Field_7"} 
     8 { $Obj | Add-Member -MemberType NoteProperty -Name "Field_8" -Value "Value_Field_8"} 
     9 { $Obj | Add-Member -MemberType NoteProperty -Name "Field_9" -Value "Value_Field_9"} 
     0 { $Obj | Add-Member -MemberType NoteProperty -Name "Field_0" -Value "Value_Field_0"} 
    } 
    $Report = $Report + $Obj 
} 
$Report | ft -autosize 
#$Report | Get-member 

當我執行這個代碼,我得到的只是兩個屬性。 ItemField_1,我得到屬性Field_1,因爲數字1是數組變量的第一項。

我想獲得一個數組,其所有屬性Field_0Field_9及其值如果它們是空的或不是。

我試過這個使用哈希表,但我得到了同樣的結果。

回答

1

您必須創建對象的每個屬性(不在交換機中)。然後,而不是使用一個開關,你可以訪問實際的財產,併爲其分配:

$Array = @(1,2,3,4,5,6,3,4,5,7,9,0,8,9) 
$CurrentFolder = Split-Path -parent $MyInvocation.MyCommand.Definition 
$Report = @() 
foreach($Item in $Array) 
{ 
    $Obj = New-Object PSObject     

    $Obj | Add-Member -MemberType NoteProperty -Name "Item" -Value $Item 
    $Obj | Add-Member -MemberType NoteProperty -Name "Field_1" -Value $null 
    $Obj | Add-Member -MemberType NoteProperty -Name "Field_2" -Value $null 
    $Obj | Add-Member -MemberType NoteProperty -Name "Field_3" -Value $null 
    $Obj | Add-Member -MemberType NoteProperty -Name "Field_4" -Value $null 
    $Obj | Add-Member -MemberType NoteProperty -Name "Field_5" -Value $null 
    $Obj | Add-Member -MemberType NoteProperty -Name "Field_6" -Value $null 
    $Obj | Add-Member -MemberType NoteProperty -Name "Field_7" -Value $null 
    $Obj | Add-Member -MemberType NoteProperty -Name "Field_8" -Value $null 
    $Obj | Add-Member -MemberType NoteProperty -Name "Field_9" -Value $null 
    $Obj | Add-Member -MemberType NoteProperty -Name "Field_0" -Value $null 

    $obj."Field_$Item" = $Item  

    $Report = $Report + $Obj 
} 
$Report | ft -autosize 

輸出:

Item Field_1 Field_2 Field_3 Field_4 Field_5 Field_6 Field_7 Field_8 Field_9 
---- ------- ------- ------- ------- ------- ------- ------- ------- ------- 
    1  1                 
    2   2                
    3     3              
    4       4            
    5         5          
    6           6        
    3     3              
    4       4            
    5         5          
    7             7      
    9                 9  
    0                   
    8               8    
    9                 9  

注意:如果您正在使用PowerShell的> 2,你也可以實現同樣的使用:

$Report = @(1,2,3,4,5,6,3,4,5,7,9,0,8,9) | ForEach-Object { 
    $Obj = [PsCustomObject]@{ 
     Item = $_ 
     Field_1 = $null 
     Field_2 = $null 
     Field_3 = $null 
     Field_4 = $null 
     Field_5 = $null 
     Field_6 = $null 
     Field_7 = $null 
     Field_8 = $null 
     Field_9 = $null 
     Field_0 = $null 
    }   

    $Obj."Field_$_" = $_ 
    $Obj 
} 
$Report | ft -autosize 
+2

缺點ider'New-Object psobject -Property @ {Item = $ Item; ...}而不是'Add-Member'(非常慢) –

+0

@Martin,你注意到表中沒有輸出中的「Field_0」並且只有Field_1和Item是Int32類型嗎?爲什麼? – LotPings

+0

@LotPings這可能是因爲有很多列,最後一個被截斷。但是,如果您省略'| ft -autosize'管道,那麼您可以看到該字段。要強制所有項目是一個整數,你可以在每個字段前寫入[[int]]。 –

相關問題