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
PSVersion Name System
--------- ---- ------
4.0 Server30 Server Core
Общие сведения об акселераторах типов
[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 сохраняет этот случай ключей, но не учитывает регистр. В результате:
- Случай первого дубликата ключа становится именем этого ключа.
- Значение последнего ключа варианта регистра становится значением свойства.
В следующем примере показано следующее поведение:
$OrderedHashTable = [System.Collections.Specialized.OrderedDictionary]::new()
$OrderedHashTable['One'] = 1
$OrderedHashTable['TWO'] = 2
$OrderedHashTable['two'] = 3 # case variation
$OrderedHashTable['Three'] = 3
$OrderedHashTable
Обратите внимание, что упорядоченная хэш-диаграмма содержит несколько ключей, которые отличаются только по регистру.
Name Value
---- -----
One 1
TWO 2
two 3
Three 3
Если этот хэш-файл приведение [pscustomobject]
к объекту, используется регистр имени первого ключа, но используется это значение последнего соответствующего имени ключа.
[PSCustomObject]$OrderedHashTable
One TWO Three
--- --- -----
1 3 3
Примечания.
В 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
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по