about_Member-Access_Enumeration

Rövid leírás

A listagyűjteményelemek automatikus számbavételét ismerteti a taghozzáférési operátor használatakor.

Hosszú leírás

A PowerShell 3.0-tól kezdődően a taghozzáférés enumerálási funkciója javítja a taghozzáférési operátor (.) használatát a listagyűjtemény-objektumokon. Ha a taghozzáférési operátorral olyan taghoz fér hozzá, amely nem létezik egy gyűjteményben, a PowerShell automatikusan számba fogja venni a gyűjtemény elemeit, és megkísérli elérni a megadott tagot az egyes elemeken.

A taghozzáférés enumerálása egyszerűbb és rövidebb kód írásában segít. Ahelyett, hogy ForEach-Object egy gyűjteményobjektumot a gyűjtemény minden eleméhez a belső metódussalForEach()szeretne elérni, használhatja a gyűjteményobjektum taghozzáférési operátorát.

Ezek a parancsok funkcionálisan megegyeznek a taghozzáférési operátor utolsó használatával:

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

Feljegyzés

A taghozzáférési operátorral lekérheti egy tulajdonság értékeit egy gyűjtemény elemein, de közvetlenül nem állíthatja be őket. További információ: about_Arrays.

Ha bármely objektumon a taghozzáférés operátort használja, és a megadott tag létezik az objektumon, a tag meghívása történik. A tulajdonságtagok esetében az operátor ennek a tulajdonságnak az értékét adja vissza. A metódustagok esetében az operátor meghívja ezt a metódust az objektumon.

Ha a tagelérési operátort olyan listagyűjtemény-objektumon használja, amely nem rendelkezik a megadott tagmal, a PowerShell automatikusan számba veszi a gyűjtemény elemeit, és az egyes számba adott elemeken a taghozzáférési operátort használja.

Ellenőrizheti, hogy egy objektum listagyűjtemény-e, ha azt látja, hogy a típusa implementálja-e az IList-felületet :

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

False

Egy tulajdonság taghozzáférési számbavétele során az operátor a tulajdonság értékét adja vissza minden olyan elemhez, amelynek ez a tulajdonsága van. Ha egyetlen elem sem rendelkezik a megadott tulajdonságokkal, az operátor ad vissza $null.

Egy metódus taghozzáférési számbavétele során az operátor megkísérli meghívni a metódust a gyűjtemény egyes elemein. Ha a gyűjtemény egyik eleme nem rendelkezik a megadott módszerrel, az operátor a MethodNotFound kivételt adja vissza.

Figyelmeztetés

Egy metódus taghozzáférési számbavétele során a rendszer meghívja a metódust a gyűjtemény minden elemére. Ha a meghívandó metódus módosítja a metódust, a rendszer a gyűjtemény minden elemére módosítja a módosításokat. Ha hiba történik az enumerálás során, a metódus csak a hiba előtt számba adott elemeken lesz meghívva. A további biztonság érdekében fontolja meg az elemek manuális számbavételét és a hibák explicit kezelését.

Az alábbi példák részletesen ismertetik a taghozzáférési operátor viselkedését minden lehetséges forgatókönyvben.

Nem listás objektumok tagjainak elérése

Ha olyan objektumon használja a taghozzáférési operátort, amely nem listagyűjtemény, és amelynek tagja, a parancs visszaadja az objektum metódusának tulajdonságát vagy kimenetét.

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

ABC

Ha a taghozzáférési operátort olyan nem listás objektumon használja, amely nem rendelkezik tagdal, a parancs akkor ad vissza, $null ha tulajdonságot vagy MethodNotFound hibát ad meg, ha megad egy metódust.

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

Listagyűjtemény-objektum tagjainak elérése

Ha a taghozzáférési operátort egy tagot tartalmazó gyűjteményobjektumon használja, az mindig a gyűjteményobjektum tulajdonságértékét vagy metóduseredményét adja vissza.

Hozzáférés a gyűjteményben lévő tagokhoz, de az elemekhez nem

Ebben a példában a megadott tagok a gyűjteményben találhatók, a benne lévő elemek azonban nem.

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

a
b
c

A gyűjteményben és elemeiben található tagok elérése

Ebben a példában a megadott tagok a gyűjteményen és a benne lévő elemeken is léteznek. Hasonlítsa össze a gyűjtemény taghozzáférési operátorral végzett parancsainak eredményeit a gyűjtemény elemeinek ForEach-Objecttaghozzáférési operátor használatával kapott eredményekkel. A gyűjteményen az operátor a gyűjteményobjektum tulajdonságértékét vagy metóduseredményét adja vissza, nem pedig a benne lévő elemeket.

[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

Feljegyzés

A System.Collections.IDictionary felületet implementáló gyűjtemények, például a HashTable és az OrderedDictionary eltérő viselkedéssel rendelkeznek. Ha olyan szótárban használja a taghozzáférés operátort, amelynek a neve megegyezik egy tulajdonság nevével, akkor a tulajdonság értéke helyett a kulcs értékét adja vissza.

A szótárobjektum tulajdonságértékét a psbasebelső tagjával érheti el. Ha például a kulcs neve, keys és vissza szeretné adni a Kivonatoló kulcsok gyűjteményét, használja ezt a szintaxist:

$hashtable.PSBase.Keys

Hozzáférés a gyűjtemény összes elemén található tagokhoz, de önmagában nem

Ha olyan gyűjteményobjektumon használja a taghozzáférési operátort, amely nem tagot tartalmaz, hanem az abban lévő elemeket, a PowerShell számba fogja venni a gyűjtemény elemeit, és visszaadja az egyes elemek tulajdonságértékét vagy metóduseredményét.

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

A
B
C

A gyűjteményen és az elemeken létező tagok elérése

Ha olyan gyűjteményobjektumban használja a taghozzáférési operátort, amely nem rendelkezik tagdal, és az elemeket sem, a parancs akkor ad vissza, $null ha tulajdonságot vagy MethodNotFound hibát ad meg, ha megad egy metódust.

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

Mivel a gyűjteményobjektum nem rendelkezik tagmal, a PowerShell a gyűjtemény elemeit sorolta fel. Figyelje meg, hogy a MethodNotFound hiba azt határozza meg, hogy a System.String nem tartalmazza a metódust a System.Collections.Generic.List helyett.

Olyan metódusok elérése, amelyek csak egy gyűjtemény egyes elemein léteznek

Ha a taghozzáférési operátorral olyan metódust próbál elérni egy gyűjteményobjektumon, amely nem rendelkezik a metódussal, és csak a gyűjtemény egyes elemei rendelkeznek vele, a parancs hibát ad vissza MethodNotFound a gyűjtemény első olyan eleméhez, amely nem rendelkezik a metódussal. Annak ellenére, hogy a metódus egyes elemeken meghívást kap, a parancs csak a hibát adja vissza.

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

Olyan tulajdonságok elérése, amelyek csak a gyűjtemény egyes elemein léteznek

Ha a taghozzáférési operátort használja egy olyan gyűjteményobjektum tulajdonságának eléréséhez, amely nem rendelkezik a tulajdonságmal, és csak a gyűjtemény egyes elemei rendelkeznek vele, a parancs visszaadja a tulajdonságot tartalmazó gyűjtemény minden elemének tulajdonságértékét.

$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

Kapcsolódó információk