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
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 [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
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 $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
Consulte também
- about_Object_Creation
- about_Objects
- System.Management.Automation.PSObject
- System.Management.Automation.PSCustomObject