Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Краткое описание
Объясняет различия между [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].PS> 1 -is [int32] True PS> 1 -is [psobject] False PS> ([psobject] 1) -is [int32] True PS> ([psobject] 1) -is [psobject] TrueОператор формата (
-f) не распознает массив, завернутый в оболочку[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..
Преобразование хэш-элементов, содержащих аналогичные ключи
Словари с учетом регистра могут содержать имена ключей, которые отличаются только по регистру.
При приведение такого словаря в [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 и Count.
См. также
PowerShell