2016-12-09 63 views
0

這是一個後續行動this questionPowerShell的防止重複對象鍵

如果我有2個JSON文件

file1.json

{ 
    "foo": { 
    "honk": 42 
    } 
} 

file2.json

{ 
    "foo": { 
    "honk": 9000, 
    "toot": 9000 
    } 
} 

而且我使用ConvertFrom-Json創建一個對象

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

PowerShell的會樂意接受兩種,並覆蓋FOO。

foo 

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

的$ bar.foo內容合併

$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 
} 

VS

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

這在所有對象試圖循環時,會引起心痛。

相反,我把所有的數組項目,並將它們組合成1個PowerShell對象。由於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 
}