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 (.) kullanma 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 nesnesine göndermek 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.

Üye erişim işlecini herhangi bir nesnede kullandığınızda ve belirtilen üye bu nesnede mevcut olduğunda, ü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 üye erişim işlecini kullandığınızda, PowerShell bu koleksiyondaki öğeleri otomatik olarak numaralandırır ve numaralandırılmış her öğede member-access işlecini kullanır.

Bir nesnenin bir liste koleksiyonu olup olmadığını denetlemek için türünün IList arabirimini uygulayıp uygulamadığını görebilirsiniz:

$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şim 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ğırmaya çalışır. 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ılan öğ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

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

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

ABC

Üyeye sahip 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 nesnesinde 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 bulunan 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 üye erişim işlecini kullanan komutların sonuçlarını, içindeki koleksiyon öğelerinde ForEach-Objectüye erişim işlecini kullanmanın sonuçlarıyla karşılaştırın. koleksiyonda işleci 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 davranışı farklıdır. Bir özellikle aynı ada sahip bir anahtara sahip bir sözlükte üye erişim işlecini kullandığınızda, özelliğin değeri 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 üye erişim 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 olmayan üyelere erişme

Üye olmayan bir koleksiyon nesnesinde member-access işlecini kullandığınızda ve içindeki öğeler de kullanılmadığında, bir özellik belirtirseniz komut döndürülur $null veya bir yöntem belirtirseniz hata MethodNotFound oluşur.

[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 nesnesi üyesine sahip olmadığından, PowerShell koleksiyondaki öğeleri numaralandırmış. MethodNotFound hatasının System.Collections.Generic.List yerine System.String'in yöntemini içermediğini belirttiğine dikkat edin.

Yalnızca bir koleksiyondaki 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 koleksiyondaki öğelerden yalnızca bazıları buna sahip olduğunda, komut yöntemi olmayan koleksiyondaki 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ğine sahip olmayan bir koleksiyon nesnesi üzerindeki bir özelliğe erişmek için üye erişim işlecini kullandığınızda ve koleksiyondaki öğelerden yalnızca bazıları bu özelliğe sahip olduğunda, komut özelliğine sahip koleksiyondaki her öğe için ö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.