about_PSCustomObject
Descrição breve
Explica as diferenças entre os [psobject]
aceleradores e [pscustomobject]
tipo.
Descrição longa
O [pscustomobject]
acelerador de tipo foi adicionado no PowerShell 3.0.
Antes de adicionar esse tipo de acelerador, a criação de um objeto com propriedades e valores de membro era mais complicada. 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
Posteriormente, você pode usar o parâmetro Property de New-Object
para passar uma 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]
obter 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. Mesmo que os objetos Hashtable não garantam a ordem dos pares chave-valor, a conversão de uma hashtable literal mantém [pscustomobject]
a ordem.
A hashtable deve ser um literal. Se você envolver a hashtable entre parênteses ou se converter 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 uma Hashtable em um tipo PSObject . Esse código extra só é chamado 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 é a [pscustomobject]
mesma coisa que compará-lo com [psobject]
.
PS> (Get-Item /) -is [pscustomobject]
True
PS> (Get-Item /) -is [psobject]
True
Quando você converte qualquer objeto para [psobject]
você obtém o tipo do objeto original. Portanto, converter 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 para [psobject]
parece não ter nenhum efeito sobre o tipo, o PowerShell adiciona um wrapper invisível[psobject]
em torno do objeto. Isso pode ter efeitos colaterais sutis.
Os objetos encapsulados corresponderão ao 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..
Observações
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 de 1
para as propriedades Length e Count .
Confira também
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de