Dela via


about_Member-Access_Enumeration

Kort beskrivning

Beskriver automatisk uppräkning 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 i 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ändningen 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

Anteckning

Du kan använda operatorn för medlemsåtkomst för att hämta värdena för en egenskap för 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 medlemsåtkomstuppräkning 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 medlemsåtkomstuppräkning för en metod försöker operatorn anropa metoden för varje objekt i samlingen. Om något objekt i samlingen inte har den angivna metoden returnerar operatorn MethodNotFound-undantaget .

Varning

Under medlemsåtkomstuppräkning 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 inträffar under uppräkningen anropas metoden endast för 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 medlemsåtkomstoperatorn under alla möjliga scenarier.

Komma åt medlemmar i ett objekt som inte finns med i listan

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

Komma åt 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 resultaten 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

Anteckning

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 deninbyggda psbase-medlemmen. Om nyckelnamnet till exempel är keys och du vill returnera samlingen av 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, 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 gör 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 bara 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 för 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