Search code examples
arrayspowershellarrayofarrays

PowerShell replace value in an array


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

Solution

  • If you really need an array of arrays (type [array[]]), your problem is solved as follows:

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

    That is, each of your $nodes elements is itself an array, and the way you filled $nodes, each [pscustomobject] instance output by your get-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]:

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

    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.