2017-02-01 1 views
1

해시 테이블에서 Export-Csv로 파이프하도록 사용자 지정 개체를 만들려고합니다. 그러나 CSV 파일을 만들 때 속성의 순서가 모두 잘못되었습니다. 주문을 표시하기 위해 아래에 의견을 기재했습니다.해시 테이블의 등록 정보 순서

function CreateStatusCustomObject 
{ 
    param([Parameter(Mandatory=$true)][Hashtable]$Values) 

    $statusCustomObject = New-Object -TypeName PSObject   

    foreach($value in $Values.GetEnumerator()) 
    { 
     $statusCustomObject | Add-Member -MemberType NoteProperty -Name $value.Name -Value $value.Value 
    } 

    return $statusCustomObject 
} 

$Cec = 'a' 
$DnsServer = 'b' 
$subnetInfoCidr = 'c' 
$oldServerRefreshIntervalValue = 'd' 
$anotherProperty = 'e' 

$statusCustomObject = CreateStatusCustomObject @{Cec = $Cec; #2 
               DnsServer = $DnsServer; #5 
               Cidr = $subnetInfoCidr; #1 
               OldServerRefreshIntervalValue = $oldServerRefreshIntervalValue;#3 
               AnotherProperty = $anotherProperty} #4 

어떻게 주문을 해시 테이블에 넣을 수 있습니까?

답변

2

[ordered] 유형 가속기를 사용할 수 있습니다. PowerShell v3에서 소개 된 것 같습니다. 귀하의 경우에는

, 이것은 트릭 수행해야합니다 장면 뒤에

$statusCustomObject = CreateStatusCustomObject [ordered]@{Cec = $Cec; 
                  DnsServer = $DnsServer; 
                  Cidr = $subnetInfoCidr; 
                  OldServerRefreshIntervalValue = $oldServerRefreshIntervalValue; 
                  AnotherProperty = $anotherProperty} 

을 만든 객체는 실제로 OrderedDictionary입니다.

$statusCustomObject = [pscustomobject]@{ 
    Cec = $Cec 
    DnsServer = $DnsServer 
    Cidr = $subnetInfoCidr 
    OldServerRefreshIntervalValue = $oldServerRefreshIntervalValue 
    AnotherProperty = $anotherProperty 
} 
이 이후

어쨌든 PowerShell을 3에 의존, 당신은 또한이 같은 (내가 부족 것을 그것을위한 특별한 이유가있는 가정 ... 그리고 스킵 기능) 직접 개체를 만들 수 있습니다

올바른 순서로 결과를 가져야하지만 그렇지 않은 경우 가속기를 결합 할 수 있습니다 (예 : [pscustomobject][ordered]@{})

0

다음과 같은 패턴으로 문제에 접근합니다.

CODE

#data 

$listofitems = @() 

$myDataItem = [PSCustomOBject]@{ 
    Cec = 'a' 
    DnsServer = 'b' 
    subnetInfoCidr = 'c' 
    oldServerRefreshIntervalValue = 'd' 
    anotherProperty = 'e' 
} 

$listofitems += $myDataItem 

$myDataItem = [PSCustomOBject]@{ 
    Cec = 'a1' 
    DnsServer = 'b1' 
    subnetInfoCidr = 'c1' 
    oldServerRefreshIntervalValue = 'd1' 
    anotherProperty = 'e1' 
} 

$listofitems += $myDataItem 

cls 
Write-Output "all properties" 
$listofitems | ConvertTo-Csv -NoTypeInformation 

Write-Output "`r`nproperties in my own order" 
$listofitems | Select oldServerRefreshIntervalValue, DnsServer | ConvertTo-Csv -NoTypeInformation 

출력

all properties 
"Cec","DnsServer","subnetInfoCidr","oldServerRefreshIntervalValue","anotherProperty" 
"a","b","c","d","e" 
"a1","b1","c1","d1","e1" 

properties in my own order 
"oldServerRefreshIntervalValue","DnsServer" 
"d","b" 
"d1","b1" 
0
같은 당신도 당신의 함수로 정렬 할 수 있습니다

:

function CreateStatusCustomObject 
{ 
    param([Parameter(Mandatory=$true)][Hashtable]$Values) 

    $statusCustomObject = New-Object -TypeName PSObject 

    $Values.Keys | sort -CaseSensitive | %{ 
    $key=$_;$value=$Values[$_]; 
    $statusCustomObject | Add-Member -MemberType NoteProperty -Name $key -Value $value 
    } 

    return $statusCustomObject 
}