2016-11-24 78 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]]。 –