Bagikan melalui


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 .

Lihat juga