2017-11-08 5 views
4

私に許してくださいますが、このための正しい用語は分かりません。ハッシュテーブルにキー/値のペアを追加する(配列内にネストされ、ハッシュテーブルにネストされています)

次ハッシュテーブルと仮定すると:私は行うことができます

$ConfigurationData = @{ 
    AllNodes = @(
     @{ 
      NodeName="*" 
      PSDscAllowPlainTextPassword=$True 
      PsDscAllowDomainUser=$True 
      NewItem = "SomeNewValue" 
      AnotherNewItem = "Hello" 
     } 
    ) 
} 

$ConfigurationData.AllNodes += @{NewItem = "SomeNewValue"} 
$ConfigurationData.AllNodes += @{AnotherNewItem = "Hello"} 

そして$ConfgurationData.AllNodesルックスをしてどのように私はそれがこのように見えるようです

$ConfigurationData = @{ 
    AllNodes = @(
     @{ 
      NodeName="*" 
      PSDscAllowPlainTextPassword=$True 
      PsDscAllowDomainUser=$True 
     } 
    ) 
} 

を右:

$ConfigurationData.AllNodes 

Name       Value                                    
----       -----                                    
NodeName      *                                     
PSDscAllowPlainTextPassword True                                    
PsDscAllowDomainUser   True                                    
NewItem      SomeNewValue                                  
AnotherNewItem     Hello 

しかし、JSONに変換することは別の話告げる:

$ConfigurationData | ConvertTo-Json 
{ 
    "AllNodes": [ 
        { 
         "NodeName": "*", 
         "PSDscAllowPlainTextPassword": true, 
         "PsDscAllowDomainUser": true 
        }, 
        { 
         "NewItem": "SomeNewValue" 
        }, 
        { 
         "AnotherNewItem": "Hello" 
        } 
       ] 
} 

NewItemAnotherNewItemは独自のハッシュテーブルにあるといない最初のもので、これはDSCがグラグラを投げるために発生します

ValidateUpdate-ConfigurationData : all elements of AllNodes need to be hashtable and has a property NodeName.


私はfolloを行うことができます

$ConfigurationData.AllNodes.GetEnumerator() += @{"NewItem" = "SomeNewValue"} 

は、同様のがあります:私も試したとして失敗しました$ConfigurationData.AllNodes += @{NewItem = "SomeNewValue"}

のようなラインに比べ

$ConfigurationData = @{ 
    AllNodes = @(
     @{ 
      NodeName="*" 
      PSDscAllowPlainTextPassword=$True 
      PsDscAllowDomainUser=$True 
     } 
    ) 
} 

#$ConfigurationData.AllNodes += @{NewItem = "SomeNewValue"} 
#$ConfigurationData.AllNodes += @{AnotherNewItem = "Hello"} 

foreach($Node in $ConfigurationData.AllNodes.GetEnumerator() | Where-Object{$_.NodeName -eq "*"}) 
{ 
      $node.add("NewItem", "SomeNewValue") 
      $node.add("AnotherNewItem", "Hello") 
} 

$ConfigurationData | ConvertTo-Json 
{ 
    "AllNodes": [ 
        { 
         "NodeName": "*", 
         "PSDscAllowPlainTextPassword": true, 
         "NewItem": "SomeNewValue", 
         "AnotherNewItem": "Hello", 
         "PsDscAllowDomainUser": true 
        } 
       ] 
} 

しかし、これはやり過ぎと思われる、:私は右の結果を与える翼正しい "要素"をターゲットにする方法は?

答えて

3
$ConfigurationData.AllNodes[0].'NewItem' = 'SomeNewValue' 
$ConfigurationData.AllNodes[0].'AnotherNewItem' = 'Hello' 

この行はアレイレベルにある項目を追加しています。実際に

$ConfigurationData.AllNodes += @{NewItem = "SomeNewValue"} 

、あなたのハッシュテーブルである配列、の最初の要素に追加する:

($ConfigurationData.AllNodes)[0] += @{"new item" = "test"} 
+0

ありがとうございます。とても簡単。なぜ私はそれを考えなかったのですか? Dscのコンパイルも楽しいです。 – woter324

0

実は、私がしようとしなかっただけの事:

$ConfigurationData = @{ 
    AllNodes = @(
     @{ 
      NodeName="*" 
      PSDscAllowPlainTextPassword=$True 
      PsDscAllowDomainUser=$True 
     } 
    ) 
} 

$ConfigurationData.AllNodes.GetEnumerator().Add("NewItem","SomeNewValue") 

$ConfigurationData.AllNodes.GetEnumerator().Add("AnotherNewItem","Hello") 

$ConfigurationData | ConvertTo-Json 




{ 
    "AllNodes": [ 
        { 
         "NodeName": "*", 
         "PSDscAllowPlainTextPassword": true, 
         "NewItem": "SomeNewValue", 
         "AnotherNewItem": "Hello", 
         "PsDscAllowDomainUser": true 
        } 
       ] 
} 

は、私は一種のGetEnumeratorビットを理解しています。これは、並べ替えのインデックスを作成するので、PSはアイテムを扱うことができます。

しかし、なぜ私は.Add()メソッドを使用しなければならないのですか?[email protected]{}は機能しませんでした。

3

内部ハッシュテーブルの周囲に$ConfigurationDataの初期宣言に入れた@()括弧が原因で問題が発生しています。

gms0ulmanの回答ごとに配列インデックス演算子を使用してこの配列のインデックスにアクセスし、そのプロパティを変更する必要があります。例えば最初の要素に対して:

+0

ありがとうございました。 JSON出力は正しいですが、@()を削除すると、DSCはコンパイルに失敗します。私がQuで引用したのと同じエラー。 (DSCを明示的に尋ねなかったのは分かっていますが、他の人はこのページが同じDSC問題にぶつかることがあります)。 – woter324

+0

私の答えは変更されましたが、基本的にgms0ulmanは正しいです。 @()はallnodesを配列として宣言しています。この配列にはハッシュテーブルが設定されているため、配列インデックスにアクセスする必要があります。 –

関連する問題