2016-12-09 15 views
0

を防ぐこれはthis questionPowerShellは重複したオブジェクトキー

にフォローアップされており、私はConvertFrom-Jsonを使用してオブジェクトを作成します

$bar = @(Get-ChildItem . -Filter *.json -Recurse | Get-Content -Raw |ConvertFrom-Json) 

Powershellはうれしく両方を取り、fooを上書きします。 $ bar.fooの

foo 

--- 
@{honk=42} 
@{honk=9000; toot=9000} 

内容が重複したオブジェクトをインポートする場合はどのようにエラーができ

$bar.foo 

honk 
---- 
    42 
9000 

を合併していますか?

答えて

2

各JSONファイルは個別のオブジェクトとしてインポートされるため、実際に上書きすることはありません。あなたはオブジェクトのリストを取得するだけです。

同じトップレベルプロパティを持つ複数のオブジェクトを取得したときにエラーをスローするには、オブジェクトをプロパティ名でグループ化し、カウントが1を超えるとエラーをスローします。

$bar | Group-Object { $_.PSObject.Properties.Name } | 
    Where-Object { $_.Count -gt 1 } | 
    ForEach-Object { throw "Duplicate object $($_.Name)" } 
0

アレイにインポートするとき、すべてのオブジェクトは一意です。この例では、いくつかのオブジェクトに複数のキーが含まれている可能性があるため、オブジェクトを予想通りに反復処理する方法がないため、オブジェクトを配列内に残すことは理想的ではありません。すべてのオブジェクトをループにしようとしたとき

{ 
    "foo": 42 
} 

{ 
    "bar": 9000, 
    "buzz": 9000 
} 

この

は心痛の原因になります。

代わりに、すべての配列アイテムを1つのpowershellオブジェクトにまとめました。 PowerShellオブジェクトは基本的にハッシュで、設計上のハッシュはすべてのキーを一意にする必要があるため、キーを上書きすると自動的にエラーが発生します。

function Load-Servers { 

    $allObjects = @(
     Get-ChildItem '.\servers' -Filter *.json -Recurse | Get-Content -Raw | ConvertFrom-Json 
    ) 
    $object = New-Object PSObject 
    Foreach ($o in $allObjects) { 
     $o.psobject.members | ? {$_.Membertype -eq "noteproperty" } | %{$object | add-member $_.Name $_.Value } 
    } 

    return $object 
}