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


Сведения о встроенных элементах

Краткое описание

Предоставляет сведения о встроенных элементах PowerShell, доступных для всех объектов PowerShell.

Подробное описание

При создании объектов PowerShell добавляет некоторые скрытые свойства и методы к каждому объекту. Эти свойства и методы называются встроенными элементами . Эти внутренние члены обычно скрыты от вида. Эти скрытые элементы можно увидеть с помощью параметра Force команды Get-Member.

Представления объектов

Встроенные элементы включают набор свойств MemberSet, представляющих представление объекта. Дополнительные сведения о свойствах MemberSet см. в разделе PSMemberSet .

Каждый объект PowerShell содержит следующие свойства.

  • psbase

    Элемент psbaseMemberSet содержит элементы базового объекта без расширения или адаптации. В зависимости от типа объекта, он либо является .NET экземпляром, обернутым экземпляром [psobject], либо, если нет оболочки, является самим входным объектом.

  • psadapted

    psadapted MemberSet показывает базовый объект плюс адаптированные члены, если они присутствуют. Адаптированные элементы добавляются системой расширенных типов (ETS).

  • psextended

    В MemberSetотображаются только элементы, добавленные файлами Types.ps1xml и командлетом надстройки . Любой объект можно расширить во время выполнения с помощью командлета Add-Member.

  • psobject

    psobject MemberSet богатый источник отражения для любого объекта, включающего методы, свойства и другие сведения об объекте.

Примеры

В этом примере $hash — это хэш-файл, содержащий сведения о пользователе. Параметр ForceGet-Member показывает встроенные элементы объекта.

$hash = @{
    Age  = 33
    Name = 'Bob'
}

$hash | Get-Member -Force -MemberType MemberSet, CodeProperty
   TypeName: System.Collections.Hashtable

Name        MemberType   Definition
----        ----------   ----------
pstypenames CodeProperty System.Collections.ObjectModel.Collection`1[[System.String, System.Private.CoreLib, Version=7…
psadapted   MemberSet    psadapted {Item, IsReadOnly, IsFixedSize, IsSynchronized, Keys, Values, SyncRoot, Count, Add,…
psbase      MemberSet    psbase {Item, IsReadOnly, IsFixedSize, IsSynchronized, Keys, Values, SyncRoot, Count, Add, Cl…
psextended  MemberSet    psextended {}
psobject    MemberSet    psobject {Members, Properties, Methods, ImmediateBaseObject, BaseObject, TypeNames, get_Membe…

Использование psobject аналогично использованию Get-Member, но обеспечивает большую гибкость. Например, можно перечислить свойства объекта и их значения.

$hash.psobject.Properties | Select-Object Name, MemberType, Value
Name           MemberType                    Value
----           ----------                    -----
IsReadOnly       Property                    False
IsFixedSize      Property                    False
IsSynchronized   Property                    False
Keys             Property              {Age, Name}
Values           Property                {33, Bob}
SyncRoot         Property {[Age, 33], [Name, Bob]}
Count            Property                        2

Сравните это с объектом, созданным путем преобразования хэш-файла в PSCustomObject.

$user = [pscustomobject]$hash
$user.psobject.Properties | Select-Object Name, MemberType, Value
Name   MemberType Value
----   ---------- -----
Age  NoteProperty    33
Name NoteProperty   Bob

Обратите внимание, что ключи из хэш-таблицы были преобразованы в свойства в PSCustomObject. Новые свойства теперь являются частью psextendedMemberSet.

$user | Get-Member -Force -MemberType MemberSet, CodeProperty
   TypeName: System.Management.Automation.PSCustomObject

Name        MemberType   Definition
----        ----------   ----------
pstypenames CodeProperty System.Collections.ObjectModel.Collection`1[[System.String, System.Private.CoreLib, Version=7…
psadapted   MemberSet    psadapted {ToString, GetType, Equals, GetHashCode}
psbase      MemberSet    psbase {ToString, GetType, Equals, GetHashCode}
psextended  MemberSet    psextended {Age, Name}
psobject    MemberSet    psobject {Members, Properties, Methods, ImmediateBaseObject, BaseObject, TypeNames, get_Membe…

Сведения о типе

pstypenames CodeProperty перечисляет иерархию типов объектов в порядке наследования. Например:

$file = Get-Item C:\temp\test.txt
$file.pstypenames
System.IO.FileInfo
System.IO.FileSystemInfo
System.MarshalByRefObject
System.Object

Выходные данные начинаются с наиболее конкретного типа объекта, System.IO.FileInfoи продолжаются до наиболее универсального типа, System.Object.

Методика

PowerShell добавляет два скрытых метода ко всем объектам PowerShell. Эти методы не отображаются с помощью команды Get-Member -Force или завершения вкладки.

ForEach() и Where()

Методы ForEach() и Where() доступны для всех объектов PowerShell. Однако они наиболее полезны при работе с коллекциями. Дополнительные сведения об использовании этих методов см. в about_Arrays.

Свойства

Не все скалярные типы имеют свойства Count или Length в базовом типе. PowerShell добавляет отсутствующие свойства в качестве встроенного элемента для всех скалярных типов.

Заметка

Неинициализированные переменные неявно $null. $null является скалярным и имеет встроенные count и Length 0.

Хотя свойства Count и Length похожи, они могут работать по-разному в зависимости от типа данных. Например, длина строки — это количество символов в строке. Свойство Count — это количество экземпляров объекта.

PS> $str = 'string'
PS> $str.Length
6
PS> $str.Count
1

Дополнительные сведения об этих свойствах см. в about_Properties.

Скалярные типы индексирования массивов

Если объект не является индексированной коллекцией, при использовании оператора индекса для доступа к первому элементу возвращается сам объект. Значения индекса за пределами первого элемента возвращают $null.

PS> (2)[0]
2
PS> (2)[-1]
2
PS> (2)[1] -eq $null
True
PS> (2)[0,0] -eq $null
True

Дополнительные сведения см. в разделе about_Operators.

Метод New() для типов

Начиная с PowerShell 5.0, PowerShell добавляет статический New() метод для всех типов .NET. В следующих примерах создается тот же результат.

$expression = New-Object -TypeName regex -ArgumentList 'pattern'
$expression = [regex]::new('pattern')

Использование метода new() работает лучше, чем использование New-Object.

Дополнительные сведения см. в разделе about_Classes.