2017-11-01 16 views
2

JSONを参照渡ししてから、何かを追加しようとしています。参照渡しのpowershell

:(キーは未知であり、変更することができますので)私は $json.commontokens.search.tokens.tokenを構築するために $jsonList内の文字列のリストで $jsonを次のキーを保つ

$json.commontokens.search.tokens.token += $newItem

:たとえば、私は同じことを取得したいです

$jPath = $json 
    foreach($item in $jsonList){ 
     $jPath = $jPath.$item 
    } 

この結果、$jpath += $newItem$jsonに変更されません(しかし、$jpathの場合は機能します)。だから私は変更を維持するために参照することによって渡す必要があると思った。

function adder{ 
    param(
     [ref]$j 
     $stringList 
    ) 
    if ($stringList -ne $null) { 
     $first = $stringList.first.value 
     $stringList.removefirst() 
     adder ([ref]$j.value.$first) $stringList 
    } else { 
     return $j 
    } 
} 

$jpath = adder ([ref]$json) $jsonList 
$jpath.value += $newItem 

のようなものはやはり、これは$jpathのために動作しますが、何も$jsonに起こりません。 $jpath.value[70]を試しても、期待通りの回答が得られますが、$json[70]は存在しません。実際には、私は関数なしで試しました:

$jpath = [ref]$json.commontokens.search.tokens.token 
$jpath.value += $newItem 

しかし、それでも動作しません。私は間違った参照をしていますか?それとも、キーと関係がありますか?

+0

あなたの機能と関係があるかもしれません。私は関数 "加算器"を作成していて、その内部に "加算器"を参照しているのが分かります。それは、あなたが参照しているものが分からないということについて何らかのエラーを与えるはずです。 –

+0

オブジェクト参照を受け取る関数に引数を渡すときは、その呼び出しに参照を含める必要があります。つまり、 'adder -j([ref] $ Json)-stringList $ List'です。 '$ j.Value'を操作する必要があります(また、有効なオブジェクトを渡してください) – TheIncorrigible1

+0

明確化:' return $ j.Value'、 '$ j.Value + =あなたの例では$ first'と '$ jpath + = $ newItem'はこれをクリアします。 – TheIncorrigible1

答えて

0

私はそれを実際に理解していませんが、それをうまく機能させることができました。 は、加算器では、私はまた、私は再帰をしていた、それがより明白にするためにreturnを追加

([ref]$($jvalue.value.$first)) 

([ref]$j.value.$first) 

から再帰的なラインを変更しました。

何らかの理由で、私はまだできませんでした$jpath.value += $newItem;ただし、を$jpathから削除すると、$jpath.value.token += $newItemが機能します。

したがって、stringlistからすべての文字列を追加するのではなく、最後の文字列をスキップしました。 加算器は、最後の文字列をスキップするように変更されました:

($stringList -ne $null) 

$stringlistが今実際にはノードである
($stringList-ne $stringList.list.last) 

に変更されました(私はおそらく名前を変更する必要があります)。最終的なコードは$jpath.value.($stringList.Last.value) += $newItemです。

私はちょうどまっすぐアップできないと思います$jpath.value?か何か?