Freigeben über


about_Member-Access_Enumeration

Kurze Beschreibung

Beschreibt die automatische Enumeration von Listensammlungselementen bei Verwendung des Memberzugriffsoperators.

Lange Beschreibung

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

Member-Access-Enumeration hilft Ihnen beim Schreiben von einfacherem und kürzerem Code. Anstatt ein Auflistungsobjekt an ForEach-Object oder mit der ForEach()intrinsischen Methode auf Elemente für jedes Element in der Auflistung zuzugreifen, können Sie den Memberzugriffsoperator für das Auflistungsobjekt verwenden.

Diese Befehle sind funktionell identisch mit dem letzten Befehl, der die Verwendung des Memberzugriffsoperators 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 Sammlung 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 ein beliebiges Objekt verwenden und das angegebene Element für dieses Objekt vorhanden ist, wird das Element aufgerufen. Für Eigenschaftsmember gibt der Operator den Wert dieser Eigenschaft zurück. Für Methodenmember ruft der Operator diese Methode für das -Objekt auf.

Wenn Sie den Memberzugriffsoperator für ein Listensammlungsobjekt verwenden, das nicht über den angegebenen Member verfügt, listet PowerShell automatisch die Elemente in dieser Auflistung auf und verwendet den Memberzugriffsoperator für jedes aufgelistete Element.

Sie können überprüfen, ob es sich bei einem Objekt um eine Listensammlung handelt, indem Sie überprüfen, 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 Memberzugriffsaufzählung für eine Eigenschaft gibt der Operator den Wert der -Eigenschaft für jedes Element zurück, das über diese Eigenschaft verfügt. Wenn keine Elemente über die angegebene Eigenschaft verfügen, gibt der Operator zurück $null.

Während der Memberzugriffsaufzählung 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 Memberzugriffsaufzählung für eine Methode wird die -Methode für jedes Element in der Auflistung aufgerufen. Wenn die von Ihnen aufgerufene Methode Änderungen vornimmt, werden die Änderungen für jedes Element in der Auflistung vorgenommen. Wenn während der Enumeration ein Fehler auftritt, wird die -Methode nur für die Elemente aufgerufen, die vor dem Fehler aufgelistet wurden. Erwägen Sie für zusätzliche Sicherheit, die Elemente manuell aufzulisten und alle Fehler explizit zu behandeln.

In den folgenden Beispielen wird das Verhalten des Memberzugriffsoperators in 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 den Member 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-List-Objekt verwenden, das nicht über den Member verfügt, wird der Befehl zurückgegeben $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 Listenauflistungsobjekts

Wenn Sie den Memberzugriffsoperator für ein Auflistungsobjekt verwenden, das über den Member verfügt, gibt er immer den Eigenschaftswert oder das Methodenergebnis für das Auflistungsobjekt zurück.

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

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

[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 ihren Elementen vorhanden sind

In diesem Beispiel sind die angegebenen Member sowohl für die Auflistung als auch für die darin enthaltenen Elemente vorhanden. Vergleichen Sie die Ergebnisse der Befehle, die den Memberzugriffsoperator für die Auflistung verwenden, mit den Ergebnissen der Verwendung des Memberzugriffsoperators für die Sammlungselemente 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

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

Wenn Sie den Memberzugriffsoperator für ein Auflistungsobjekt verwenden, das nicht über den Member, sondern über die Darin enthaltenen Elemente verfügt, listet PowerShell die Elemente in der Auflistung auf und gibt den Eigenschaftswert oder das 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 für die Auflistung noch für ihre Elemente vorhanden sind

Wenn Sie den Memberzugriffsoperator für ein Auflistungsobjekt verwenden, das nicht über das Element und auch nicht über die Elemente verfügt, wird der Befehl zurückgegeben $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 den Member verfügt, zählt 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 und nur über einige Elemente in der Auflistung verfügt, 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 über einige Elemente in der Auflistung verfügt, 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