about_PSCustomObject

Kısa açıklama

[psobject] ve [pscustomobject] tür hızlandırıcıları arasındaki farkları açıklar.

Uzun açıklama

[pscustomobject] tür hızlandırıcısı PowerShell 3.0'a eklendi.

Bu tür hızlandırıcısını eklemeden önce, üye özellikleri ve değerleriyle bir nesne oluşturmak daha karmaşıktı. Başlangıçta, nesneyi oluşturmak için New-Object ve özellikleri eklemek için Add-Member kullanmanız gerekiyordu. Mesela:

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

Daha sonra, üyeleri ve değerleri içeren bir Hashtable geçirmek için New-ObjectÖzelliği parametresini kullanabilirsiniz. Mesela:

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

PowerShell 3.0'dan bu yana [pscustomobject] aynı sonucu elde eder.

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

PSObject türü nesneleri, üyelerin listesini, üyelerin nesneye eklenme sırasına göre korur. Hashtable nesneleri anahtar-değer çiftlerinin sırasını garanti etmese de, [pscustomobject] için değişmez bir karma tablo atama sırayı korur.

Karma tablo değişmez değer olmalıdır. Hashtable'ı parantez içinde sarmalarsanız veya karma tablo içeren bir değişken yayınlarsanız, sıranın korunduğunun garantisi yoktur.

$hash = @{
    Name      = "Server30"
    System    = "Server Core"
    PSVersion = "4.0"
}
$Asset = [pscustomobject]$hash
$Asset
System      Name     PSVersion
------      ----     ---------
Server Core Server30 4.0

Tür hızlandırıcılarını anlama

[psobject] ve [pscustomobject] tür hızlandırıcılarıdır.

Daha fazla bilgi için bkz. about_Type_Accelerators.

[pscustomobject] System.Management.Automation.PSCustomObjectile eşlenmesi gerektiğini düşünseniz de, türler farklıdır.

PS> [pscustomobject] -eq [System.Management.Automation.PSCustomObject]
False

Her iki tür hızlandırıcısı da psobject aynı sınıfa eşlenir:

PS> [pscustomobject]

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     PSObject                                 System.Object

PS> [psobject]

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     PSObject                                 System.Object

[pscustomobject] tür hızlandırıcısı PowerShell'e eklendiğinde, HashtablePSObject türüne dönüştürülmesi için ek kod içeriyordu. Bu ek kod yalnızca yeni bir nesne oluşturulduğunda çağrılır. Bu nedenle, tüm nesneler [pscustomobject] türleri olarak değerlendirildiğinden, tür zorlaması veya tür karşılaştırması için kullanamazsınız.

Örneğin, cmdlet tarafından döndürülen bir nesnenin bir -is olup olmadığını denetlemek için [pscustomobject] işlecini kullanmak, [psobject]ile karşılaştırmakla aynıdır.

PS> (Get-Item /) -is [pscustomobject]
True

PS> (Get-Item /) -is [psobject]
True

[psobject] herhangi bir nesneyi yayınladığınızda özgün nesnenin türünü alırsınız. Bu nedenle, Hashtable dışındaki herhangi bir şeyi [pscustomobject] atama aynı türe neden olur.

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

Bir nesneyi [psobject]'a atamanın tür üzerinde hiçbir etkisi yok gibi görünse de, PowerShell nesnenin çevresine görünmez ekler. Bunun hafif yan etkileri olabilir.

  • Sarmalanan nesneler özgün türleriyle ve [psobject] türüyle eşleşer.

    PS> 1 -is [int32]
    True
    PS> 1 -is [psobject]
    False
    PS> ([psobject] 1) -is [int32]
    True
    PS> ([psobject] 1) -is [psobject]
    True
    
  • biçim işleci (-f), [psobject]tarafından sarmalanan bir diziyi tanımaz.

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

Benzer anahtarlar içeren karma tablo dönüştürme

Büyük/küçük harfe duyarlı sözlükler yalnızca büyük/küçük harfe göre farklılık gösteren anahtar adları içerebilir. Böyle bir sözlüğü bir [pscustomobject]yayınladığınızda, PowerShell anahtarların bu büyük/küçük harflerini korur ancak büyük/küçük harfe duyarlı değildir. Sonuç olarak:

  • İlk yinelenen anahtar söz konusu anahtarın adı olur.
  • Son büyük/küçük harf-değişken anahtarının değeri özellik değeri olur.

Aşağıdaki örnekte bu davranış gösterilmektedir:

$Json = '{
  "One": 1,
  "two": 2,
  "Two": 3,
  "three": 3,
  "Three": 4,
  "THREE": 5
}'
$OrderedHashTable = $Json | ConvertFrom-Json -AsHashTable
$OrderedHashTable

Sıralı karma tablo yalnızca büyük/küçük harfe göre farklılık gösteren birden çok anahtar içerdiğine dikkat edin.

Name                           Value
----                           -----
One                            1
two                            2
Two                            3
three                          3
Three                          4
THREE                          5

Bu karma tablo bir [pscustomobject]yayınlandığında, ilk anahtarın adı büyük/küçük harf kullanılır, ancak eşleşen son anahtar adının değeri kullanılır.

[pscustomobject]$OrderedHashTable
One two three
--- --- -----
  1   3     5

Notes

Windows PowerShell'de, Hashtable[pscustomobject] atanarak oluşturulan nesneler Uzunluk veya Sayısı özelliklerine sahip değildir. Bu üyelere erişmeye çalışılması $nulldöndürür.

Mesela:

PS> $object = [pscustomobject]@{key = 'value'}
PS> $object

key
---
value

PS> $object.Count
PS> $object.Length

PowerShell 6'dan başlayarak, [pscustomobject] atanarak oluşturulan nesneler, 1 ve Sayısı özellikleri için her zaman değerine sahiptir.

Ayrıca bakınız