about_Member-Access_Enumeration

Krótki opis

Opisuje automatyczne wyliczanie elementów kolekcji list podczas korzystania z operatora dostępu do elementu członkowskiego.

Długi opis

Począwszy od programu PowerShell 3.0, funkcja wyliczania dostępu do składowych zwiększa wygodę korzystania z operatora dostępu członka (.) w obiektach kolekcji list. Gdy używasz operatora dostępu do elementu członkowskiego w celu uzyskania dostępu do elementu członkowskiego, który nie istnieje w kolekcji, program PowerShell automatycznie wylicza elementy w kolekcji i próbuje uzyskać dostęp do określonego elementu członkowskiego w każdym elemencie.

Wyliczenie dostępu do składowych ułatwia pisanie prostszego i krótszego kodu. Zamiast potokować obiekt kolekcji do obiektu kolekcji lub używając ForEach()metody wewnętrznej w celu uzyskania dostępu do ForEach-Object elementów członkowskich w każdej kolekcji, można użyć operatora dostępu do elementu członkowskiego w obiekcie kolekcji.

Te polecenia są funkcjonalnie identyczne z ostatnim z demonstrującymi użycie operatora dostępu do składowych:

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

Uwaga

Możesz użyć operatora dostępu do elementu członkowskiego, aby pobrać wartości właściwości w elementach w kolekcji, ale nie można jej użyć do ich bezpośredniego ustawienia. Aby uzyskać więcej informacji, zobacz about_Arrays.

Jeśli używasz operatora dostępu do elementu członkowskiego w dowolnym obiekcie, a określony element członkowski istnieje w tym obiekcie, element członkowski jest wywoływany. W przypadku elementów członkowskich właściwości operator zwraca wartość tej właściwości. W przypadku elementów członkowskich metody operator wywołuje tę metodę w obiekcie .

Jeśli używasz operatora dostępu do elementu członkowskiego w obiekcie kolekcji list, który nie ma określonego elementu członkowskiego, program PowerShell automatycznie wylicza elementy w tej kolekcji i używa operatora dostępu do składowych w każdym wyliczonym elemencie.

Możesz sprawdzić, czy obiekt jest kolekcją list, sprawdzając, czy jego typ implementuje interfejs IList :

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

False

Podczas wyliczania dostępu do elementu członkowskiego dla właściwości operator zwraca wartość właściwości dla każdego elementu, który ma ta właściwość. Jeśli żadne elementy nie mają określonej właściwości, operator zwraca wartość $null.

Podczas wyliczania dostępu do elementu członkowskiego dla metody operator próbuje wywołać metodę dla każdego elementu w kolekcji. Jeśli którykolwiek element w kolekcji nie ma określonej metody, operator zwraca wyjątek MethodNotFound .

Ostrzeżenie

Podczas wyliczania dostępu do składowych dla metody metoda jest wywoływana dla każdego elementu w kolekcji. Jeśli wywoływana metoda wprowadza zmiany, zmiany są wprowadzane dla każdego elementu w kolekcji. Jeśli podczas wyliczania wystąpi błąd, metoda jest wywoływana tylko na elementach wyliczonych przed błędem. Aby uzyskać dodatkowe bezpieczeństwo, rozważ ręczne wyliczanie elementów i jawne obsługiwanie błędów.

W poniższych przykładach szczegółowo opisano zachowanie operatora dostępu do składowych we wszystkich możliwych scenariuszach.

Uzyskiwanie dostępu do elementów członkowskich obiektu innego niż lista

Jeśli używasz operatora dostępu do elementu członkowskiego w obiekcie, który nie jest kolekcją list i który ma element członkowski, polecenie zwraca wartość właściwości lub danych wyjściowych metody dla tego obiektu.

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

ABC

Jeśli używasz operatora dostępu elementu członkowskiego w obiekcie innym niż lista, który nie ma elementu członkowskiego, polecenie zwraca $null , jeśli określisz właściwość lub błąd MethodNotFound , jeśli określisz metodę.

$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'.

Uzyskiwanie dostępu do elementów członkowskich obiektu kolekcji list

Jeśli używasz operatora dostępu do elementu członkowskiego w obiekcie kolekcji, który ma element członkowski, zawsze zwraca wartość właściwości lub wynik metody dla obiektu kolekcji.

Uzyskiwanie dostępu do elementów członkowskich, które istnieją w kolekcji, ale nie do jej elementów

W tym przykładzie określone elementy członkowskie istnieją w kolekcji, ale nie w niej.

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

a
b
c

Uzyskiwanie dostępu do elementów członkowskich istniejących w kolekcji i jej elementach

W tym przykładzie określone elementy członkowskie istnieją zarówno w kolekcji, jak i w niej elementach. Porównaj wyniki poleceń przy użyciu operatora dostępu elementu członkowskiego w kolekcji do wyników przy użyciu operatora dostępu do elementu członkowskiego w elementach kolekcji w ForEach-Objectprogramie . W kolekcji operator zwraca wartość właściwości lub wynik metody dla obiektu kolekcji, a nie elementy w nim.

[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

Uwaga

Kolekcje implementujące interfejs System.Collections.IDictionary , takie jak HashTable i OrderedDictionary, mają inne zachowanie. Jeśli używasz operatora dostępu do elementu członkowskiego w słowniku, który ma klucz o takiej samej nazwie jak właściwość, zwraca wartość klucza zamiast właściwości.

Dostęp do wartości właściwości obiektu słownika można uzyskać za pomocą wewnętrznego elementu członkowskiego psbase. Jeśli na przykład nazwa klucza to keys i chcesz zwrócić kolekcję kluczy HashTable , użyj następującej składni:

$hashtable.PSBase.Keys

Uzyskiwanie dostępu do elementów członkowskich, które istnieją we wszystkich elementach w kolekcji, ale nie w samej sobie

Jeśli używasz operatora dostępu do elementu członkowskiego w obiekcie kolekcji, który nie ma elementu członkowskiego, ale elementy w nim działają, program PowerShell wylicza elementy w kolekcji i zwraca wartość właściwości lub wynik metody dla każdego elementu.

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

A
B
C

Uzyskiwanie dostępu do elementów członkowskich, które istnieją w kolekcji ani w jej elementach

Jeśli używasz operatora dostępu do elementu członkowskiego w obiekcie kolekcji, który nie ma elementu członkowskiego i nie ma w nim elementów, polecenie zwraca $null , jeśli określisz właściwość lub MethodNotFound błąd, jeśli określisz metodę.

[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'.

Ponieważ obiekt kolekcji nie ma elementu członkowskiego, program PowerShell wyliczał elementy w kolekcji. Zwróć uwagę, że błąd MethodNotFound określa, że System.String nie zawiera metody zamiast System.Collections.Generic.List.

Uzyskiwanie dostępu do metod, które istnieją tylko dla niektórych elementów w kolekcji

Jeśli używasz operatora dostępu do elementu członkowskiego, aby uzyskać dostęp do metody w obiekcie kolekcji, który nie ma metody, a tylko niektóre elementy w kolekcji mają go, polecenie zwraca MethodNotFound błąd dla pierwszego elementu w kolekcji, który nie ma metody. Mimo że metoda jest wywoływana dla niektórych elementów, polecenie zwraca tylko błąd.

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

Uzyskiwanie dostępu do właściwości, które istnieją tylko dla niektórych elementów w kolekcji

Jeśli używasz operatora dostępu do elementu członkowskiego, aby uzyskać dostęp do właściwości w obiekcie kolekcji, który nie ma właściwości, a tylko niektóre elementy w kolekcji, polecenie zwraca wartość właściwości dla każdego elementu w kolekcji, który ma właściwość.

$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

Zobacz też