Sdílet prostřednictvím


about_PSCustomObject

Krátký popis

Vysvětluje rozdíly mezi [psobject] akcelerátory typů a [pscustomobject] akcelerátory typů.

Dlouhý popis

Akcelerátor [pscustomobject] typů byl přidán v PowerShellu 3.0.

Před přidáním tohoto akcelerátoru typů bylo vytvoření objektu s vlastnostmi člena a hodnotami složitější. Původně jste museli použít New-Object k vytvoření objektu a Add-Member přidání vlastností. Příklad:

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

Později můžete pomocí parametru předat New-Object obsahující členy a hodnoty. Příklad:

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

Vzhledem k tomu, že PowerShell 3.0 přetypuje hashtable , aby [pscustomobject] dosáhl stejného výsledku.

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

Objekty typu PSObject udržují seznam členů v pořadí, v jakém byly členy přidány do objektu. I když objekty Hashtable nezaručují pořadí párů klíč-hodnota, přetypování literálové hashtable pro [pscustomobject] zachování pořadí.

Hashtable musí být literál. Pokud zabalíte hashovací tabulku do závorek nebo pokud přetypujete proměnnou obsahující hashtable, neexistuje žádná záruka, že pořadí zůstane zachováno.

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

Principy akcelerátorů typů

[psobject] a [pscustomobject] jsou akcelerátory typů.

Další informace najdete v tématu about_Type_Accelerators.

I když si možná myslíte, že [pscustomobject] by se měly mapovat na System.Management.Automation.PSCustomObject, typy se liší.

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

Oba akcelerátory typů se mapují na stejnou třídu, PSObject:

PS> [pscustomobject]

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

PS> [psobject]

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

Při přidání akcelerátoru [pscustomobject] typů do PowerShellu obsahoval další kód pro zpracování převodu hashtable na typ PSObject . Tento dodatečný kód se vyvolá pouze při vytváření nového objektu. Proto nelze použít [pscustomobject] pro převod typů nebo porovnání typů, protože všechny objekty jsou považovány za typy PSObject .

Například pomocí operátoru -is zkontrolujte, že objekt vrácený rutinou je [pscustomobject] stejný jako porovnání s [psobject].

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

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

Při přetypování libovolného objektu na [psobject] získání typu původního objektu. Proto přetypování čehokoli jiného než hashovací tabulky , aby [pscustomobject] výsledkem byl stejný typ.

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

I když se zdá, že přetypování objektu [psobject] nemá žádný vliv na typ, PowerShell kolem objektu přidá neviditelnou [psobject] obálku. To může mít jemné vedlejší účinky.

  • Zabalené objekty odpovídají jejich původnímu [psobject] typu a typu.

    PS> 1 -is [int32]
    True
    PS> 1 -is [psobject]
    False
    PS> ([psobject] 1) -is [int32]
    True
    PS> ([psobject] 1) -is [psobject]
    True
    
  • Operátor formátu (-f) nerozpoznal pole zabalené .[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..
    

Převod hashovatelných tabulek obsahujících podobné klíče

Slovníky rozlišující malá a velká písmena můžou obsahovat názvy klíčů, které se liší jenom v jednotlivých případech. Když takový slovník přetypujete na [pscustomobject], PowerShell zachová tento případ klíčů, ale nerozlišuje malá a velká písmena. Výsledek:

  • Případ prvního duplicitního klíče se změní na název tohoto klíče.
  • Hodnota posledního klíče varianty případu se stane hodnotou vlastnosti.

Následující příklad ukazuje toto chování:

$Json = '{
  "One": 1,
  "two": 2,
  "Two": 3,
  "three": 3,
  "Three": 4,
  "THREE": 5
}'
$OrderedHashTable = $Json | ConvertFrom-Json -AsHashTable
$OrderedHashTable

Všimněte si, že uspořádaná hashovatelná tabulka obsahuje více klíčů, které se liší pouze v jednotlivých případech.

Name                           Value
----                           -----
One                            1
two                            2
Two                            3
three                          3
Three                          4
THREE                          5

Pokud je tato hashovací tabulka přetypována na hodnotu [pscustomobject], použije se velká a malá písmena názvu prvního klíče, ale použije se tato hodnota posledního odpovídajícího názvu klíče.

[pscustomobject]$OrderedHashTable
One two three
--- --- -----
  1   3     5

Poznámky

Ve Windows PowerShellu objekty vytvořené přetypováním hashtable[pscustomobject] nemají vlastnosti Délka nebo Počet . Při pokusu o přístup k těmto členům se vrátí $null.

Příklad:

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

key
---
value

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

Počínaje PowerShellem 6 mají objekty vytvořené přetypováním hashtable[pscustomobject] vždy hodnotu 1 pro vlastnosti Length a Count .

Viz také