PowerShell заменяет значение в массиве - PullRequest
1 голос
/ 13 июля 2020

Я новичок в 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

1 Ответ

3 голосов
/ 13 июля 2020

Если вам действительно нужен массив массивов (тип [array[]]), ваша проблема решается следующим образом:

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

То есть каждый из ваших $nodes элементов сам является массивом, и как вы заполнили $nodes, каждый экземпляр [pscustomobject], выводимый вашим get-NcNode | select-object ... конвейером, стал отдельным элементом $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] При получении значения - но не при настройке - вы можете обойтись без дополнительного индекса благодаря перечислению элементов * 1034 в PowerShell. * особенность.

...