Поделиться через


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.

См. также