about_Member-Access_Enumeration

Kısa açıklama

Üye erişim işleci kullanılırken liste koleksiyonu öğelerinin otomatik numaralandırmasını açıklar.

Uzun açıklama

PowerShell 3.0'dan başlayarak üye erişimi numaralandırma özelliği, liste koleksiyonu nesnelerinde üye erişim işlecini (.) kullanmanın kolaylığını artırır. Bir koleksiyonda bulunmayan bir üyeye erişmek için üye erişim işlecini kullandığınızda, PowerShell koleksiyondaki öğeleri otomatik olarak numaralandırır ve her öğede belirtilen üyeye erişmeye çalışır.

Üye erişimi numaralandırması daha basit ve daha kısa kod yazmanıza yardımcı olur. Koleksiyon nesnesini koleksiyondaki her öğedeki üyelere ForEach-Object erişmek için iç yöntemini kullanarak ForEach()veya bu nesneye piping uygulamak yerine, koleksiyon nesnesinde member-access işlecini kullanabilirsiniz.

Bu komutlar, üye erişim işlecinin kullanımını gösteren son komutla işlevsel olarak aynıdır:

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

Not

Bir koleksiyondaki öğelerde bir özelliğin değerlerini almak için üye erişim işlecini kullanabilirsiniz, ancak bunları doğrudan ayarlamak için kullanamazsınız. Daha fazla bilgi için bkz . about_Arrays.

Herhangi bir nesnede member-access işlecini kullandığınızda ve belirtilen üye bu nesnede mevcutsa, üye çağrılır. Özellik üyeleri için işleç, bu özelliğin değerini döndürür. Yöntem üyeleri için, işleç nesnesinde bu yöntemi çağırır.

Belirtilen üyeye sahip olmayan bir liste koleksiyonu nesnesinde member-access işlecini kullandığınızda, PowerShell bu koleksiyondaki öğeleri otomatik olarak numaralandırır ve numaralandırılmış her öğede üye erişim işlecini kullanır.

Türünün IList arabirimini uygulayıp uygulamadığını görerek bir nesnenin liste koleksiyonu olup olmadığını de kontrol edebilirsiniz:

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

False

Bir özelliğin üye erişimi numaralandırması sırasında işleç, bu özelliğe sahip her öğe için özelliğin değerini döndürür. Belirtilen özelliğe sahip öğe yoksa işleci döndürür $null.

Bir yöntemin üye erişim numaralandırması sırasında, işleç koleksiyondaki her öğede yöntemini çağırmayı dener. Koleksiyondaki herhangi bir öğe belirtilen yönteme sahip değilse, işleç MethodNotFound özel durumunu döndürür.

Uyarı

Bir yöntemin üye erişim numaralandırması sırasında, yöntem koleksiyondaki her öğede çağrılır. Çağırdığınız yöntem değişiklik yaparsa, değişiklikler koleksiyondaki her öğe için yapılır. Numaralandırma sırasında bir hata oluşursa, yöntem yalnızca hatadan önce numaralandırılmış öğelerde çağrılır. Ek güvenlik için öğeleri el ile listelemeyi ve hataları açıkça işlemeyi göz önünde bulundurun.

Aşağıdaki örneklerde, tüm olası senaryolarda üye erişim işlecinin davranışı ayrıntılı olarak verilmiştir.

Liste dışı bir nesnenin üyelerine erişme

Üye erişim işlecini liste koleksiyonu olmayan ve üyesi olan bir nesnede kullandığınızda, komut bu nesne için yönteminin özelliğinin veya çıktısının değerini döndürür.

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

ABC

Üye olmayan liste olmayan bir nesnede üye erişim işlecini kullandığınızda, bir özellik belirtirseniz komut veya yöntem belirtirseniz MethodNotFound hatası döndürür$null.

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

Liste koleksiyonu nesnesinin üyelerine erişme

Üyeye sahip bir koleksiyon nesnesi üzerinde member-access işlecini kullandığınızda, her zaman koleksiyon nesnesi için özellik değerini veya yöntem sonucunu döndürür.

Koleksiyonda var olan ancak öğeleri olmayan üyelere erişme

Bu örnekte, belirtilen üyeler koleksiyonda var ancak içindeki öğelerde yok.

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

a
b
c

Koleksiyonda ve öğelerinde bulunan üyelere erişme

Bu örnekte, belirtilen üyeler hem koleksiyonda hem de içindeki öğelerde bulunur. koleksiyondaki member-access işlecini kullanarak komutların sonuçlarını içindeki koleksiyon öğelerinde ForEach-Objectüye erişim işlecini kullanma sonuçlarıyla karşılaştırın. koleksiyonda, işleç içindeki öğeleri değil koleksiyon nesnesi için özellik değerini veya yöntem sonucunu döndürür.

[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

Not

HashTable ve OrderedDictionary gibi System.Collections.IDictionary arabirimini uygulayan koleksiyonların farklı bir davranışı vardır. Bir özellik ile aynı ada sahip bir anahtara sahip bir sözlükte üye erişim işlecini kullandığınızda, özellik yerine anahtarın değerini döndürür.

Sözlük nesnesinin özellik değerine psbaseiç üyesiyle erişebilirsiniz. Örneğin, anahtar adı ise keys ve HashTable anahtarlarının koleksiyonunu döndürmek istiyorsanız, şu söz dizimini kullanın:

$hashtable.PSBase.Keys

Koleksiyondaki tüm öğelerde bulunan ancak kendisi olmayan üyelere erişme

Üye olmayan ancak içindeki öğelere sahip olan bir koleksiyon nesnesinde member-access işlecini kullandığınızda, PowerShell koleksiyondaki öğeleri numaralandırır ve her öğe için özellik değerini veya yöntem sonucunu döndürür.

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

A
B
C

Koleksiyonda veya öğelerinde var olan üyelere erişme

Üyeye sahip olmayan ve içindeki öğeleri içermeyen bir koleksiyon nesnesinde üye erişim işlecini kullandığınızda, bir özellik belirtirseniz komut veya bir yöntem belirtirseniz hata MethodNotFound döndürür$null.

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

Koleksiyon nesnesinde üye olmadığından, PowerShell koleksiyondaki öğeleri numaralandırmış. MethodNotFound hatasının System.Collections.Generic.List yerine System.String yöntemini içermediğini belirttiğine dikkat edin.

Koleksiyondaki yalnızca bazı öğelerde bulunan yöntemlere erişme

yöntemi olmayan bir koleksiyon nesnesi üzerindeki bir yönteme erişmek için üye erişim işlecini kullandığınızda ve yalnızca koleksiyondaki öğelerden bazıları buna sahip olduğunda, komut koleksiyondaki yöntemi olmayan ilk öğe için bir MethodNotFound hata döndürür. Yöntem bazı öğelerde çağrılsa da, komut yalnızca hatayı döndürür.

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

Koleksiyondaki yalnızca bazı öğelerde bulunan özelliklere erişme

Özelliği olmayan bir koleksiyon nesnesindeki bir özelliğe erişmek için member-access işlecini kullandığınızda ve koleksiyondaki öğelerden yalnızca bazıları buna sahip olduğunda, komut özelliğine sahip koleksiyondaki her öğenin özellik değerini döndürür.

$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

Ayrıca bkz: