powershell - 如何在 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 将函数变量作为值处理,这意味着它会创建另一个与传入的变量完全相同的变量,并在函数范围内对其进行更改。您想要做的是通过引用进行此操作,这意味着它将与传递给函数的同一对象混淆。这是通过将类型 [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])"
推荐阅读
- java - WebAuthenticationDetailsSource 是什么?
- webpack - webpack 为 js/css 设置输出路径
- reveal.js - 使用reveal.js中的导航键跳转到特定幻灯片
- python - 使用 SymPy 生成动态符号
- selenium - 使用 xPath 确定具有 Nightwatch / Selenium 的表的行数
- git - github不接受令牌
- python - mpi4py 在函数之间广播 numpy 数组
- python - 如何在 matplotlib 中制作带有图像的颜色条?
- laravel - 如何更改 Laravel Mailable 模板中的标题徽标?
- java - 如何从 JAVA 调用 AWS lambda 函数?