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
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour