2016-11-24 2 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 

난 그냥 두 가지 속성을 얻을 : 나는 THS 코드가 있습니다. 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

단점 짝수'New-Object psobject -Property @ {Item = $ Item; ...}'Add-Member' 대신에 v2.0에 대해 (매우 느림) –

+0

@Martin, 테이블에 "Field_0"이 없으며 Field_1 및 Item 만 Int32 유형으로 나타 났습니까? 왜 ? – LotPings

+0

@LotPings 아마도 많은 열이 있고 마지막 열이 잘 리기 때문일 것입니다. 그러나'ft -autosize' 파이프를 생략하면 볼 수있는 필드가 있습니다. 모든 항목을 강제로 int로 만들려면 각 필드 앞에'[int]'를 쓸 수 있습니다. –

관련 문제