Delen via


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

Zie ook