Compartilhar via


about_PSCustomObject

Descrição curta

Explica as diferenças entre os aceleradores de tipo [psobject] e [pscustomobject].

Descrição longa

O acelerador de tipo [pscustomobject] foi adicionado no PowerShell 3.0.

Antes de adicionar esse acelerador de tipo, a criação de um objeto com propriedades e valores de membro era mais complicada. Originalmente, você precisava usar New-Object para criar o objeto e Add-Member para adicionar propriedades. Por exemplo:

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

Posteriormente, você pode usar o parâmetro propriedade de para passar um hashable que contém os membros e os valores. Por exemplo:

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

Desde o PowerShell 3.0, a conversão de um hashable para [pscustomobject] obtém o mesmo resultado.

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

objetos de tipo PSObject mantêm a lista de membros na ordem em que os membros foram adicionados ao objeto. Embora objetos hashable não garantam a ordem dos pares chave-valor, a conversão de um hash literal para [pscustomobject] mantém a ordem.

O hashtable deve ser um literal. Se você encapsular o hashtable em parênteses ou se converter uma variável contendo um hashtable, não haverá garantia de que a ordem seja preservada.

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

Noções básicas sobre os aceleradores de tipo

[psobject] e [pscustomobject] são aceleradores de tipo.

Para obter mais informações, consulte about_Type_Accelerators.

Embora você possa achar que [pscustomobject] deve ser mapeado para System.Management.Automation.PSCustomObject, os tipos são diferentes.

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

Ambos os aceleradores de tipo são mapeados para a mesma classe, PSObject:

PS> [pscustomobject]

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

PS> [psobject]

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

Quando o acelerador de tipo foi adicionado ao PowerShell, ele incluiu código extra para lidar com a conversão de um hashable em um tipo de PSObject . Esse código extra só é invocado quando um novo objeto está sendo criado. Portanto, você não pode usar [pscustomobject] para coerção de tipo ou comparação de tipos, pois todos os objetos são tratados como tipos de PSObject.

Por exemplo, usar o operador -is para verificar se um objeto retornado por um cmdlet é um [pscustomobject] é o mesmo que compará-lo com [psobject].

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

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

Ao converter qualquer objeto para [psobject] você obtém o tipo do objeto original. Portanto, a conversão de qualquer coisa diferente de um hashable para resulta no mesmo tipo.

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

Enquanto a conversão de um objeto para [psobject] parece não afetar o tipo, o PowerShell adiciona um invisível[psobject] wrapper ao redor do objeto. Isso pode ter efeitos colaterais sutis.

  • Os objetos encapsulados corresponderão ao tipo original e ao tipo [psobject].

    PS> 1 -is [Int32]
    True
    PS> 1 -is [psobject]
    False
    PS> ([psobject] 1) -is [Int32]
    True
    PS> ([psobject] 1) -is [psobject]
    True
    
  • O operador de formato (-f) não reconhece uma matriz encapsulada por [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..
    

Anotações

No Windows PowerShell, os objetos criados por meio da conversão de um hashable de para não têm as propriedades Length Count. Tentar acessar esses membros retorna $null.

Por exemplo:

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

key
---
value

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

A partir do PowerShell 6, os objetos criados por meio da conversão de um hashable para sempre têm um valor de para as propriedades de Comprimento e contagem de .

Consulte também