Share via


about_PSCustomObject

Description courte

Explique les différences entre les accélérateurs de type et [pscustomobject] les [psobject] accélérateurs de type.

Description longue

L’accélérateur de [pscustomobject] type a été ajouté dans PowerShell 3.0.

Avant d’ajouter cet accélérateur de type, la création d’un objet avec des propriétés de membre et des valeurs était plus complexe. À l’origine, vous devez utiliser New-Object pour créer l’objet et Add-Member ajouter des propriétés. Par exemple :

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

Plus tard, vous pouvez utiliser le paramètre Property pour New-Object passer une table de hachage contenant les membres et les valeurs. Par exemple :

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

Depuis PowerShell 3.0, la conversion d’une table[pscustomobject] de hachage pour obtenir le même résultat.

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

Les objets de type PSObject conservent la liste des membres dans l’ordre dans lequel les membres ont été ajoutés à l’objet. Même si les objets de table de hachage ne garantissent pas l’ordre des paires clé-valeur, la conversion d’une table de hachage littérale pour [pscustomobject] maintenir l’ordre.

La table de hachage doit être un littéral. Si vous encapsulez la table de hachage entre parenthèses ou si vous cassez une variable contenant une table de hachage, il n’existe aucune garantie que l’ordre est conservé.

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

Présentation des accélérateurs de type

[psobject] et [pscustomobject] sont des accélérateurs de type.

Pour plus d’informations, consultez about_Type_Accelerators.

Même si vous pensez peut-être que cela [pscustomobject] doit être mappé à System.Management.Automation.PSCustomObject, les types sont différents.

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

Les deux accélérateurs de type sont mappés à la même classe, PSObject :

PS> [pscustomobject]

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

PS> [psobject]

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

Lorsque l’accélérateur de [pscustomobject] type a été ajouté à PowerShell, il incluait du code supplémentaire pour gérer la conversion d’une table de hachage en type PSObject . Ce code supplémentaire est appelé uniquement lorsqu’un nouvel objet est créé. Par conséquent, vous ne pouvez pas utiliser [pscustomobject] pour la contrainte de type ou la comparaison de types, car tous les objets sont traités comme des types PSObject .

Par exemple, l’utilisation de l’opérateur -is pour case activée qu’un objet retourné par une applet de commande est [pscustomobject] identique à celui [psobject]auquel il est comparé.

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

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

Lorsque vous effectuez un cast d’un objet pour [psobject] obtenir le type de l’objet d’origine. Par conséquent, le cast n’importe quoi d’autre qu’une table de hachage pour [pscustomobject] obtenir le même type.

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

Bien que le cast d’un objet [psobject] n’ait aucun impact sur le type, PowerShell ajoute un wrapper invisible[psobject] autour de l’objet. Cela peut avoir des effets secondaires subtils.

  • Les objets encapsulés correspondent à leur type d’origine et au [psobject] type.

    PS> 1 -is [Int32]
    True
    PS> 1 -is [psobject]
    False
    PS> ([psobject] 1) -is [Int32]
    True
    PS> ([psobject] 1) -is [psobject]
    True
    
  • L’opérateur de format (-f) n’a pas reconnu de tableau encapsulé par [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..
    

Notes

Dans Windows PowerShell, les objets créés en castant une table de hachage pour [pscustomobject] ne pas avoir les propriétés Length ou Count . Toute tentative d’accès à ces membres retourne $null.

Par exemple :

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

key
---
value

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

À compter de PowerShell 6, les objets créés en cas de conversion d’une table[pscustomobject] de hachage doivent toujours avoir une valeur 1 pour les propriétés Length et Count .

Voir aussi