2017-02-01 21 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です。

これはあなたにも、あなたがオブジェクトを直接作成することができ、とにかくPowerShellを3に頼っているので(とスキップ機能...私が欠けていることをそれのための具体的な理由があると仮定した場合)このように:

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

結果は正しい順序でなければなりませんが、そうでない場合はアクセラレータを組み合わせることができます(例:[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 
}