about_PSCustomObject
Deskripsi singkat
Menjelaskan perbedaan antara [psobject]
akselerator jenis dan [pscustomobject]
.
Deskripsi panjang
Akselerator [pscustomobject]
jenis ditambahkan di PowerShell 3.0.
Sebelum menambahkan akselerator jenis ini, membuat objek dengan properti anggota dan nilai lebih rumit. Awalnya, Anda harus menggunakan New-Object
untuk membuat objek dan Add-Member
menambahkan properti. Contohnya:
PS> $object1 = New-Object -TypeName PSObject
PS> Add-Member -InputObject $object1 -MemberType NoteProperty -Name one -Value 1
PS> Add-Member -InputObject $object1 -MemberType NoteProperty -Name two -Value 2
PS> $object1 | Get-Member
TypeName: System.Management.Automation.PSCustomObject
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
one NoteProperty int one=1
two NoteProperty int two=2
PS> $object1
one two
--- ---
1 2
Nantinya, Anda dapat menggunakan parameter New-Object
Properti untuk meneruskan Hashtable yang berisi anggota dan nilai. Contohnya:
PS> $object2 = New-Object -TypeName PSObject -Property @{one=1; two=2}
PS> $object2 | Get-Member
TypeName: System.Management.Automation.PSCustomObject
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
one NoteProperty int one=1
two NoteProperty int two=2
PS> $object2
one two
--- ---
1 2
Sejak PowerShell 3.0, mentransmisikan Hashtable untuk [pscustomobject]
mencapai hasil yang sama.
PS> $object3 = [pscustomobject]@{one=1; two=2}
PS> $object3 | Get-Member
TypeName: System.Management.Automation.PSCustomObject
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
one NoteProperty int one=1
two NoteProperty int two=2
PS> $object3
one two
--- ---
1 2
Objek jenis PSObject mempertahankan daftar anggota dalam urutan anggota ditambahkan ke objek. Meskipun objek Hashtable tidak menjamin urutan pasangan kunci-nilai, mentransmisikan hashtable harfiah untuk [pscustomobject]
mempertahankan urutan.
Hashtable harus harfiah. Jika Anda membungkus hashtable dalam tanda kurung atau jika Anda mentransmisikan variabel yang berisi hashtable, tidak ada jaminan bahwa pesanan dipertahankan.
$hash = @{
Name = "Server30"
System = "Server Core"
PSVersion = "4.0"
}
$Asset = [pscustomobject]$hash
$Asset
System Name PSVersion
------ ---- ---------
Server Core Server30 4.0
Memahami jenis akselerator
[psobject]
dan [pscustomobject]
merupakan jenis akselerator.
Untuk informasi selengkapnya, lihat about_Type_Accelerators.
Meskipun Anda mungkin berpikir bahwa [pscustomobject]
harus memetakan ke System.Management.Automation.PSCustomObject, jenisnya berbeda.
PS> [pscustomobject] -eq [System.Management.Automation.PSCustomObject]
False
Kedua jenis akselerator dipetakan ke kelas yang sama, PSObject:
PS> [pscustomobject]
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True PSObject System.Object
PS> [psobject]
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True PSObject System.Object
[pscustomobject]
Ketika akselerator jenis ditambahkan ke PowerShell, itu termasuk kode tambahan untuk menangani konversi Hashtable ke jenis PSObject. Kode tambahan ini hanya dipanggil ketika objek baru sedang dibuat.
Oleh karena itu, Anda tidak dapat menggunakan [pscustomobject]
untuk koersi jenis atau perbandingan jenis, karena semua objek diperlakukan sebagai jenis PSObject .
Misalnya, menggunakan -is
operator untuk memeriksa apakah objek yang dikembalikan oleh cmdlet [pscustomobject]
sama dengan membandingkannya [psobject]
dengan .
PS> (Get-Item /) -is [pscustomobject]
True
PS> (Get-Item /) -is [psobject]
True
Saat Anda melemparkan objek apa pun ke [psobject]
Anda mendapatkan jenis objek asli. Oleh karena itu, mentransmisikan apa pun selain Hashtable untuk [pscustomobject]
menghasilkan jenis yang sama.
PS> ([psobject]@{Property = 'Value'}).GetType().FullName
System.Collections.Hashtable
PS> ([pscustomobject]123).GetType().Name
Int32
PS> ([pscustomobject]@{Property = 'Value'}).GetType().FullName
System.Management.Automation.PSCustomObject
Sementara, mentransmisikan objek tampaknya [psobject]
tidak berpengaruh pada jenis, PowerShell menambahkan pembungkus yang tidak terlihat [psobject]
di sekitar objek. Ini dapat memiliki efek samping yang halang.
Objek yang dibungkus cocok dengan jenis aslinya dan jenisnya
[psobject]
.PS> 1 -is [Int32] True PS> 1 -is [psobject] False PS> ([psobject] 1) -is [Int32] True PS> ([psobject] 1) -is [psobject] True
Operator format (
-f
) tidak mengenali array yang dibungkus oleh[psobject]
.PS> '{0} {1}' -f (1, 2) 1 2 PS> '{0} {1}' -f ([psobject] (1, 2)) Error formatting a string: Index (zero based) must be greater than or equal to zero and less than the size of the argument list..
Konversi hashtable yang berisi kunci serupa
Kamus peka huruf besar/kecil mungkin berisi nama kunci yang hanya berbeda menurut kasus.
Saat Anda mentransmisikan kamus seperti itu ke [pscustomobject]
, PowerShell mempertahankan kasus kunci tersebut tetapi tidak peka huruf besar/kecil. Akibatnya:
- Kasus kunci duplikat pertama menjadi nama kunci tersebut.
- Nilai kunci varian huruf besar/kecil terakhir menjadi nilai properti.
Contoh berikut menunjukkan perilaku ini:
$Json = '{
"One": 1,
"two": 2,
"Two": 3,
"three": 3,
"Three": 4,
"THREE": 5
}'
$OrderedHashTable = $Json | ConvertFrom-Json -AsHashTable
$OrderedHashTable
Perhatikan bahwa hashtable yang diurutkan berisi beberapa kunci yang hanya berbeda menurut kasus.
Name Value
---- -----
One 1
two 2
Two 3
three 3
Three 4
THREE 5
Ketika hashtable tersebut ditransmisikan ke [pscustomobject]
, kasus nama kunci pertama digunakan, tetapi nilai nama kunci terakhir yang cocok digunakan.
[PSCustomObject]$OrderedHashTable
One two three
--- --- -----
1 3 5
Catatan
Di Windows PowerShell, objek yang dibuat dengan mentransmisikan Hashtable untuk [pscustomobject]
tidak memiliki properti Panjang atau Hitung .
Mencoba mengakses anggota ini mengembalikan $null
.
Contohnya:
PS> $object = [PSCustomObject]@{key = 'value'}
PS> $object
key
---
value
PS> $object.Count
PS> $object.Length
Dimulai di PowerShell 6, objek yang dibuat dengan mentransmisikan Hashtable untuk [pscustomobject]
selalu memiliki nilai 1
untuk properti Panjang dan Hitung .