powershell通过引用传递

时间:2017-11-01 20:16:25

标签: json powershell pass-by-reference

我正在尝试通过引用传递JSON,然后向其添加内容。例如,我希望得到同样的结果:

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

我将$json中的密钥保存在$jsonList中的字符串列表中(因为密钥未知且可以更改)以构建$json.commontokens.search.tokens.token

    $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

但它仍然无效。我做的引用错了吗?或者它与钥匙有什么关系?

1 个答案:

答案 0 :(得分:0)

所以,我真的不明白,但我设法让它发挥作用。 在加法器中,我从

更改了递归行
([ref]$j.value.$first)

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

我还添加了一个return,以便更明显地进行递归。

出于某种原因,我仍然无法做$jpath.value += $newItem;但是,从$token移除$jpath后,$jpath.value.token += $newItem就可以了。

因此,我没有添加stringlist中的所有字符串,而是跳过了最后一个字符串。 Adder已更改为跳过最后一个字符串:

($stringList -ne $null)

已更改为

($stringList-ne $stringList.list.last)

其中$stringlist实际上只是一个节点(我应该更改名称)。所以最终的代码是$jpath.value.($stringList.Last.value) += $newItem

我想我不能直接修改$jpath.value?还是什么?