about_Member-Access_Enumeration

Kort beskrivning

Beskriver den automatiska uppräkningen av listsamlingsobjekt när du använder operatorn för medlemsåtkomst.

Lång beskrivning

Från och med PowerShell 3.0 förbättrar uppräkningsfunktionen för medlemsåtkomst bekvämligheten med att använda operatorn för medlemsåtkomst (.) i listsamlingsobjekt. När du använder operatorn för medlemsåtkomst för att komma åt en medlem som inte finns i en samling räknar PowerShell automatiskt upp objekten i samlingen och försöker komma åt den angivna medlemmen för varje objekt.

Uppräkning med medlemsåtkomst hjälper dig att skriva enklare och kortare kod. I stället för att skicka ett samlingsobjekt till ForEach-Object eller använda den ForEach()inbyggda metoden för att komma åt medlemmar på varje objekt i samlingen kan du använda operatorn för medlemsåtkomst på samlingsobjektet.

Dessa kommandon är funktionellt identiska med den sista som visar användning av operatorn för medlemsåtkomst:

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

Kommentar

Du kan använda operatorn för medlemsåtkomst för att hämta värdena för en egenskap på objekt i en samling, men du kan inte använda den för att ange dem direkt. Mer information finns i about_Arrays.

När du använder operatorn för medlemsåtkomst på ett objekt och den angivna medlemmen finns på objektet anropas medlemmen. För egenskapsmedlemmar returnerar operatorn värdet för den egenskapen. För metodmedlemmar anropar operatorn den metoden för objektet.

När du använder operatorn för medlemsåtkomst i ett listsamlingsobjekt som inte har den angivna medlemmen, räknar PowerShell automatiskt upp objekten i samlingen och använder operatorn för medlemsåtkomst för varje uppräknat objekt.

Du kan kontrollera om ett objekt är en listsamling genom att se om dess typ implementerar IList-gränssnittet :

$List = @('a', 'b')
$Hash = @{ a = 'b' }
$List.GetType().ImplementedInterfaces.Name -contains 'IList'
$Hash.GetType().ImplementedInterfaces.Name -contains 'IList'
True

False

Under uppräkning av medlemsåtkomst för en egenskap returnerar operatorn värdet för egenskapen för varje objekt som har den egenskapen. Om inga objekt har den angivna egenskapen returnerar $nulloperatorn .

Under uppräkning av medlemsåtkomst för en metod försöker operatorn anropa metoden för varje objekt i samlingen. Om ett objekt i samlingen inte har den angivna metoden returnerar operatorn Undantaget MethodNotFound .

Varning

Under uppräkning av medlemsåtkomst för en metod anropas metoden för varje objekt i samlingen. Om metoden du anropar gör ändringar görs ändringarna för varje objekt i samlingen. Om ett fel uppstår under uppräkningen anropas metoden endast på de objekt som räknas upp före felet. För ytterligare säkerhet bör du överväga att manuellt räkna upp objekten och uttryckligen hantera eventuella fel.

I följande exempel beskrivs beteendet för operatorn för medlemsåtkomst under alla möjliga scenarier.

Åtkomst till medlemmar i ett objekt som inte är en lista

När du använder operatorn för medlemsåtkomst på ett objekt som inte är en listsamling och som har medlemmen, returnerar kommandot värdet för egenskapen eller utdata för -metoden för objektet.

$MyString = 'abc'
$MyString.Length
$MyString.ToUpper()
3

ABC

När du använder operatorn för medlemsåtkomst på ett objekt som inte finns med i listan och inte har medlemmen, returneras $null kommandot om du anger en egenskap eller ett MethodNotFound-fel om du anger en metod.

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

Komma åt medlemmar i ett listsamlingsobjekt

När du använder operatorn för medlemsåtkomst på ett samlingsobjekt som har medlemmen returneras alltid egenskapsvärdet eller metodresultatet för samlingsobjektet.

Åtkomst till medlemmar som finns i samlingen men inte dess objekt

I det här exemplet finns de angivna medlemmarna i samlingen, men inte objekten i den.

[System.Collections.Generic.List[string]]$Collection = @('a', 'b')
$Collection.IsReadOnly
$Collection.Add('c')
$Collection
False

a
b
c

Åtkomst till medlemmar som finns i samlingen och dess objekt

I det här exemplet finns de angivna medlemmarna i både samlingen och objekten i den. Jämför resultatet av kommandona med hjälp av medlemsåtkomstoperatorn i samlingen med resultatet från att använda operatorn för medlemsåtkomst på samlingsobjekten i ForEach-Object. I samlingen returnerar operatorn egenskapsvärdet eller metodresultatet för samlingsobjektet och inte objekten i den.

[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

Kommentar

Samlingar som implementerar gränssnittet System.Collections.IDictionary , till exempel HashTable och OrderedDictionary, har ett annat beteende. När du använder operatorn för medlemsåtkomst i en ordlista som har en nyckel med samma namn som en egenskap returneras nyckelns värde i stället för egenskapens.

Du kan komma åt ordlisteobjektets egenskapsvärde med den inbyggda psbase-medlemmen. Om nyckelnamnet till exempel är keys och du vill returnera samlingen med HashTable-nycklar använder du den här syntaxen:

$hashtable.PSBase.Keys

Åtkomst till medlemmar som finns på alla objekt i en samling men inte sig själv

När du använder operatorn för medlemsåtkomst på ett samlingsobjekt som inte har medlemmen, men objekten i den gör det, räknar PowerShell upp objekten i samlingen och returnerar egenskapsvärdet eller metodresultatet för varje objekt.

[System.Collections.Generic.List[string]]$Collection = @('a', 'b', 'c')
$Collection.Length
$Collection.ToUpper()
1
1
1

A
B
C

Åtkomst till medlemmar som varken finns i samlingen eller dess objekt

När du använder operatorn för medlemsåtkomst på ett samlingsobjekt som inte har medlemmen och inte heller objekten i den, returnerar $null kommandot om du anger en egenskap eller ett MethodNotFound fel om du anger en metod.

[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'.

Eftersom samlingsobjektet inte har medlemmen, räknas objekten i samlingen upp i PowerShell. Observera att Felet MethodNotFound anger att System.String inte innehåller metoden i stället för System.Collections.Generic.List.

Komma åt metoder som bara finns på vissa objekt i en samling

När du använder operatorn för medlemsåtkomst för att komma åt en metod för ett samlingsobjekt som inte har metoden och endast några av objekten i samlingen har den, returnerar kommandot ett MethodNotFound fel för det första objektet i samlingen som inte har metoden. Även om metoden anropas för vissa objekt returnerar kommandot endast felet.

@('a', 1, 'c').ToUpper()
InvalidOperation: Method invocation failed because [System.Int32] does not contain a method named 'ToUpper'.

Åtkomst till egenskaper som bara finns på vissa objekt i en samling

När du använder operatorn för medlemsåtkomst för att komma åt en egenskap på ett samlingsobjekt som inte har egenskapen och endast några av objekten i samlingen har den, returnerar kommandot egenskapsvärdet för varje objekt i samlingen som har egenskapen .

$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

Se även