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
Method invocation failed because [System.String] does not contain a method
named 'DoesNotExist'.
At line:1 char:1
+ $MyString.DoesNotExist()
+ ~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound
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-Object
taghozzá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
Method invocation failed because [System.String] does not contain a method
named 'DoesNotExist'.
At line:1 char:1
+ $Collection.DoesNotExist()
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound
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()
Method invocation failed because [System.Int32] does not contain a method
named 'ToUpper'.
At line:1 char:1
+ @('a', 1, 'c').ToUpper()
+ ~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound
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