首页 > 解决方案 > 如何在 Powershell 中更改 PSCustomObject 数组

问题描述

我可以修改 PSCustomObject 属性,它是数组,如:

$a.b.c += "new item"

可以用函数来做吗?我的意思是传递$a.b.c给函数并修改它。似乎这不是微不足道的(如果可能的话):我尝试过[ref]但没有成功。只有一种对我有用的方法是返回新值并分配它,但这涉及$a.b.c函数调用两侧的表达式,这使得行长。我也试过:

function AddItem {
  Param(
      $Obj,
      $Value,
      [switch]$Uniq
  )
  $MutObj = [System.Collections.ArrayList]$Obj
  $MutObj.Add($Value) > $null
}

但这也不起作用,似乎$a.b.c += x实际上是change property "c" of $a.b object我没有$a.b在函数范围内。即使有功能并在其体内进行了适当的修改,它是否也可以实现?

标签: powershell

解决方案


我想你要问的是为什么对象在函数中没有改变。

Powershell 将函数变量作为值处理,这意味着它会创建另一个与传入的变量完全相同的变量,并在函数范围内对其进行更改。您想要做的是通过引用进行此操作,这意味着它将与传递给函数的同一对象混淆。这是通过将类型 [Ref] 添加到传递给参数的值来完成的。在这个例子中,魔法在这里处理Additem -Object ([ref]$JSON) -Value "TEST"

完整脚本

function AddItem {
  Param(
      $Object,
      $Value,
      [switch]$Uniq
  )
  $Object.Value += $Value
}

$JSON = '[["aaa", "bbb"], ["ccc", "ddd"]]' | ConvertFrom-Json 

Additem -Object ([ref]$JSON) -Value "TEST"

"0  : $($JSON[0])"
"0  : $($JSON[1])"
"0  : $($JSON[2])"

推荐阅读