【问题标题】:powershell passing by referencepowershell 通过引用传递
【发布时间】:2018-04-14 06:00:06
【问题描述】:

我正在尝试通过引用传递 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

但它仍然不起作用。我在做参考错误吗?还是跟钥匙有关系?

【问题讨论】:

  • 这可能与您的功能有关。我看到您正在创建函数“adder”,并在其中引用“adder”。它应该会给你一些关于不知道你在引用什么的错误。
  • 当您将参数传递给接受对象引用的函数时,您需要在调用中包含该引用,即adder -j ([ref]$Json) -stringList $List。无需返回$j,您需要操作$j.Value(同时,传递一个有效的对象开始)
  • 澄清:return $j.Value$j.Value += $first$jpath += $newItem 在您的示例中应该可以解决这个问题。
  • [ref] "magic" 仅适用于变量。 [ref]$j.value.$first 将引用值的副本

标签: json powershell pass-by-reference


【解决方案1】:

所以,我不太了解它,但我设法让它工作。 在加法器中,我将递归行从

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

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

我还添加了一个return 以更明显地表明我正在执行递归。

由于某种原因,我仍然无法做到$jpath.value += $newItem;但是,通过从 $jpath 中删除 $token$jpath.value.token += $newItem 可以工作。

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

($stringList -ne $null)

改为

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

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

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

【讨论】:

    猜你喜欢
    • 2014-01-16
    • 2021-03-22
    • 2018-12-07
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    • 2015-01-12
    • 2013-09-10
    • 2020-04-01
    相关资源
    最近更新 更多