Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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] Truebiç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
- about_Object_Creation
- about_Objects
- System.Management.Automation.PSObject
- System.Management.Automation.PSCustomObject
PowerShell