about_PSCustomObject
Kurze Beschreibung
Erläutert die Unterschiede zwischen den [psobject]
Zugriffstasten und [pscustomobject]
den Eingabetasten.
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 New-Object
Sie das Objekt erstellen und Add-Member
Eigenschaften hinzufü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 Property-ParameterNew-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 eine Hashtabelle umwandeln, um dasselbe Ergebnis zu [pscustomobject]
erzielen.
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 Standard die Liste der Member in der Reihenfolge enthalten, in der die Member dem Objekt hinzugefügt wurden. Obwohl Hashtable-Objekte die Reihenfolge der Schlüsselwertpaare nicht garantieren, wird eine Literalhashtable in [pscustomobject]
Standard die Reihenfolge beibehalten.
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]
geben Zugriffstasten an.
Weitere Informationen finden Sie unter about_Type_Accelerators.
Auch wenn Sie denken, dass die [pscustomobject]
Zuordnung zu System.Management.Automation.PSCustomObject erfolgen sollte, unterscheiden sich die Typen.
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 Behandeln der Konvertierung einer Hashtable in einen PSObject-Typ . Dieser zusätzliche Code wird nur aufgerufen, wenn ein neues Objekt erstellt wird.
Daher können Sie den Typkoersions- oder Typvergleich nicht verwenden [pscustomobject]
, da alle Objekte als PSObject-Typen behandelt werden.
Beispielsweise ist die Verwendung des -is
Operators, um zu überprüfen, ob ein von einem Cmdlet zurückgegebenes Objekt identisch mit [pscustomobject]
dem [psobject]
Vergleich ist.
PS> (Get-Item /) -is [pscustomobject]
True
PS> (Get-Item /) -is [psobject]
True
Wenn Sie ein Objekt umwandeln, [psobject]
erhalten Sie den Typ des ursprünglichen Objekts. Daher wird alles andere als eine Hashtable in [pscustomobject]
denselben Typ umzuwandlungen.
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 [psobject]
auf den Typ keine Auswirkungen hat, fügt PowerShell einen 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] True
Der Formatoperator (
-f
) hat kein Array erkannt, das umschlossen ist[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..
Hinweise
In Windows PowerShell verfügen Objekte, die durch Umwandlung einer Hashtable [pscustomobject]
erstellt wurden, nicht über die Eigenschaften "Length" oder "Count".
Der Versuch, auf diese Member zuzugreifen, wird zurückgegeben $null
.
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[pscustomobject]
erstellt wurden, immer über einen Wert 1
für die Eigenschaften "Length" und "Count ".
Weitere Informationen
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für