包含动态字段的数组

时间:2016-11-24 11:58:57

标签: arrays powershell dynamic

我试图根据某些条件创建一个包含字段的对象数组。 我有代码:

$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 个答案:

答案 0 :(得分: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&gt; 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