about_Member-Access_Enumeration
Korte beschrijving
Beschrijft de automatische inventarisatie van lijstverzamelingsitems wanneer u de operator voor lidtoegang gebruikt.
Lange beschrijving
Vanaf PowerShell 3.0 verbetert de opsommingsfunctie voor ledentoegang het gemak van het gebruik van de operator voor lidtoegang (.
) voor lijstverzamelingsobjecten. Wanneer u de operator voor lidtoegang gebruikt om toegang te krijgen tot een lid dat niet bestaat in een verzameling, worden de items in de verzameling automatisch geïnventariseerd in PowerShell en wordt geprobeerd toegang te krijgen tot het opgegeven lid voor elk item.
Met opsomming voor lidtoegang kunt u eenvoudigere en kortere code schrijven. In plaats van een verzamelingsobject door te geven aan ForEach-Object
of de ForEach()
intrinsieke methode te gebruiken voor toegang tot leden voor elk item in de verzameling, kunt u de operator voor lidtoegang gebruiken op het verzamelingsobject.
Deze opdrachten zijn functioneel identiek aan de laatste die het gebruik van de operator voor lidtoegang laat zien:
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
Notitie
U kunt de operator voor lidtoegang gebruiken om de waarden van een eigenschap op te halen voor items in een verzameling, maar u kunt deze niet gebruiken om ze rechtstreeks in te stellen. Zie about_Arrays voor meer informatie.
Wanneer u de operator voor lidtoegang gebruikt voor een object en het opgegeven lid op dat object bestaat, wordt het lid aangeroepen. Voor eigenschapsleden retourneert de operator de waarde van die eigenschap. Voor methodeleden roept de operator die methode aan op het object.
Wanneer u de operator voor lidtoegang gebruikt voor een lijstverzamelingsobject dat niet over het opgegeven lid beschikt, worden de items in die verzameling automatisch geïnventariseerd in PowerShell en wordt de operator voor lidtoegang voor elk opgesomd item gebruikt.
U kunt controleren of een object een lijstverzameling is door te zien of het type de IList-interface implementeert:
$List = @('a', 'b')
$Hash = @{ a = 'b' }
$List.GetType().ImplementedInterfaces.Name -contains 'IList'
$Hash.GetType().ImplementedInterfaces.Name -contains 'IList'
True
False
Tijdens de inventarisatie van lidtoegang voor een eigenschap retourneert de operator de waarde van de eigenschap voor elk item met die eigenschap. Als er geen items de opgegeven eigenschap hebben, retourneert $null
de operator .
Tijdens de inventarisatie van lidtoegang voor een methode probeert de operator de methode aan te roepen voor elk item in de verzameling. Als een item in de verzameling niet over de opgegeven methode beschikt, retourneert de operator de MethodNotFound-uitzondering.
Waarschuwing
Tijdens de inventarisatie van lidtoegang voor een methode wordt de methode aangeroepen voor elk item in de verzameling. Als de methode die u aanroept wijzigingen aanbrengt, worden de wijzigingen aangebracht voor elk item in de verzameling. Als er een fout optreedt tijdens de inventarisatie, wordt de methode alleen aangeroepen voor de items die vóór de fout zijn geïnventariseerd. Voor extra veiligheid kunt u de items handmatig inventariseren en expliciet eventuele fouten afhandelen.
In de volgende voorbeelden wordt het gedrag van de operator voor lidtoegang in alle mogelijke scenario's beschreven.
Leden van een niet-lijstobject openen
Wanneer u de operator voor lidtoegang gebruikt voor een object dat geen lijstverzameling is en die het lid heeft, retourneert de opdracht de waarde van de eigenschap of uitvoer van de methode voor dat object.
$MyString = 'abc'
$MyString.Length
$MyString.ToUpper()
3
ABC
Wanneer u de operator voor lidtoegang gebruikt voor een niet-lijstobject dat niet over het lid beschikt, retourneert $null
de opdracht als u een eigenschap of een MethodNotFound-fout opgeeft als u een methode opgeeft.
$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'.
Leden van een lijstverzamelingsobject openen
Wanneer u de operator voor lidtoegang gebruikt voor een verzamelingsobject dat het lid heeft, wordt altijd de eigenschapswaarde of het methoderesultaat voor het verzamelingsobject geretourneerd.
Leden openen die in de verzameling bestaan, maar niet de bijbehorende items
In dit voorbeeld bestaan de opgegeven leden in de verzameling, maar niet de items erin.
[System.Collections.Generic.List[string]]$Collection = @('a', 'b')
$Collection.IsReadOnly
$Collection.Add('c')
$Collection
False
a
b
c
Toegang tot leden die bestaan in de verzameling en de bijbehorende items
In dit voorbeeld bestaan de opgegeven leden in zowel de verzameling als de items erin. Vergelijk de resultaten van de opdrachten met behulp van de operator voor lidtoegang in de verzameling met de resultaten van het gebruik van de operator voor lidtoegang op de verzamelingsitems in ForEach-Object
. In de verzameling retourneert de operator de eigenschapswaarde of het methoderesultaat voor het verzamelingsobject en niet de items erin.
[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
Notitie
Verzamelingen die de Interface System.Collections.IDictionary implementeren, zoals HashTable en OrderedDictionary, hebben een ander gedrag. Wanneer u de operator voor lidtoegang gebruikt in een woordenlijst met een sleutel met dezelfde naam als een eigenschap, wordt de waarde van de sleutel geretourneerd in plaats van de eigenschap.
U kunt de eigenschapswaarde van het woordenboekobject openen met het intrinsiek lid van psbase. Als de sleutelnaam bijvoorbeeld is keys
en u de verzameling van de HashTable-sleutels wilt retourneren, gebruikt u deze syntaxis:
$hashtable.PSBase.Keys
Leden openen die bestaan op alle items in een verzameling, maar niet zelf
Wanneer u de operator voor lidtoegang gebruikt voor een verzamelingsobject dat niet over het lid beschikt, maar de items erin, worden de items in de verzameling opgesomd in PowerShell en wordt de eigenschapswaarde of het resultaat van de methode voor elk item geretourneerd.
[System.Collections.Generic.List[string]]$Collection = @('a', 'b', 'c')
$Collection.Length
$Collection.ToUpper()
1
1
1
A
B
C
Toegang tot leden die bestaan op de verzameling of de bijbehorende items
Wanneer u de operator voor lidtoegang gebruikt voor een verzamelingsobject dat niet over het lid beschikt en die de items er ook niet in hebben, retourneert $null
de opdracht als u een eigenschap of een MethodNotFound
fout opgeeft als u een methode opgeeft.
[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'.
Omdat het verzamelingsobject niet over het lid beschikt, heeft PowerShell de items in de verzameling opgesomd. U ziet dat de MethodNotFound-fout aangeeft dat System.String de methode niet bevat in plaats van System.Collections.Generic.List.
Toegang tot methoden die alleen bestaan op sommige items in een verzameling
Wanneer u de operator voor lidtoegang gebruikt om toegang te krijgen tot een methode voor een verzamelingsobject dat niet over de methode beschikt en slechts enkele items in de verzameling deze hebben, retourneert de opdracht een MethodNotFound
fout voor het eerste item in de verzameling die niet over de methode beschikt. Hoewel de methode op sommige items wordt aangeroepen, retourneert de opdracht alleen de fout.
@('a', 1, 'c').ToUpper()
InvalidOperation: Method invocation failed because [System.Int32] does not contain a method named 'ToUpper'.
Toegang tot eigenschappen die alleen bestaan op sommige items in een verzameling
Wanneer u de operator voor lidtoegang gebruikt om toegang te krijgen tot een eigenschap op een verzamelingsobject dat niet over de eigenschap beschikt en slechts enkele items in de verzameling deze hebben, retourneert de opdracht de eigenschapswaarde voor elk item in de verzameling met de eigenschap.
$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