2016-11-24 7 views
1

特定の条件に応じてフィールドを持つオブジェクトの配列を作成しようとしています。 私はTHSコードを持っている:私はこのコードを実行すると動的フィールドを持つ配列

$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 

は、私はちょうど2つのプロパティを取得します。 ItemField_1の場合は、配列変数の最初の項目が数字1であるため、プロパティーはField_1になります。

すべてのプロパティがField_0からField_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

を使用して同じ結果を達成することもできます。新しいオブジェクトpsobject -Property @ {Item = $ Item; ...} 'Add-Member'の代わりにv2.0の場合(極端に遅い) –

+0

@Martin、テーブルには" Field_0 "が出力されておらず、Field_1とItemだけがInt32型であることがわかりましたか?どうして ? – LotPings

+0

@LotPingsおそらく、多くの列があり、最後の列が切り捨てられるからです。しかし、 'ft -autosize'パイプを省略すると、フィールドが表示されます。すべての項目を強制的にintにするには、各フィールドの前に '[int]'を書くことができます。 –

関連する問題