Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Deskripsi singkat
Menjelaskan perbedaan antara akselerator jenis [psobject] dan [pscustomobject].
Deskripsi panjang
Akselerator jenis [pscustomobject] 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 untuk menambahkan properti. Misalnya:
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 PropertiNew-Object untuk meneruskan Hashtable yang berisi anggota dan nilai. Misalnya:
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 ke [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] adalah akselerator jenis.
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
Ketika akselerator jenis [pscustomobject] 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 pemakaian jenis atau perbandingan jenis, karena semua objek diperlakukan sebagai jenis PSObject.
Misalnya, menggunakan operator -is untuk memeriksa apakah objek yang dikembalikan oleh cmdlet adalah [pscustomobject] sama dengan membandingkannya dengan [psobject].
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, transmisi 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 ke [psobject] tampaknya tidak berpengaruh pada jenis, PowerShell menambahkan pembungkus di sekitar objek. Ini dapat memiliki efek samping yang halang.
Objek yang dibungkus cocok dengan jenis aslinya dan jenis
[psobject].PS> 1 -is [int32] True PS> 1 -is [psobject] False PS> ([psobject] 1) -is [int32] True PS> ([psobject] 1) -is [psobject] TrueOperator 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 ke [pscustomobject] tidak memiliki Panjang atau properti Hitungan.
Mencoba mengakses anggota ini mengembalikan $null.
Misalnya:
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 ke [pscustomobject] selalu memiliki nilai 1 untuk properti Panjang dan Count.