Как изменить массив PSCustomObject в Powershell - PullRequest
0 голосов
/ 01 ноября 2018

Я могу изменить свойство PSCustomObject, например Array:

$a.b.c += "new item"

Возможно ли это сделать с помощью функции? Я имею в виду передать $a.b.c, чтобы функционировать и модифицировать его. Кажется, это не тривиально (если возможно, даже): я попробовал [ref], но безуспешно. Единственный способ, который мне подходит, это вернуть новое значение и присвоить его, но это включает выражение $a.b.c с обеих сторон вызова функции, что делает строку длинной. Я пробовал также:

function AddItem {
  Param(
      $Obj,
      $Value,
      [switch]$Uniq
  )
  $MutObj = [System.Collections.ArrayList]$Obj
  $MutObj.Add($Value) > $null
}

но это также не работает, кажется, что $a.b.c += x на самом деле change property "c" of $a.b object, а у меня нет $a.b в области действия функции. Это достижимо даже с помощью функции и с изменениями в своем теле?

1 Ответ

0 голосов
/ 01 ноября 2018

Я думаю, что вы спрашиваете, почему объект не изменяется в функции.

Powershell обрабатывает переменные функции как значения, что означает, что она создает другую переменную в точности как передаваемую и изменяет ее в области действия функции. То, что вы хотите сделать, это сделать это с помощью ссылки, что означает, что он будет связываться с тем же объектом, переданным в функцию. Это делается с помощью типа [Ref], добавляемого к значению, переданному в параметр. В этом примере магия обрабатывается здесь Additem -Object ([ref]$JSON) -Value "TEST"

Полный скрипт

function AddItem {
  Param(
      $Object,
      $Value,
      [switch]$Uniq
  )
  $Object.Value += $Value
}

$JSON = '[["aaa", "bbb"], ["ccc", "ddd"]]' | ConvertFrom-Json 

Additem -Object ([ref]$JSON) -Value "TEST"

"0  : $($JSON[0])"
"0  : $($JSON[1])"
"0  : $($JSON[2])"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...