about_PSCustomObject
Объясняет различия между [psobject]
акселераторами и [pscustomobject]
типами.
Ускоритель [pscustomobject]
типов добавлен в PowerShell 3.0.
До добавления акселератора типов создание объекта со свойствами и значениями элементов было более сложным. Первоначально необходимо было использовать New-Object
для создания объекта и Add-Member
добавления свойств. Например:
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
Позже можно использовать параметр Property для New-Object
передачи хэш-таблицы , содержащей элементы и значения. Например:
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
Так как PowerShell 3.0 приведение хэш-файла для [pscustomobject]
достижения того же результата.
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 поддерживают список элементов в том порядке, в который были добавлены элементы. Несмотря на то, что хэш-объекты не гарантируют порядок пар "ключ-значение", приведение хэш-указателя литерала для [pscustomobject]
поддержания порядка.
Хэш-файл должен быть литералом. Если вы упаковываете хэш-файл в скобки или приведение переменной, содержащей хэш-файл, не гарантирует сохранение порядка.
$hash = @{
Name = "Server30"
System = "Server Core"
PSVersion = "4.0"
}
$Asset = [pscustomobject]$hash
$Asset
System Name PSVersion
------ ---- ---------
Server Core Server30 4.0
[psobject]
и [pscustomobject]
являются акселераторами типов.
Дополнительные сведения см. в about_Type_Accelerators.
Даже если вы можете подумать, что [pscustomobject]
следует сопоставить с System.Management.Automation.PSCustomObject, типы отличаются.
PS> [pscustomobject] -eq [System.Management.Automation.PSCustomObject]
False
Оба акселератора типов сопоставляются с тем же классом, PSObject:
PS> [pscustomobject]
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True PSObject System.Object
PS> [psobject]
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True PSObject System.Object
[pscustomobject]
При добавлении акселератора типов в PowerShell он включал дополнительный код для обработки преобразования хэш-таблицы в тип PSObject. Этот дополнительный код вызывается только при создании нового объекта.
Поэтому нельзя использовать [pscustomobject]
для сравнения типов или типов, так как все объекты обрабатываются как типы PSObject .
Например, использование -is
оператора для проверки того, что объект, возвращаемый командлетом, совпадает [pscustomobject]
с сравнением [psobject]
объекта.
PS> (Get-Item /) -is [pscustomobject]
True
PS> (Get-Item /) -is [psobject]
True
При приведение любого объекта к [psobject]
типу исходного объекта. Таким образом, приведение чего-либо, отличного от хэш-файла , приводит к [pscustomobject]
тому же типу.
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
Хотя приведение объекта, который[psobject]
, как представляется, не влияет на тип, PowerShell добавляет невидимую [psobject]
оболочку вокруг объекта. Это может иметь тонкие побочные эффекты.
Упакованные объекты соответствуют исходному типу и типу
[psobject]
.PowerShellPS> 1 -is [Int32] True PS> 1 -is [psobject] False PS> ([psobject] 1) -is [Int32] True PS> ([psobject] 1) -is [psobject] True
Оператор формата (
-f
) не распознает массив, завернутый в оболочку[psobject]
.PowerShellPS> '{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..
Словари с учетом регистра могут содержать имена ключей, которые отличаются только по регистру.
При приведение такого словаря в [pscustomobject]
powerShell сохраняет этот случай ключей, но не учитывает регистр. В результате:
- Случай первого дубликата ключа становится именем этого ключа.
- Значение последнего ключа варианта регистра становится значением свойства.
В следующем примере показано следующее поведение:
$Json = '{
"One": 1,
"two": 2,
"Two": 3,
"three": 3,
"Three": 4,
"THREE": 5
}'
$OrderedHashTable = $Json | ConvertFrom-Json -AsHashTable
$OrderedHashTable
Обратите внимание, что упорядоченная хэш-диаграмма содержит несколько ключей, которые отличаются только по регистру.
Name Value
---- -----
One 1
two 2
Two 3
three 3
Three 4
THREE 5
Если этот хэш-файл приведение [pscustomobject]
к объекту, используется регистр имени первого ключа, но используется это значение последнего соответствующего имени ключа.
[PSCustomObject]$OrderedHashTable
One two three
--- --- -----
1 3 5
В Windows PowerShell объекты, созданные путем приведения хэш-файла , не [pscustomobject]
имеют свойств Length или Count .
Попытка получить доступ к этим членам возвращается $null
.
Например:
PS> $object = [PSCustomObject]@{key = 'value'}
PS> $object
key
---
value
PS> $object.Count
PS> $object.Length
Начиная с PowerShell 6 объекты, созданные путем [pscustomobject]
, всегда имеют значение 1
свойств Length и Count.
Отзыв о PowerShell
PowerShell — это проект с открытым исходным кодом. Выберите ссылку, чтобы оставить отзыв: