Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Krátký popis
Vysvětluje rozdíly mezi akcelerátory typu [psobject] a [pscustomobject].
Dlouhý popis
Akcelerátor typů [pscustomobject] 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 pro přidání vlastností. Napří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 vlastnostiNew-Object předat hashtable obsahující členy a hodnoty. Napří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[pscustomobject] dosáhne 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 PSObject typu udržují seznam členů v pořadí, v jakém byly členy přidány do objektu. I když Hashtable objekty nezaručují pořadí párů klíč-hodnota, přetypování literálové hashtable na [pscustomobject] udržuje 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ů jsou mapovány 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 typu [pscustomobject] 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 PSObject typy.
Například pomocí operátoru -is zkontrolujte, že objekt vrácený rutinou je [pscustomobject] je 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áte typ původního objektu. Proto přetypování čehokoli jiného než hashovací[pscustomobject] výsledkem stejného typu.
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 na [psobject] nemá žádný vliv na typ, PowerShell kolem objektu přidá neviditelný[psobject] obálku. To může mít jemné vedlejší účinky.
Zabalené objekty odpovídají původnímu typu a typu
[psobject].PS> 1 -is [int32] True PS> 1 -is [psobject] False PS> ([psobject] 1) -is [int32] True PS> ([psobject] 1) -is [psobject] TrueOperá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ýsledkem je:
- 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
Při přetypování této hashovací tabulky na [pscustomobject]se použije malá a velká 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 hashovací tabulky na [pscustomobject] nemají vlastnosti Délka nebo Počet.
Pokus o přístup k těmto členům vrátí $null.
Napří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 hashovací tabulky [pscustomobject] vždy hodnotu 1 pro vlastnosti Délka a Počet.