1

我是 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
4

1 回答 1

3

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

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

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


但是,在您的情况下,听起来像常规数组 ( [array],实际上与[object[]]) 就足够了,其中每个元素都包含一个 (single, scalar) [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 的成员枚举功能,您可以在没有额外索引的情况下摆脱困境。

于 2020-07-13T12:21:38.380 回答