Partilhar via


about_PSCustomObject

Breve descrição

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

Descrição longa

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

Antes de adicionar esse acelerador de tipo, criar um objeto com propriedades e valores de membro era mais complicado. Originalmente, você tinha que usar New-Object para criar o objeto e Add-Member 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

Mais tarde, você pode usar o parâmetro Property de New-Object para passar um Hashtable contendo os membros e 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 uma Hashtable para [pscustomobject] alcançar 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

Os objetos do tipo PSObject mantêm a lista de membros na ordem em que os membros foram adicionados ao objeto. Embora os objetos Hashtable não garantam a ordem dos pares chave-valor, a conversão de uma hashtable literal para [pscustomobject] manter a ordem.

A hashtable deve ser literal. Se você envolver a hashtable entre parênteses ou se lançar uma variável contendo uma hashtable, não há 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.

Mesmo que você possa pensar que [pscustomobject] deve mapear 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 [pscustomobject] acelerador de tipo foi adicionado ao PowerShell, ele incluiu código extra para manipular a conversão de um Hashtable em um tipo 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 tipo, porque todos os objetos são tratados como tipos PSObject .

Por exemplo, usar o -is operador 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

Quando você lança qualquer objeto para [psobject] você, obtém o tipo do objeto original. Portanto, lançar qualquer coisa diferente de uma Hashtable para [pscustomobject] 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 parece [psobject] não ter nenhum efeito sobre o tipo, o PowerShell adiciona um wrapper invisível [psobject] ao redor do objeto. Isto pode ter efeitos secundários subtis.

  • Os objetos encapsulados correspondem ao seu tipo original e ao [psobject] tipo.

    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..
    

Conversão de hashtables contendo chaves semelhantes

Os dicionários que diferenciam maiúsculas de minúsculas podem conter nomes de chaves que diferem apenas por maiúsculas e minúsculas. Quando você converte esse dicionário em um [pscustomobject], o PowerShell preserva esse caso das chaves, mas não diferencia maiúsculas de minúsculas. Como resultado:

  • O caso da primeira chave duplicada torna-se o nome dessa chave.
  • O valor da última chave variante de maiúsculas e minúsculas torna-se o valor da propriedade.

O exemplo a seguir demonstra esse comportamento:

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

Observe que a hashtable ordenada contém várias chaves que diferem apenas por maiúsculas e minúsculas.

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

Quando essa hashtable é convertida em um [pscustomobject], o caso do nome da primeira chave é usado, mas esse valor do último nome de chave correspondente é usado.

[PSCustomObject]$OrderedHashTable
One two three
--- --- -----
  1   3     5

Notas

No Windows PowerShell, os objetos criados pela conversão de uma Hashtable não [pscustomobject] têm as propriedades Length ou Count . A tentativa de 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 pela conversão de uma Hashtable sempre [pscustomobject] terão um valor para 1 as propriedades Length e Count .

Consulte também