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:
PowerShell