about_Member-Access_Enumeration
Deskripsi singkat
Menjelaskan enumerasi otomatis item kumpulan daftar saat menggunakan operator akses anggota.
Deskripsi panjang
Dimulai di PowerShell 3.0, fitur enumerasi akses anggota meningkatkan kenyamanan menggunakan operator akses anggota (.
) pada objek pengumpulan daftar. Saat Anda menggunakan operator akses anggota untuk mengakses anggota yang tidak ada di koleksi, PowerShell secara otomatis menghitung item dalam koleksi dan mencoba mengakses anggota yang ditentukan pada setiap item.
Enumerasi akses anggota membantu Anda menulis kode yang lebih sederhana dan lebih pendek. Alih-alih mempipa objek koleksi ke ForEach-Object
atau menggunakan ForEach()
metode intrinsik untuk mengakses anggota pada setiap item dalam koleksi, Anda dapat menggunakan operator akses anggota pada objek koleksi.
Perintah ini secara fungsional identik dengan yang terakhir menunjukkan penggunaan operator akses anggota:
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
Catatan
Anda dapat menggunakan operator akses anggota untuk mendapatkan nilai properti pada item dalam koleksi tetapi Anda tidak dapat menggunakannya untuk mengaturnya secara langsung. Untuk informasi selengkapnya, lihat about_Arrays.
Saat Anda menggunakan operator akses anggota pada objek apa pun dan anggota yang ditentukan ada pada objek tersebut, anggota akan dipanggil. Untuk anggota properti, operator mengembalikan nilai properti tersebut. Untuk anggota metode, operator memanggil metode tersebut pada objek.
Saat Anda menggunakan operator akses anggota pada objek kumpulan daftar yang tidak memiliki anggota yang ditentukan, PowerShell secara otomatis menghitung item dalam koleksi tersebut dan menggunakan operator akses anggota pada setiap item yang dijumlahkan.
Anda dapat memeriksa apakah objek adalah kumpulan daftar dengan melihat apakah jenisnya mengimplementasikan antarmuka IList :
$List = @('a', 'b')
$Hash = @{ a = 'b' }
$List.GetType().ImplementedInterfaces.Name -contains 'IList'
$Hash.GetType().ImplementedInterfaces.Name -contains 'IList'
True
False
Selama enumerasi akses anggota untuk properti, operator mengembalikan nilai properti untuk setiap item yang memiliki properti tersebut. Jika tidak ada item yang memiliki properti yang ditentukan, operator mengembalikan $null
.
Selama enumerasi akses anggota untuk metode , operator mencoba memanggil metode pada setiap item dalam koleksi. Jika ada item dalam koleksi yang tidak memiliki metode yang ditentukan, operator mengembalikan pengecualian MethodNotFound .
Peringatan
Selama enumerasi akses anggota untuk metode , metode dipanggil pada setiap item dalam koleksi. Jika metode yang Anda panggil membuat perubahan, perubahan dilakukan untuk setiap item dalam koleksi. Jika terjadi kesalahan selama enumerasi, metode hanya dipanggil pada item yang dijumlahkan sebelum kesalahan. Untuk keamanan tambahan, pertimbangkan untuk menghitung item secara manual dan secara eksplisit menangani kesalahan apa pun.
Contoh berikut merinci perilaku operator akses anggota di bawah semua skenario yang mungkin.
Mengakses anggota objek non-daftar
Saat Anda menggunakan operator akses anggota pada objek yang bukan kumpulan daftar dan yang memiliki anggota, perintah mengembalikan nilai properti atau output metode untuk objek tersebut.
$MyString = 'abc'
$MyString.Length
$MyString.ToUpper()
3
ABC
Saat Anda menggunakan operator akses anggota pada objek non-daftar yang tidak memiliki anggota, perintah akan ditampilkan $null
jika Anda menentukan properti atau kesalahan MethodNotFound jika Anda menentukan metode.
$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'.
Mengakses anggota objek kumpulan daftar
Saat Anda menggunakan operator akses anggota pada objek koleksi yang memiliki anggota, operator selalu mengembalikan nilai properti atau hasil metode untuk objek koleksi.
Mengakses anggota yang ada di koleksi tetapi bukan itemnya
Dalam contoh ini, anggota yang ditentukan ada di koleksi tetapi bukan item di dalamnya.
[System.Collections.Generic.List[string]]$Collection = @('a', 'b')
$Collection.IsReadOnly
$Collection.Add('c')
$Collection
False
a
b
c
Mengakses anggota yang ada di koleksi dan itemnya
Untuk contoh ini, anggota yang ditentukan ada di koleksi dan item di dalamnya. Bandingkan hasil perintah menggunakan operator akses anggota pada koleksi dengan hasil dari menggunakan operator akses anggota pada item koleksi di ForEach-Object
. Pada koleksi, operator mengembalikan nilai properti atau hasil metode untuk objek koleksi dan bukan item di dalamnya.
[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
Catatan
Koleksi yang mengimplementasikan antarmuka System.Collections.IDictionary , seperti HashTable dan OrderedDictionary, memiliki perilaku yang berbeda. Saat Anda menggunakan operator akses anggota pada kamus yang memiliki kunci dengan nama yang sama dengan properti, operator mengembalikan nilai kunci alih-alih properti.
Anda dapat mengakses nilai properti objek kamus dengan anggota intrinsik psbase. Misalnya, jika nama kunci adalah keys
dan Anda ingin mengembalikan koleksi kunci HashTable , gunakan sintaks ini:
$hashtable.PSBase.Keys
Mengakses anggota yang ada di semua item dalam koleksi tetapi tidak itu sendiri
Saat Anda menggunakan operator akses anggota pada objek koleksi yang tidak memiliki anggota tetapi item di dalamnya, PowerShell menghitung item dalam koleksi dan mengembalikan nilai properti atau hasil metode untuk setiap item.
[System.Collections.Generic.List[string]]$Collection = @('a', 'b', 'c')
$Collection.Length
$Collection.ToUpper()
1
1
1
A
B
C
Mengakses anggota yang ada pada koleksi maupun itemnya
Saat Anda menggunakan operator akses anggota pada objek koleksi yang tidak memiliki anggota dan tidak melakukan item di dalamnya, perintah akan ditampilkan $null
jika Anda menentukan properti atau MethodNotFound
kesalahan jika Anda menentukan metode.
[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'.
Karena objek koleksi tidak memiliki anggota, PowerShell menghitung item dalam koleksi. Perhatikan bahwa kesalahan MethodNotFound menentukan bahwa System.String tidak berisi metode alih-alih System.Collections.Generic.List.
Mengakses metode yang hanya ada pada beberapa item dalam koleksi
Ketika Anda menggunakan operator akses anggota untuk mengakses metode pada objek koleksi yang tidak memiliki metode dan hanya beberapa item dalam koleksi yang MethodNotFound
memilikinya, perintah mengembalikan kesalahan untuk item pertama dalam koleksi yang tidak memiliki metode . Meskipun metode dipanggil pada beberapa item, perintah hanya mengembalikan kesalahan.
@('a', 1, 'c').ToUpper()
InvalidOperation: Method invocation failed because [System.Int32] does not contain a method named 'ToUpper'.
Mengakses properti yang hanya ada pada beberapa item dalam koleksi
Saat Anda menggunakan operator akses anggota untuk mengakses properti pada objek koleksi yang tidak memiliki properti dan hanya beberapa item dalam koleksi yang memilikinya, perintah mengembalikan nilai properti untuk setiap item dalam koleksi yang memiliki properti .
$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