about_Member-Access_Enumeration
Korte beschrijving
Beschrijft de automatische inventarisatie van lijstverzamelingsitems bij gebruik van de operator lidtoegang.
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.
Opsomming van lidtoegang helpt u eenvoudigere en kortere code te schrijven. In plaats van een verzamelingsobject door te ForEach-Object
slopen of de ForEach()
intrinsieke methode te gebruiken om toegang te krijgen tot leden voor elk item in de verzameling, kunt u de operator voor lidtoegang voor 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 voor items in een verzameling op te halen, 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 bestaat op dat object, 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 lidtoegang gebruikt voor een lijstverzamelingsobject dat niet het opgegeven lid heeft, inventariseert PowerShell automatisch de items in die verzameling en gebruikt de operator 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 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 de opgegeven methode heeft, retourneert de operator de uitzondering MethodNotFound .
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 opgesomd. Voor extra veiligheid kunt u overwegen om de items handmatig op te sommen en eventuele fouten expliciet af te handelen.
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 lidtoegang gebruikt voor een object dat geen lijstverzameling is en dat 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 member-access gebruikt voor een niet-lijstobject dat het lid niet heeft, 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 lidtoegang gebruikt voor een verzamelingsobject dat het lid heeft, wordt altijd de eigenschapswaarde of het methoderesultaat voor het verzamelingsobject geretourneerd.
Toegang tot leden die wel aanwezig zijn in de verzameling, maar niet in de items
In dit voorbeeld bestaan de opgegeven leden in de verzameling, maar niet in 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 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 lidtoegang voor de verzameling met de resultaten van het gebruik van de operator lidtoegang voor 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 voor een woordenlijst met een sleutel met dezelfde naam als een eigenschap, wordt de waarde van de sleutel geretourneerd in plaats van die van de eigenschap.
U hebt toegang tot de eigenschapswaarde van het woordenboekobject met het intrinsieke lidpsbase. Als de sleutelnaam bijvoorbeeld is keys
en u de verzameling HashTable-sleutels wilt retourneren, gebruikt u deze syntaxis:
$hashtable.PSBase.Keys
Toegang tot leden die bestaan voor alle items in een verzameling, maar niet voor zichzelf
Wanneer u de operator voor lidtoegang gebruikt voor een verzamelingsobject dat niet het lid heeft, maar de items erin wel, inventariseert PowerShell de items in de verzameling en retourneert de eigenschapswaarde of het methoderesultaat 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 niet aanwezig zijn in de verzameling of de bijbehorende items
Wanneer u de operator lidtoegang gebruikt voor een verzamelingsobject dat het lid niet heeft en de items erin ook niet, wordt de opdracht geretourneerd $null
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 het lid niet heeft, heeft PowerShell de items in de verzameling geïnventariseerd. U ziet dat de MethodNotFound-fout aangeeft dat System.String niet de methode bevat in plaats van System.Collections.Generic.List.
Toegang tot methoden die alleen bestaan voor bepaalde items in een verzameling
Wanneer u de operator lidtoegang gebruikt om toegang te krijgen tot een methode voor een verzamelingsobject dat de methode niet heeft en slechts enkele items in de verzameling hebben, retourneert de opdracht een MethodNotFound
fout voor het eerste item in de verzameling dat de methode niet heeft. Hoewel de methode voor 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 voor bepaalde items in een verzameling
Wanneer u de operator voor lidtoegang gebruikt om toegang te krijgen tot een eigenschap in een verzamelingsobject dat de eigenschap niet heeft en slechts enkele items in de verzameling deze hebben, retourneert de opdracht de eigenschapswaarde voor elk item in de verzameling die de eigenschap heeft.
$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