Freigeben über


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 verwalten die Liste der Member in der Reihenfolge, in der die Elemente dem Objekt hinzugefügt wurden. Obwohl Hashtable-Objekte die Reihenfolge der Schlüsselwertpaare nicht garantieren, wird eine Literalhashtable in [pscustomobject] die Reihenfolge umgewandt.

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
PSVersion Name     System
--------- ----     ------
4.0       Server30 Server Core

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..
    

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 ein [pscustomobject]Verzeichnis umwandeln, behält PowerShell diese Groß-/Kleinschreibung bei, beachtet jedoch nicht die Groß-/Kleinschreibung. Infolgedessen:

  • 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:

$OrderedHashTable = [System.Collections.Specialized.OrderedDictionary]::new()
$OrderedHashTable['One'] = 1
$OrderedHashTable['TWO'] = 2
$OrderedHashTable['two'] = 3  # case variation
$OrderedHashTable['Three'] = 3
$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

Wenn diese Hashtabelle in ein [pscustomobject]Hashtable umwandeln wird, wird die Groß-/Kleinschreibung des Namens des ersten Schlüssels verwendet, dieser Wert des letzten übereinstimmenden Schlüsselnamens wird jedoch verwendet.

[PSCustomObject]$OrderedHashTable
One TWO Three
--- --- -----
  1   3     3

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