PowerShell 替换数组中的值

PowerShell replace value in an array

我是 PowerShell 的新手,我需要一些关于如何替换数组中的值的支持。请看我的例子:

[array[]]$nodes = @()
[array[]]$nodes = get-NcNode | select-object -property Node, @{Label = "slot"; expression = {@("a")*4}}

$nodes
Node       slot
----       ----
nn01       {a,a,a,a}
nn02       {a,a,a,a}
nn03       {a,a,a,a}
nn04       {a,a,a,a}             
 
$nodes[0].slot[0]
      a

$nodes[0].slot[0] = "b"            #I try to replace a with b
$nodes[0].slot[0]
      a                            #It didn’t work

$nodes[0].slot.SetValue("b",0)     #I try to replace a with b
$nodes[0].slot[0]
      a                            #It didn’t work

$nodes[0] | Add-Member -MemberType NoteProperty -Name slot[0] -Value "b" -Force
$nodes[0]
Node       slot      slot[0]
----       ----      -------
nn01       {a,a,a,a} b              #That’s not what I wanted

如果你真的需要一个数组的数组(类型[array[]]),你的问题解决如下:

$nodes[0][0].slot[0] = "b" 

也就是说,你的每个 $nodes 元素本身就是一个数组,你填充 $nodes 的方式,你的 get-NcNode | select-object ... 管道输出的每个 [pscustomobject] 实例变成了它自己的 $nodes 元素,但每个 作为单元素子数组 - 因此需要额外的 [0] 索引访问。 [1]


但是,这听起来像一个常规数组([array],实际上与 [object[]] 相同)在您的情况下就足够了,其中每个元素都包含一个(单个,标量)[pscustomobject]:

# Type constraint [array] creates a regular [object[]] array.
[array] $nodes = get-NcNode | select-object -property Node, @{Label = "slot"; expression = {@("a")*4}}

按这样定义 $nodes,您的原始代码应该可以工作。


[1] 在 获取 一个值时 - 但在 设置 时不存在 - 你可以在没有额外的情况下离开索引,感谢 PowerShell 的 member-access enumeration 功能。