about_PSCustomObject
Kort beskrivning
Förklarar skillnaderna mellan [psobject]
och [pscustomobject]
typacceleratorerna.
Lång beskrivning
Typacceleratorn [pscustomobject]
lades till i PowerShell 3.0.
Innan du lade till den här typacceleratorn var det mer komplicerat att skapa ett objekt med medlemsegenskaper och värden. Ursprungligen var du tvungen att använda New-Object
för att skapa objektet och Add-Member
lägga till egenskaper. Exempel:
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
Senare kan du använda egenskapsparametern New-Object
för för att skicka en Hashtable som innehåller medlemmar och värden. Exempel:
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
Sedan PowerShell 3.0 gjuter du en hashtable för att [pscustomobject]
uppnå samma resultat.
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
OBJEKT av TYPEN PSObject upprätthåller listan över medlemmar i den ordning som medlemmarna har lagts till i objektet. Även om Hashtable-objekt inte garanterar ordningen på nyckel/värde-paren, genererar du en literal hashtable för att [pscustomobject]
underhålla ordningen.
Hashtabellen måste vara en literal. Om du omsluter hashtabellen i parenteser eller om du kastar en variabel som innehåller en hashtabell finns det ingen garanti för att ordningen bevaras.
$hash = @{
Name = "Server30"
System = "Server Core"
PSVersion = "4.0"
}
$Asset = [pscustomobject]$hash
$Asset
System Name PSVersion
------ ---- ---------
Server Core Server30 4.0
Förstå typacceleratorerna
[psobject]
och [pscustomobject]
är typacceleratorer.
Mer information finns i about_Type_Accelerators.
Även om du kanske tycker att det [pscustomobject]
bör mappas till System.Management.Automation.PSCustomObject är typerna olika.
PS> [pscustomobject] -eq [System.Management.Automation.PSCustomObject]
False
Båda typacceleratorerna mappas till samma klass, PSObject:
PS> [pscustomobject]
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True PSObject System.Object
PS> [psobject]
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True PSObject System.Object
[pscustomobject]
När typacceleratorn lades till i PowerShell innehöll den extra kod för att hantera konvertering av en Hashtable till en PSObject-typ. Den här extra koden anropas bara när ett nytt objekt skapas.
Därför kan du inte använda [pscustomobject]
för typtvång eller typjämförelse, eftersom alla objekt behandlas som PSObject-typer .
Till exempel använder operatorn -is
för att kontrollera att ett objekt som returneras av en cmdlet är [pscustomobject]
detsamma som att [psobject]
jämföra det med .
PS> (Get-Item /) -is [pscustomobject]
True
PS> (Get-Item /) -is [psobject]
True
När du kastar ett objekt till [psobject]
får du typen av det ursprungliga objektet. Därför resulterar gjutning av något annat än en hashtable till [pscustomobject]
samma typ.
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
Även om gjutning av ett objekt till [psobject]
inte verkar ha någon inverkan på typen, lägger PowerShell till en osynlig[psobject]
omslutning runt objektet. Detta kan ha subtila biverkningar.
Omslutna objekt matchar deras ursprungliga typ och
[psobject]
typ.PS> 1 -is [Int32] True PS> 1 -is [psobject] False PS> ([psobject] 1) -is [Int32] True PS> ([psobject] 1) -is [psobject] True
Formatoperatorn (
-f
) känner inte igen en matris som omsluts av[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..
Kommentarer
I Windows PowerShell har objekt som skapats genom att en hashtabell gjuts för att [pscustomobject]
inte ha egenskaperna Längd eller Antal.
Om du försöker komma åt dessa medlemmar returneras $null
.
Exempel:
PS> $object = [PSCustomObject]@{key = 'value'}
PS> $object
key
---
value
PS> $object.Count
PS> $object.Length
Från och med PowerShell 6 skapas objekt som skapas genom att [pscustomobject]
en hashtable alltid har värdet 1
för egenskaperna Längd och Antal.