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
См. также
PowerShell
Обратная связь
Отправить и просмотреть отзыв по