Dela via


about_Member-Access_Enumeration

Kort beskrivning

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

Lång beskrivning

PowerShell har en lista över typer som kan räknas upp. Från och med PowerShell 3.0 förbättrar medlemstillgångsfunktionen bekvämligheten med att använda medlemsåtkomstoperatorn (.) på samlingsobjekt som är uppräkningsbara.

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.

Följande exempel ger samma resultat. Det sista exemplet visar användningen av operatorn för medlemsåtkomst:

PS> Get-Service -Name event* | ForEach-Object -Process { $_.DisplayName }
Windows Event Log
COM+ Event System
PS> (Get-Service -Name event*).ForEach({ $_.DisplayName })
Windows Event Log
COM+ Event System
PS> (Get-Service -Name event*).DisplayName
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. Uppräkning av medlemsåtkomst är en bekvämlighetsfunktion. Det kan finnas subtila beteende- och prestandaskillnader mellan de olika uppräkningsmetoderna.

När du använder operatorn för medlemsåtkomst på ett objekt och den angivna medlemmen finns på objektet anropas medlemmen. När du använder operatorn för medlemsåtkomst på ett samlingsobjekt som inte har den angivna medlemmen räknar PowerShell upp objekten i samlingen och använder operatorn för medlemsåtkomst för varje uppräknat objekt.

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.

Få åtkomst till medlemmar i ett objekt som inte kan räknas upp

När du använder operatorn för medlemsåtkomst på ett objekt som inte är en uppräkningsbar samling anropar PowerShell medlemmen för att returnera värdet för egenskapen eller utdata för -metoden för objektet.

PS> $MyString = 'abc'
PS> $MyString.Length
3
PS> $MyString.ToUpper()
ABC

När du använder operatorn för medlemsåtkomst på ett icke-uppräkningsbart objekt som inte har medlemmen, returnerar PowerShell $null för den saknade egenskapen eller ett MethodNotFound- fel för den saknade metoden.

PS> $MyString = 'abc'
PS> $null -eq $MyString.DoesNotExist
True
PS> $MyString.DoesNotExist()
InvalidOperation: Method invocation failed because [System.String] does not contain a method named 'DoesNotExist'.

Få åtkomst till medlemmar i ett samlingsobjekt

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.

Få å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.

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

Få å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.

PS> [System.Collections.Generic.List[string]]$Collection = @('a', 'b', 'c')
PS> $Collection.Count
3
PS> $Collection | ForEach-Object -Process { $_.Count }
1
1
1
PS> $Collection.ToString()
System.Collections.Generic.List`1[System.String]
PS> $Collection | ForEach-Object -Process { $_.ToString() }
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

Få åtkomst till medlemmar som finns på alla objekt i en samling men inte på det 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.

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

Åtkomst till medlemmar som inte 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 kommandot $null om du anger en egenskap eller ett MethodNotFound fel om du anger en metod.

PS> [System.Collections.Generic.List[string]]$Collection = @('a', 'b', 'c')
PS> $null -eq $Collection.DoesNotExist
True
PS> $Collection.DoesNotExist()
InvalidOperation: 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.

Åtkomstmetoder 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 vissa objekt 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.

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

Åtkomstegenskaper 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 vissa objekt i samlingen har den, returnerar kommandot egenskapsvärdet för varje objekt i samlingen som har egenskapen .

PS> $CapitalizedProperty = @{
    MemberType = 'ScriptProperty'
    Name       = 'Capitalized'
    Value      = { $this.ToUpper() }
    PassThru   = $true
}
PS> [System.Collections.Generic.List[Object]]$MixedCollection = @(
    'a'
    ('b' | Add-Member @CapitalizedProperty)
    ('c' | Add-Member @CapitalizedProperty)
    'd'
)
PS> $MixedCollection.Capitalized
B
C

Få åtkomst till medlemmar i en kapslad samling

När en uppräkningsbar samling innehåller en kapslad samling tillämpas medlemsåtkomstuppräkning på varje kapslad samling.

Till exempel är $a en matris som innehåller två element: en kapslad matris med strängar och en enda sträng.

# Get the count of items in the array.
PS> $a.Count
2
# Get the count of items in each nested item.
PS> $a.GetEnumerator().Count
2
1
# Call the ToUpper() method on all items in the nested array.
PS> $a = @(, ('bar', 'baz'), 'foo')
PS> $a.ToUpper()
BAR
BAZ
FOO

När du använder operatorn för medlemsåtkomst räknar PowerShell upp objekten i $a och anropar metoden ToUpper() för alla objekt.

Anteckningar

Som tidigare nämnts kan det finnas subtila beteende- och prestandaskillnader mellan de olika uppräkningsmetoderna.

Fel resulterar i förlorade utdata

När uppräkning av medlemsåtkomst avslutas av ett fel returneras inte utdata från tidigare lyckade metodanrop. Avslutande felvillkor omfattar:

  • Det enumererade objektet saknar den åtkomna metoden
  • den åtkomna metoden orsakar ett avslutande fel

Tänk på följande exempel:

class Class1 { [Object] Foo() { return 'Bar' } }
class Class2 { [void] Foo() { throw 'Error' } }
class Class3 {}

$example1 = ([Class1]::new(), [Class1]::new())
$example2 = ([Class1]::new(), [Class2]::new())
$example3 = ([Class1]::new(), [Class3]::new())

Båda objekten i $example1 har metoden Foo(), så metodanropet lyckas.

PS> $example1.Foo()
Bar
Bar

Metoden Foo() på det andra objektet i $example2 genererar ett fel, så uppräkningen misslyckas.

PS> $example2.Foo()
Exception:
Line |
   2 |  class Class2 { [void] Foo() { throw 'Error' } }
     |                                ~~~~~~~~~~~~~
     | Error

Det andra objektet i $example2 har inte metoden Foo(), så uppräkningen misslyckas.

PS> $example3.Foo()
InvalidOperation: Method invocation failed because [Class3] does not contain
a method named 'Foo'.

Jämför detta med uppräkning med hjälp av ForEach-Object

PS> $example2 | ForEach-Object -MemberName Foo
Bar
ForEach-Object: Exception calling "Foo" with "0" argument(s): "Error"
PS> $example3 | ForEach-Object -MemberName Foo
Bar

Observera att utdata visar det lyckade anropet till Foo() på det första objektet i matrisen.

Samlingar som innehåller PSCustomObject-instanser

Om samlingen av objekt innehåller instanser av PSCustomObject objekt returnerar PowerShell oväntat $null värden när den använda egenskapen saknas.

I följande exempel har minst ett objekt den refererade egenskapen.

PS> $foo = [pscustomobject]@{ Foo = 'Foo' }
PS> $bar = [pscustomobject]@{ Bar = 'Bar' }
PS> $baz = [pscustomobject]@{ Baz = 'Baz' }
PS> ConvertTo-Json ($foo, $bar, $baz).Foo
[
  "Foo",
  null,
  null
]
PS> ConvertTo-Json ((Get-Process -Id $PID), $foo).Name
[
  "pwsh",
  null
]

Du kan förvänta dig att PowerShell returnerar ett enda objekt för objektet som har den angivna egenskapen. I stället returnerar PowerShell också ett $null värde för varje objekt som inte har egenskapen.

Mer information om det här beteendet finns i PowerShell-problem #13752.

Se även