Bagikan melalui


about_Member-Access_Enumeration

Deskripsi singkat

Menjelaskan enumerasi otomatis koleksi saat menggunakan operator akses anggota.

Deskripsi panjang

PowerShell mempertahankan daftar jenis yang dapat dijumlahkan. Mulai dari PowerShell 3.0, fitur enumerasi akses anggota meningkatkan kenyamanan menggunakan operator akses anggota () pada objek pengumpulan yang dapat dihitung.

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.

Contoh berikut menghasilkan hasil yang sama. Contoh terakhir menunjukkan penggunaan operator akses anggota:

PS> Get-Service -Name event* | ForEach-Object -Process { $_.DisplayName }
Windows Event Log
COM+ Event System
PS> (Get-Service -Name event*).ForEach({ $_.DisplayName })
Windows Event Log
COM+ Event System
PS> (Get-Service -Name event*).DisplayName
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. Enumerasi akses anggota adalah fitur kenyamanan. Mungkin ada perbedaan perilaku dan kinerja yang halus antara berbagai metode enumerasi.

Saat Anda menggunakan operator akses anggota pada objek dan anggota yang ditentukan ada pada objek tersebut, anggota akan dipanggil. Saat Anda menggunakan operator akses anggota pada objek koleksi yang tidak memiliki anggota yang ditentukan, PowerShell menghitung item dalam koleksi tersebut dan menggunakan operator akses anggota pada setiap item yang dijumlahkan.

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.

Mengakses anggota objek yang tidak dapat dijumlahkan

Saat Anda menggunakan operator akses anggota pada objek yang bukan koleksi enumerable, PowerShell memanggil anggota untuk mengembalikan nilai properti atau output metode untuk objek tersebut.

PS> $MyString = 'abc'
PS> $MyString.Length
3
PS> $MyString.ToUpper()
ABC

Saat Anda menggunakan operator akses anggota pada objek yang tidak dapat dijumlahkan yang tidak memiliki anggota, PowerShell mengembalikan $null untuk properti yang hilang atau kesalahan MethodNotFound untuk metode yang hilang.

PS> $MyString = 'abc'
PS> $null -eq $MyString.DoesNotExist
True
PS> $MyString.DoesNotExist()
InvalidOperation: Method invocation failed because [System.String] does not contain a method named 'DoesNotExist'.

Mengakses anggota objek koleksi

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 pada koleksi tetapi bukan itemnya

Dalam contoh ini, anggota yang ditentukan ada di koleksi tetapi bukan item di dalamnya.

PS> [System.Collections.Generic.List[string]]$Collection = @('a', 'b')
PS> $Collection.IsReadOnly
False
PS> $Collection.Add('c')
PS> $Collection
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.

PS> [System.Collections.Generic.List[string]]$Collection = @('a', 'b', 'c')
PS> $Collection.Count
3
PS> $Collection | ForEach-Object -Process { $_.Count }
1
1
1
PS> $Collection.ToString()
System.Collections.Generic.List`1[System.String]
PS> $Collection | ForEach-Object -Process { $_.ToString() }
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 memilikinya, PowerShell menelusuri item-item dalam koleksi tersebut dan mengembalikan nilai properti atau hasil metode untuk setiap item.

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

Mengakses anggota yang tidak ada di koleksi atau itemnya

Saat Anda menggunakan operator akses anggota pada objek koleksi yang tidak memiliki anggota dan tidak melakukan item di dalamnya, perintah mengembalikan $null jika Anda menentukan properti atau kesalahan MethodNotFound jika Anda menentukan metode.

PS> [System.Collections.Generic.List[string]]$Collection = @('a', 'b', 'c')
PS> $null -eq $Collection.DoesNotExist
True
PS> $Collection.DoesNotExist()
InvalidOperation: 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 menyatakan bahwa System.String tidak berisi metode daripada System.Collections.Generic.List.

Metode akses yang hanya ada pada beberapa item dalam koleksi

Saat Anda menggunakan operator akses anggota untuk mengakses metode pada objek koleksi yang tidak memiliki metode dan hanya beberapa item dalam koleksi yang memilikinya, perintah mengembalikan kesalahan MethodNotFound untuk item pertama dalam koleksi yang tidak memiliki metode . Meskipun metode dipanggil pada beberapa item, perintah hanya mengembalikan kesalahan.

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

Akses 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 .

PS> $CapitalizedProperty = @{
    MemberType = 'ScriptProperty'
    Name       = 'Capitalized'
    Value      = { $this.ToUpper() }
    PassThru   = $true
}
PS> [System.Collections.Generic.List[object]]$MixedCollection = @(
    'a'
    ('b' | Add-Member @CapitalizedProperty)
    ('c' | Add-Member @CapitalizedProperty)
    'd'
)
PS> $MixedCollection.Capitalized
B
C

Mengakses elemen dari koleksi bersarang

Saat koleksi yang dapat dijumlahkan berisi koleksi berlapis, enumerasi akses anggota diterapkan ke setiap koleksi berlapis.

Misalnya, $a adalah array yang berisi dua elemen: array string berlapis dan satu string.

# Get the count of items in the array.
PS> $a.Count
2
# Get the count of items in each nested item.
PS> $a.GetEnumerator().Count
2
1
# Call the ToUpper() method on all items in the nested array.
PS> $a = @(, ('bar', 'baz'), 'foo')
PS> $a.ToUpper()
BAR
BAZ
FOO

Saat Anda menggunakan operator akses anggota, PowerShell menghitung item dalam $a dan memanggil metode ToUpper() pada semua item.

Catatan

Seperti yang dinyatakan sebelumnya, mungkin ada perilaku halus dan perbedaan performa antara berbagai metode enumerasi.

Kesalahan mengakibatkan output hilang

Ketika enumerasi akses anggota dihentikan oleh kesalahan, output dari panggilan metode yang berhasil sebelumnya tidak dikembalikan. Kondisi kesalahan yang menyebabkan penghentian meliputi:

  • objek enumerasi tidak memiliki metode yang diakses
  • metode yang diakses menimbulkan kesalahan penghentian

Pertimbangkan contoh berikut:

class Class1 { [object] Foo() { return 'Bar' } }
class Class2 { [void] Foo() { throw 'Error' } }
class Class3 {}

$example1 = ([Class1]::new(), [Class1]::new())
$example2 = ([Class1]::new(), [Class2]::new())
$example3 = ([Class1]::new(), [Class3]::new())

Kedua item dalam $example1 memiliki metode Foo(), sehingga panggilan metode berhasil.

PS> $example1.Foo()
Bar
Bar

Metode Foo() pada item kedua di $example2 melemparkan kesalahan, sehingga enumerasi gagal.

PS> $example2.Foo()
Exception:
Line |
   2 |  class Class2 { [void] Foo() { throw 'Error' } }
     |                                ~~~~~~~~~~~~~
     | Error

Item kedua dalam $example2 tidak memiliki metode Foo(), sehingga enumerasi gagal.

PS> $example3.Foo()
InvalidOperation: Method invocation failed because [Class3] does not contain
a method named 'Foo'.

Bandingkan ini dengan enumerasi menggunakan ForEach-Object

PS> $example2 | ForEach-Object -MemberName Foo
Bar
ForEach-Object: Exception calling "Foo" with "0" argument(s): "Error"
PS> $example3 | ForEach-Object -MemberName Foo
Bar

Perhatikan bahwa output menunjukkan panggilan yang berhasil untuk Foo() pada item pertama dalam array.

Koleksi yang berisi instans PSCustomObject

Jika kumpulan objek berisi instans PSCustomObject, PowerShell secara tak terduga akan mengembalikan nilai $null ketika properti yang diakses hilang.

Dalam contoh berikut setidaknya satu objek memiliki properti yang dirujuk.

PS> $foo = [pscustomobject]@{ Foo = 'Foo' }
PS> $bar = [pscustomobject]@{ Bar = 'Bar' }
PS> $baz = [pscustomobject]@{ Baz = 'Baz' }
PS> ConvertTo-Json ($foo, $bar, $baz).Foo
[
  "Foo",
  null,
  null
]
PS> ConvertTo-Json ((Get-Process -Id $PID), $foo).Name
[
  "pwsh",
  null
]

Anda akan mengharapkan PowerShell mengembalikan satu objek untuk item yang memiliki properti yang ditentukan. Sebagai gantinya, PowerShell juga mengembalikan nilai $null untuk setiap item yang tidak memiliki properti .

Untuk informasi selengkapnya tentang perilaku ini, lihat Masalah PowerShell #13752.

Lihat Juga