Как получить список определенного поля из списка объектов в powershell - PullRequest
2 голосов
/ 29 марта 2019

Я новичок в сценариях powershell.Извиняюсь, если мне не хватает чего-то простого.

Допустим, у меня есть объект с именем object, в котором есть поле с именем field.Теперь пусть будет список этих объектов.

Как бы получить список полей в том же порядке?

В Python это будет:

list_of_objects = [o1, o2, o3]
list_of_fields = [i.field for i in list_of_object]

Ответы [ 2 ]

2 голосов
/ 29 марта 2019

- это хорошо, но не так красиво, потому что оно разворачивает коллекции для вас, и иногда это может скрывать, что он маскирует элементы элементов.Когда вы используете $parents.item, вы получаете доступ к методу массива и пытаетесь получить доступ к его членам (которых там нет, поэтому дает вам $null):

Item           ParameterizedProperty System.Object IList.Item(int index) {get;set;}

Вы можете преодолеть это с помощью метода, которым я поделился в комментариях, для итерации по каждому члену и избежать маскировки:

$list = $parents | ForEach-Object -MemberName item
$list.registration.parentCompoundNumber

В качестве альтернативы, синтаксис больше людейзнакомы с:

$list = $parents | Select-Object -ExpandProperty item

или его развертыванием самостоятельно:

# you could directly assign the outputs of a `foreach` loop to a variable by
# removing these comments (<##>)
<# $items = #> 
  foreach ($parent in $parents) {
    $parent.item.registration.parentCompoundNumber
  }

Чтобы увидеть, когда происходит это маскирование, рассмотрим пример, в котором используется оператор унарного массива:

, @('a', 'b', 'c') | Get-Member

Это позволит вам наблюдать за массивом обёрток или членами коллекции.

1 голос
/ 29 марта 2019

В дополнение к Полезный ответ TheIncorrigible1 :

Связанный ответ содержит возможные обходные пути для коллизий имени участника; позвольте мне добавить альтернативу PSv4 + , которая является одновременно более сжатой и быстрой, чем подход на основе конвейера:

$parent.ForEach('item').registration.parentCompoundNumber

Использование метода массива .ForEach() с именем свойства ('item') однозначно нацеливает elements 'members.


Чтобы предложить небольшое перефразирование объяснения , почему требуется обходной путь:

  • Перечисление члена PowerShell по существу обрабатывает $someCollection.someProp, как если бы вы написали foreach ($element in $someCollection) { $element.someProp }; то есть элементы $someCollection перечисляются, а значения свойств элементов .someProp возвращаются в виде массива.

    • Примечание: Как и в конвейере, если в коллекции есть только один элемент, значение свойства этого элемента возвращается как есть , а не как одноэлементный массив.
  • Однако, если в самом типе коллекции окажется элемент с именем someProp, , то он используется, и перечисление не выполняется; то есть члены уровня коллекции shadow (имеют приоритет над) элементы уровня элемента с тем же именем - и это то, что произошло с .Item в вашем случае.

    • В случае сомнений выведите $someCollection.someProp в интерактивном режиме / во время отладки, чтобы увидеть, к чему это приводит.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...