Dela via


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.

Se även