about_Member-Access_Enumeration
Korte beschrijving
Beschrijft de automatische opsomming 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, inventariseert PowerShell automatisch de items in de verzameling en probeert 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 op elk item in de verzameling, kunt u de operator voor lidtoegang in het verzamelingsobject gebruiken.
Deze opdrachten zijn functioneel identiek met de laatste die het gebruik van de operator voor lidtoegang aantoont:
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, inventariseert PowerShell automatisch de items in die verzameling en gebruikt de operator voor lidtoegang voor elk opgesomd item.
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 $nullde 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 tijdens de opsomming een fout optreedt, wordt de methode alleen aangeroepen voor de items die vóór de fout zijn geïnventariseerd. Voor extra veiligheid kunt u overwegen de items handmatig te inventariseren en expliciet eventuele fouten op te lossen.
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, wordt de opdracht geretourneerd $null 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.
Toegang tot leden die aanwezig zijn in de verzameling, maar niet tot de 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
Leden openen die aanwezig zijn 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 woordenlijstobject openen met het intrinsiek lidvan psbase. Als de sleutelnaam bijvoorbeeld is keys en u de verzameling hashtabelsleutels wilt retourneren, gebruikt u deze syntaxis:
$hashtable.PSBase.Keys
Leden openen die aanwezig zijn 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 wel, inventariseert PowerShell de items in de verzameling en retourneert de eigenschapswaarde of het resultaat van de methode voor elk item.
[System.Collections.Generic.List[string]]$Collection = @('a', 'b', 'c')
$Collection.Length
$Collection.ToUpper()
1
1
1
A
B
C
Toegang tot leden die bestaan in de verzameling en de items ervan
Wanneer u de operator voor lidtoegang gebruikt voor een verzamelingsobject dat niet over het lid beschikt en niet de items erin doet, 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, inventariseerde PowerShell de items in de verzameling. 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 bepaalde 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'.
Eigenschappen openen die alleen bestaan op bepaalde 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