Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Kurzbeschreibung
Erläutert die Unterschiede zwischen [psobject] und [pscustomobject] Zugriffstasten.
Lange Beschreibung
Die [pscustomobject] Typbeschleuniger wurde in PowerShell 3.0 hinzugefügt.
Vor dem Hinzufügen dieser Typbeschleuniger war das Erstellen eines Objekts mit Membereigenschaften und Werten komplizierter. Ursprünglich mussten Sie New-Object verwenden, um das Objekt zu erstellen, und Add-Member, um Eigenschaften hinzuzufügen. Zum Beispiel:
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
Später können Sie den parameter Property von New-Object verwenden, um eine Hashtable- mit den Elementen und Werten zu übergeben. Zum Beispiel:
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
Da PowerShell 3.0 ein Hashtable- in [pscustomobject] umwandeln, wird dasselbe Ergebnis erzielt.
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
PSObject- Typobjekte verwalten die Liste der Member in der Reihenfolge, in der die Member dem Objekt hinzugefügt wurden. Obwohl Hashtable- -Objekte die Reihenfolge der Schlüsselwertpaare nicht garantieren, behält die Umwandlung einer Literalhashtabelle in [pscustomobject] die Reihenfolge bei.
Die Hashtabelle muss ein Literal sein. Wenn Sie die Hashtable in Klammern umschließen oder eine Variable umwandeln, die eine Hashtabelle enthält, besteht keine Garantie dafür, dass die Reihenfolge beibehalten wird.
$hash = @{
Name = "Server30"
System = "Server Core"
PSVersion = "4.0"
}
$Asset = [pscustomobject]$hash
$Asset
System Name PSVersion
------ ---- ---------
Server Core Server30 4.0
Grundlegendes zu den Zugriffstasten
[psobject] und [pscustomobject] sind Typbeschleuniger.
Weitere Informationen finden Sie unter about_Type_Accelerators.
Auch wenn Sie denken, dass [pscustomobject]System.Management.Automation.PSCustomObjectzugeordnet werden soll, sind die Typen unterschiedlich.
PS> [pscustomobject] -eq [System.Management.Automation.PSCustomObject]
False
Beide Typbeschleuniger werden der gleichen Klasse zugeordnet, PSObject:
PS> [pscustomobject]
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True PSObject System.Object
PS> [psobject]
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True PSObject System.Object
Wenn der [pscustomobject] Typbeschleuniger zu PowerShell hinzugefügt wurde, enthielt er zusätzlichen Code zum Verarbeiten der Konvertierung eines Hashtable- in einen PSObject--Typ. Dieser zusätzliche Code wird nur aufgerufen, wenn ein neues Objekt erstellt wird.
Daher können Sie [pscustomobject] nicht für den Typkoersions- oder Typvergleich verwenden, da alle Objekte als PSObject--Typen behandelt werden.
Wenn Sie z. B. den -is-Operator verwenden, um zu überprüfen, ob ein von einem Cmdlet zurückgegebenes Objekt ein [pscustomobject] ist, entspricht dem Vergleich mit [psobject].
PS> (Get-Item /) -is [pscustomobject]
True
PS> (Get-Item /) -is [psobject]
True
Wenn Sie ein Objekt in [psobject] umwandeln, erhalten Sie den Typ des ursprünglichen Objekts. Daher wird alles andere als eine Hashtable- in [pscustomobject] Ergebnis in denselben Typ umzuwandern.
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
Während das Umwandeln eines Objekts in [psobject] keine Auswirkungen auf den Typ hat, fügt PowerShell ein unsichtbaren[psobject] Wrapper um das Objekt hinzu. Dies kann subtile Nebenwirkungen haben.
Umschlossene Objekte entsprechen ihrem ursprünglichen Typ und dem
[psobject]Typ.PS> 1 -is [int32] True PS> 1 -is [psobject] False PS> ([psobject] 1) -is [int32] True PS> ([psobject] 1) -is [psobject] TrueDer Formatoperator (
-f) hat kein Array erkannt, das von[psobject]umbrochen wird.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..
Konvertierung von Hashtables mit ähnlichen Schlüsseln
Bei Wörterbüchern mit Groß-/Kleinschreibung kann es sich um Schlüsselnamen handeln, die sich nur je nach Groß-/Kleinschreibung unterscheiden.
Wenn Sie ein solches Wörterbuch in eine [pscustomobject]umwandeln, behält PowerShell diese Groß-/Kleinschreibung bei, beachtet jedoch nicht die Groß-/Kleinschreibung. Ergebnis:
- Der Fall des ersten doppelten Schlüssels wird zum Namen dieses Schlüssels.
- Der Wert des letzten Schlüssels mit Groß-/Kleinschreibung wird zum Eigenschaftswert.
Das folgende Beispiel veranschaulicht dieses Verhalten:
$Json = '{
"One": 1,
"two": 2,
"Two": 3,
"three": 3,
"Three": 4,
"THREE": 5
}'
$OrderedHashTable = $Json | ConvertFrom-Json -AsHashTable
$OrderedHashTable
Beachten Sie, dass die sortierte Hashtabelle mehrere Schlüssel enthält, die nur nach Groß-/Kleinschreibung unterschiedlich sind.
Name Value
---- -----
One 1
two 2
Two 3
three 3
Three 4
THREE 5
Wenn diese Hashtabelle in eine [pscustomobject]umwandeln wird, wird der Fall des Namens des ersten Schlüssels verwendet, aber dieser Wert des letzten übereinstimmenden Schlüsselnamens wird verwendet.
[pscustomobject]$OrderedHashTable
One two three
--- --- -----
1 3 5
Hinweise
In Windows PowerShell verfügen Objekte, die durch Umwandlung einer Hashtable- in [pscustomobject] nicht über die Eigenschaften Length oder Count verfügen.
Der Versuch, auf diese Member zuzugreifen, gibt $nullzurück.
Zum Beispiel:
PS> $object = [pscustomobject]@{key = 'value'}
PS> $object
key
---
value
PS> $object.Count
PS> $object.Length
Ab PowerShell 6 verfügen Objekte, die durch Umwandlung einer Hashtable- in [pscustomobject] immer einen Wert von 1 für die eigenschaften Length und Count aufweisen.