PSCustomObject hakkında


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ı PowerShell 3,0'a eklendi.

Bu tür hızlandırıcıyı eklemeden önce üye özellikleri ve değerleri olan bir nesne oluşturmak daha karmaşıktı. Başlangıçta, nesneyi oluşturmak için Yeni-Object'i ve özellikleri eklemek için Üye Ekle'yi kullanmanız gerekiyordu. Örneğin:

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 iletmek için New-Object'in Property parametresini kullanabilirsiniz. Örneğin:

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, Hashtable'ı [pscustomobject]'a aktarmak 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ü nesneler, üyelerin listesini, üyelerin nesneye eklenme sırasına göre tutar. Hashtable nesneleri anahtar/değer çiftlerinin sırasını garanti etmese de, [pscustomobject]'e gerçek bir hash tablosu dönüştürmek sırayı korur.

Hashtable'ın gerçek olması gerekir. Karma tabloyu parantez içine alırsanız veya karma tablo içeren bir değişken atarsanız sıranın korunacağına dair bir garanti 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ı anlama

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

Daha fazla bilgi için bkz. about_Type_Accelerators.

[pscustomobject] öğesinin System.Management.Automation.PSCustomObject ile 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ı da aynı sınıfla (PSObject) 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ı PowerShell'e eklendiğinde, Hashtable'ın PSObject türüne dönüştürülmesini işlemek için ekstra kod içeriyordu. Bu ekstra kod yalnızca yeni bir nesne oluşturulduğunda çağrılır. Bu nedenle, tür zorlaması veya tür karşılaştırması için [pscustomobject] kullanamazsınız çünkü tüm nesneler PSObject türleri olarak ele alınır.

Örneğin, bir cmdlet tarafından döndürülen bir nesnenin [pscustomobject] olup olmadığını kontrol etmek için -is operatörünü kullanmak, onu [psobject]< ile karşılaştırmakla aynıdır. /kod>.

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

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

Herhangi bir nesneyi [psobject]'e aktardığınızda orijinal nesnenin türünü elde edersiniz. Bu nedenle, Hashtable dışındaki herhangi bir şeyin [pscustomobject]'e dönüştürülmesi aynı türle sonuçlanır.

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]'e aktarmanın tür üzerinde hiçbir etkisi yok gibi görünse de PowerShell, nesnenin etrafına görünmez [psobject] sarmalayıcı ekler . Bunun ince yan etkileri olabilir.

  • Sarılmış nesneler orijinal türleriyle ve [psobject] türüyle eşleşir.

    PS> 1 -is [Int32]
    True
    PS> 1 -is [psobject]
    False
    PS> ([psobject] 1) -is [Int32]
    True
    PS> ([psobject] 1) -is [psobject]
    True
    
  • Biçim operatörü (-f), [psobject] tarafından sarılmış bir diziyi tanımıyor.

    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 tabloların dönüştürülmesi

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]'e aktardığınızda, PowerShell anahtarların büyük/küçük harflerini korur ancak büyük/küçük harfe duyarlı değildir. Sonuç olarak:

  • İlk kopya anahtarın durumu o 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 örnek bu davranışı göstermektedir:

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

Sıralanan hash tablosunun yalnızca büyük/küçük harfe göre farklılık gösteren birden fazla anahtar içerdiğine dikkat edin.

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

Bu karma tablosu bir [pscustomobject]'e aktarıldığında, ilk anahtarın adı büyük/küçük harf olarak 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

Notlar

Windows PowerShell'de, Hashtable'ın [pscustomobject]'e dönüştürülmesiyle oluşturulan nesnelerin Uzunluk veya Sayı'sı yoktur. özellikler. Bu üyelere erişmeye çalışmak $null değerini döndürür.

Örneğin:

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

key
---
value

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

PowerShell 6'dan başlayarak, Hashtable'ın [pscustomobject]'e dönüştürülmesiyle oluşturulan nesneler, Uzunlukiçin her zaman 1 değerine sahiptir. ve Count özellikleri.

Ayrıca bakınız

  • about_Object_Creation
  • about_Objects
  • System.Management.Automation.PSObject
  • System.Management.Automation.PSCustomObject

İlgili makaleler