I'm quite new in PowerShell and I would need a little bit of support how to replace values in an array. Please have a look at my example:
[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
If you really need an array of arrays (type
[array[]]
), your problem is solved as follows:That is, each of your
$nodes
elements is itself an array, and the way you filled$nodes
, each[pscustomobject]
instance output by yourget-NcNode | select-object ...
pipeline became its own element of$nodes
, but each as a single-element sub-array - hence the need for the extra[0]
index access.[1]However, it sounds like a regular array (
[array]
, effectively the same as[object[]]
) is sufficient in your case, where each element holds a (single, scalar)[pscustomobject]
:With
$nodes
defined like this, your original code should work.[1] On getting a value - but not on setting - you can get away without the extra index, thanks to PowerShell's member-access enumeration feature.