Udostępnij za pośrednictwem


Informacje o elementach wewnętrznych

Krótki opis

Zawiera informacje o elementach wewnętrznych programu PowerShell, które są dostępne dla wszystkich obiektów programu PowerShell.

Szczegółowy opis

Po utworzeniu obiektów program PowerShell dodaje kilka "ukrytych" właściwości i metod do każdego obiektu. Te właściwości i metody są znane jako wewnętrzni członkowie. Te wewnętrzne elementy członkowskie są zwykle ukryte przed widokiem. Te ukryte elementy członkowskie można zobaczyć przy użyciu parametru ForceGet-Member.

Widoki obiektów

Wewnętrzni członkowie obejmują zestaw właściwości MemberSet, które reprezentują widok obiektu. Aby uzyskać więcej informacji na temat właściwości MemberSet, zobacz PSMemberSet.

Każdy obiekt programu PowerShell zawiera następujące właściwości.

  • psbase

    Zestaw psbaseMemberSet zawiera członków obiektu podstawowego bez rozszerzenia czy adaptacji. W zależności od typu obiektu jest to wystąpienie .NET opakowane przez instancję [psobject] lub, jeśli nie ma opakowania, jest to sam obiekt wejściowy.

  • psadapted

    Zestaw psadaptedMemberSet pokazuje obiekt podstawowy oraz zaadaptowanych członków, jeśli są obecni. Dostosowane elementy członkowskie są dodawane przez system rozszerzonego typu (ETS).

  • psextended

    Zestaw psextendedMemberSettylko pokazuje elementy członkowskie dodane przez pliki Types.ps1xml oraz add-member polecenia cmdlet. Dowolny obiekt można rozszerzyć w czasie wykonywania przy użyciu polecenia cmdlet Add-Member.

  • psobject

    psobject MemberSet to bogate źródło refleksji dla dowolnego obiektu, zawierającego metody, właściwości i inne informacje o obiekcie.

Przykłady

W tym przykładzie $hash jest tabelą skrótu zawierającą informacje o użytkowniku. Parametr ForceGet-Member pokazuje nam podstawowe składniki obiektu.

$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…

Użycie psobject jest podobne do używania Get-Member, ale zapewnia większą elastyczność. Można na przykład wyliczyć właściwości obiektu i ich wartości.

$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

Porównaj to z obiektem utworzonym przez przekonwertowanie tabeli skrótu na obiekt PSCustomObject.

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

Zwróć uwagę, że klucze z tabeli skrótu zostały przekonwertowane na właściwości w PSCustomObject. Nowe właściwości są teraz częścią 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…

Informacje o typie

pstypenames CodeProperty wyświetla hierarchię typów obiektów w kolejności dziedziczenia. Na przykład:

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

Dane wyjściowe rozpoczynają się od najbardziej specyficznego typu obiektu, System.IO.FileInfo, i przechodzą do najbardziej ogólnego typu, System.Object.

Metody

Program PowerShell dodaje dwie ukryte metody do wszystkich obiektów programu PowerShell. Te metody nie są widoczne przy użyciu polecenia Get-Member -Force lub uzupełniania tabulatorem.

ForEach() i Where()

Metody ForEach() i Where() są dostępne dla wszystkich obiektów programu PowerShell. Są one jednak najbardziej przydatne podczas pracy z kolekcjami. Aby uzyskać więcej informacji na temat używania tych metod, zobacz about_Arrays.

Właściwości

Nie wszystkie typy skalarne mają właściwości Count lub Length w typie podstawowym. Program PowerShell dodaje brakującą właściwość jako element wewnętrzny dla wszystkich typów skalarnych.

Notatka

Niezainicjowane zmienne są niejawnie $null. $null jest skalarna i ma wewnętrzną Count i Length 0.

Chociaż właściwości Count i Length są podobne, mogą działać inaczej w zależności od typu danych. Na przykład długość ciągu to liczba znaków w ciągu. Właściwość Count jest liczbą wystąpień obiektu.

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

Aby uzyskać więcej informacji na temat tych właściwości, zobacz about_Properties.

Typy skalarne indeksowania tablic

Gdy obiekt nie jest indeksowaną kolekcją, użycie operatora indeksu do uzyskania dostępu do pierwszego elementu zwraca sam obiekt. Wartości indeksu wykraczające poza pierwszy element zwracają $null.

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

Aby uzyskać więcej informacji, zobacz about_Operators.

Metoda New() dla typów

Począwszy od programu PowerShell 5.0, program PowerShell dodaje statyczną metodę New() dla wszystkich typów platformy .NET. W poniższych przykładach przedstawiono ten sam wynik.

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

Użycie metody new() działa lepiej niż użycie New-Object.

Aby uzyskać więcej informacji, zobacz about_Classes.