about_Member-Access_Enumeration

Краткое описание

Описывает автоматическое перечисление элементов коллекции списков при использовании оператора доступа к члену.

Подробное описание

Начиная с PowerShell 3.0 функция перечисления доступа к членам повышает удобство использования оператора доступа к членам (.) в объектах коллекции списков. При использовании оператора доступа к члену для доступа к элементу, который не существует в коллекции, PowerShell автоматически перечисляет элементы в коллекции и пытается получить доступ к указанному элементу на каждом элементе.

Перечисление доступа к членам помогает создавать более простой и короткий код. Вместо того, чтобы отправлять объект ForEach-Object коллекции или использовать ForEach()встроенный метод для доступа к элементам в коллекции, можно использовать оператор доступа к члену в объекте коллекции.

Эти команды функционально идентичны последнему, демонстрируя использование оператора доступа к члену:

Get-Service -Name event* | ForEach-Object -Process { $_.DisplayName }
(Get-Service -Name event*).ForEach({ $_.DisplayName })
(Get-Service -Name event*).DisplayName
Windows Event Log
COM+ Event System

Windows Event Log
COM+ Event System

Windows Event Log
COM+ Event System

Примечание.

Оператор доступа к членам можно использовать для получения значений свойства для элементов в коллекции, но его нельзя использовать для их прямого задания. Дополнительные сведения см. в about_Arrays.

При использовании оператора доступа к члену для любого объекта и указанного члена в этом объекте вызывается элемент. Для членов свойства оператор возвращает значение этого свойства. Для членов метода оператор вызывает этот метод в объекте.

При использовании оператора доступа к члену в объекте коллекции списков, который не имеет указанного элемента, PowerShell автоматически перечисляет элементы в этой коллекции и использует оператор доступа к членам для каждого перечисленного элемента.

Можно проверка, если объект является коллекцией списков, увидев, реализует ли его тип интерфейс IList:

$List = @('a', 'b')
$Hash = @{ a = 'b' }
$List.GetType().ImplementedInterfaces.Name -contains 'IList'
$Hash.GetType().ImplementedInterfaces.Name -contains 'IList'
True

False

Во время перечисления доступа к члену для свойства оператор возвращает значение свойства для каждого элемента, имеющего это свойство. Если у элементов нет указанного свойства, оператор возвращается $null.

Во время перечисления доступа к члену для метода оператор пытается вызвать метод для каждого элемента в коллекции. Если какой-либо элемент в коллекции не имеет указанного метода, оператор возвращает исключение MethodNotFound .

Предупреждение

Во время перечисления доступа к члену для метода метод вызывается для каждого элемента в коллекции. Если вызываемый метод вносит изменения, изменения вносятся для каждого элемента в коллекции. Если во время перечисления возникает ошибка, метод вызывается только в элементах, перечисленных до ошибки. Для дополнительной безопасности рекомендуется вручную перечислять элементы и явно обрабатывать любые ошибки.

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

Доступ к членам объекта, отличного от списка

При использовании оператора доступа к члену в объекте, который не является коллекцией списков и который имеет элемент, команда возвращает значение свойства или выходных данных метода для этого объекта.

$MyString = 'abc'
$MyString.Length
$MyString.ToUpper()
3

ABC

При использовании оператора доступа к члену в объекте, который не имеет элемента, команда возвращается $null , если указать свойство или ошибку MethodNotFound при указании метода.

$MyString = 'abc'
$null -eq $MyString.DoesNotExist
$MyString.DoesNotExist()
True

InvalidOperation:
Line |
   3 |  $MyString.DoesNotExist()
     |  ~~~~~~~~~~~~~~~~~~~~~~~~
     | Method invocation failed because [System.String] does not contain a method named 'DoesNotExist'.

Доступ к членам объекта коллекции списков

При использовании оператора доступа к члену в объекте коллекции с элементом всегда возвращается значение свойства или результат метода для объекта коллекции.

Доступ к элементам, существующим в коллекции, но не к его элементам

В этом примере указанные элементы существуют в коллекции, но не элементы в ней.

[System.Collections.Generic.List[string]]$Collection = @('a', 'b')
$Collection.IsReadOnly
$Collection.Add('c')
$Collection
False

a
b
c

Доступ к элементам, существующим в коллекции и его элементах

В этом примере указанные элементы существуют как в коллекции, так и в элементах. Сравните результаты команд с помощью оператора доступа к членам в коллекции с результатами использования оператора доступа к членам в элементах ForEach-Objectколлекции. В коллекции оператор возвращает значение свойства или результат метода для объекта коллекции, а не элементов в нем.

[System.Collections.Generic.List[string]]$Collection = @('a', 'b', 'c')
$Collection.Count
$Collection | ForEach-Object -Process { $_.Count }
$Collection.ToString()
$Collection | ForEach-Object -Process { $_.ToString() }
3

1
1
1

System.Collections.Generic.List`1[System.String]

a
b
c

Примечание.

Коллекции, реализующие интерфейс System.Collections.IDictionary , такие как HashTable и OrderedDictionary, имеют другое поведение. При использовании оператора доступа к члену в словаре с тем же именем, что и свойство, он возвращает значение ключа вместо свойства.

Вы можете получить доступ к значению свойства объекта словаря с помощью встроенного элемента psbase. Например, если имя ключа и keys вы хотите вернуть коллекцию ключей HashTable , используйте следующий синтаксис:

$hashtable.PSBase.Keys

Доступ к элементам, существующим во всех элементах коллекции, но не к самому себе

При использовании оператора доступа к члену в объекте коллекции, который не имеет элемента, но элементы в нем, PowerShell перечисляет элементы в коллекции и возвращает значение свойства или результат метода для каждого элемента.

[System.Collections.Generic.List[string]]$Collection = @('a', 'b', 'c')
$Collection.Length
$Collection.ToUpper()
1
1
1

A
B
C

Доступ к элементам, которые существуют ни в коллекции, ни в его элементах

Если вы используете оператор доступа к члену в объекте коллекции, который не имеет элемента и не делает элементов в нем, команда возвращается $null , если указать свойство или MethodNotFound ошибку при указании метода.

[System.Collections.Generic.List[string]]$Collection = @('a', 'b', 'c')
$null -eq $Collection.DoesNotExist
$Collection.DoesNotExist()
True

InvalidOperation:
Line |
   3 |  $Collection.DoesNotExist()
     |  ~~~~~~~~~~~~~~~~~~~~~~~~~~
     | Method invocation failed because [System.String] does not contain a method named 'DoesNotExist'.

Так как у объекта коллекции нет элемента, PowerShell перечислил элементы в коллекции. Обратите внимание, что ошибка MethodNotFound указывает, что System.String не содержит метод вместо System.Collections.Generic.List.

Доступ к методам, существующим только для некоторых элементов в коллекции

При использовании оператора доступа к члену для доступа к методу в объекте коллекции, который не имеет метода, и только некоторые элементы в коллекции имеют его, команда возвращает MethodNotFound ошибку для первого элемента в коллекции, у которой нет метода. Несмотря на то, что метод вызывается для некоторых элементов, команда возвращает ошибку только.

@('a', 1, 'c').ToUpper()
InvalidOperation: Method invocation failed because [System.Int32] does not contain a method named 'ToUpper'.

Доступ к свойствам, существующим только для некоторых элементов в коллекции

При использовании оператора доступа к члену для доступа к свойству объекта коллекции, который не имеет свойства, и только некоторые элементы в коллекции имеют его, команда возвращает значение свойства для каждого элемента коллекции, имеющего свойство.

$CapitalizedProperty = @{
    MemberType = 'ScriptProperty'
    Name       = 'Capitalized'
    Value      = { $this.ToUpper() }
    PassThru   = $true
}
[System.Collections.Generic.List[object]]$MixedCollection = @(
    'a'
    ('b' | Add-Member @CapitalizedProperty)
    ('c' | Add-Member @CapitalizedProperty)
    'd'
)
$MixedCollection.Capitalized
B
C

См. также