about_Member-Access_Enumeration

Kurze Beschreibung

Beschreibt die automatische Aufzählung von Listenauflistungselementen bei Verwendung des Memberzugriffsoperators.

Lange Beschreibung

Ab PowerShell 3.0 verbessert das Elementzugriffs-Enumerationsfeature den Komfort der Verwendung des Memberzugriffsoperators (.) für Listensammlungsobjekte. Wenn Sie den Memberzugriffsoperator verwenden, um auf ein Element zuzugreifen, das in einer Auflistung nicht vorhanden ist, listet PowerShell die Elemente in der Auflistung automatisch auf und versucht, auf das angegebene Element für jedes Element zuzugreifen.

Mit der Memberzugriffsenumeration können Sie einfacheren und kürzeren Code schreiben. Anstatt ein Auflistungsobjekt an jedes Element in der Auflistung zu ForEach-Object verteilen oder die ForEach()systeminterne Methode zu verwenden, können Sie den Memberzugriffsoperator für das Auflistungsobjekt verwenden.

Diese Befehle sind funktionell identisch mit dem letzten Befehl, der die Verwendung des Member-Access-Operators veranschaulicht:

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

Hinweis

Sie können den Memberzugriffsoperator verwenden, um die Werte einer Eigenschaft für Elemente in einer Auflistung abzurufen, aber Sie können ihn nicht verwenden, um sie direkt festzulegen. Weitere Informationen finden Sie unter about_Arrays.

Wenn Sie den Memberzugriffsoperator für jedes Objekt verwenden und das angegebene Element für dieses Objekt vorhanden ist, wird das Element aufgerufen. Bei Eigenschaftsmbern gibt der Operator den Wert dieser Eigenschaft zurück. Für Methodenmber ruft der Operator diese Methode für das Objekt auf.

Wenn Sie den Memberzugriffsoperator für ein Listenauflistungsobjekt verwenden, das nicht über das angegebene Element verfügt, listet PowerShell die Elemente in dieser Auflistung automatisch auf und verwendet den Memberzugriffsoperator für jedes aufgezählte Element.

Sie können überprüfen, ob ein Objekt eine Listensammlung ist, indem Sie sehen, ob sein Typ die IList-Schnittstelle implementiert:

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

False

Während der Memberzugriffsenumeration für eine Eigenschaft gibt der Operator den Wert der Eigenschaft für jedes Element mit dieser Eigenschaft zurück. Wenn keine Elemente über die angegebene Eigenschaft verfügen, gibt der Operator zurück $null.

Während der Memberzugriffsenumeration für eine Methode versucht der Operator, die Methode für jedes Element in der Auflistung aufzurufen. Wenn ein Element in der Auflistung nicht über die angegebene Methode verfügt, gibt der Operator die MethodNotFound-Ausnahme zurück.

Warnung

Während der Memberzugriffsenumeration für eine Methode wird die Methode für jedes Element in der Auflistung aufgerufen. Wenn die methode, die Sie aufrufen, Änderungen vorgibt, werden die Änderungen für jedes Element in der Auflistung vorgenommen. Wenn während der Aufzählung ein Fehler auftritt, wird die Methode nur für die Elemente aufgerufen, die vor dem Fehler aufgezählt werden. Für zusätzliche Sicherheit sollten Sie das manuelle Aufzählen der Elemente und die explizite Behandlung von Fehlern in Betracht ziehen.

In den folgenden Beispielen wird das Verhalten des Mitgliedszugriffsoperators unter allen möglichen Szenarien detailliert beschrieben.

Zugreifen auf Elemente eines Nicht-Listenobjekts

Wenn Sie den Memberzugriffsoperator für ein Objekt verwenden, das keine Listenauflistung ist und über das Element verfügt, gibt der Befehl den Wert der Eigenschaft oder Ausgabe der Methode für dieses Objekt zurück.

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

ABC

Wenn Sie den Memberzugriffsoperator für ein Nicht-Listenobjekt verwenden, das nicht über das Element verfügt, gibt der Befehl zurück $null , wenn Sie eine Eigenschaft oder einen MethodNotFound-Fehler angeben, wenn Sie eine Methode angeben.

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

Zugreifen auf Elemente eines Listensammlungsobjekts

Wenn Sie den Memberzugriffsoperator für ein Auflistungsobjekt verwenden, das über das Element verfügt, wird immer der Eigenschaftswert oder das Methodenergebnis für das Auflistungsobjekt zurückgegeben.

Zugreifen auf Elemente, die in der Auflistung vorhanden sind, aber nicht auf ihre Elemente

In diesem Beispiel sind die angegebenen Elemente in der Auflistung vorhanden, aber nicht die darin aufgeführten Elemente.

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

a
b
c

Zugreifen auf Elemente, die in der Auflistung und den zugehörigen Elementen vorhanden sind

In diesem Beispiel sind die angegebenen Elemente sowohl für die Auflistung als auch für die darin enthaltenen Elemente vorhanden. Vergleichen Sie die Ergebnisse der Befehle mithilfe des Memberzugriffsoperators in der Auflistung mit den Ergebnissen, indem Sie den Memberzugriffsoperator für die Auflistungselemente in ForEach-Object. In der Auflistung gibt der Operator den Eigenschaftswert oder das Methodenergebnis für das Auflistungsobjekt und nicht die darin enthaltenen Elemente zurück.

[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

Hinweis

Sammlungen, die die System.Collections.IDictionary-Schnittstelle implementieren, z . B. HashTable und OrderedDictionary, weisen ein anderes Verhalten auf. Wenn Sie den Memberzugriffsoperator für ein Wörterbuch verwenden, das über einen Schlüssel mit demselben Namen wie eine Eigenschaft verfügt, wird der Wert des Schlüssels anstelle der Eigenschaft zurückgegeben.

Sie können mit dem systeminternen Element psbaseauf den Eigenschaftswert des Wörterbuchobjekts zugreifen. Wenn der Schlüsselname beispielsweise lautet keys und Sie die Sammlung der HashTable-Schlüssel zurückgeben möchten, verwenden Sie die folgende Syntax:

$hashtable.PSBase.Keys

Zugreifen auf Elemente, die für alle Elemente in einer Auflistung vorhanden sind, aber nicht selbst

Wenn Sie den Memberzugriffsoperator für ein Auflistungsobjekt verwenden, das nicht über das Element verfügt, sondern die darin aufgeführten Elemente, listet PowerShell die Elemente in der Auflistung auf und gibt das Eigenschaftswert- oder Methodenergebnis für jedes Element zurück.

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

A
B
C

Zugreifen auf Elemente, die weder in der Auflistung noch in den zugehörigen Elementen vorhanden sind

Wenn Sie den Memberzugriffsoperator für ein Auflistungsobjekt verwenden, das nicht über das Element verfügt, und nicht die darin enthaltenen Elemente, gibt der Befehl zurück $null , wenn Sie eine Eigenschaft oder einen MethodNotFound Fehler angeben, wenn Sie eine Methode angeben.

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

Da das Auflistungsobjekt nicht über das Element verfügt, listet PowerShell die Elemente in der Auflistung auf. Beachten Sie, dass der MethodNotFound-Fehler angibt, dass System.String nicht die Methode anstelle von System.Collections.Generic.List enthält.

Zugreifen auf Methoden, die nur für einige Elemente in einer Auflistung vorhanden sind

Wenn Sie den Memberzugriffsoperator verwenden, um auf eine Methode für ein Auflistungsobjekt zuzugreifen, das nicht über die Methode verfügt, und nur einige der Elemente in der Auflistung enthalten, gibt der Befehl einen MethodNotFound Fehler für das erste Element in der Auflistung zurück, das nicht über die Methode verfügt. Obwohl die Methode für einige Elemente aufgerufen wird, gibt der Befehl nur den Fehler zurück.

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

Zugreifen auf Eigenschaften, die nur für einige Elemente in einer Auflistung vorhanden sind

Wenn Sie den Memberzugriffsoperator verwenden, um auf eine Eigenschaft für ein Auflistungsobjekt zuzugreifen, das nicht über die Eigenschaft verfügt, und nur einige der Elemente in der Auflistung enthalten, gibt der Befehl den Eigenschaftswert für jedes Element in der Auflistung zurück, das über die Eigenschaft verfügt.

$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

Weitere Informationen