Omówienie systemu typu rozszerzonego

Program PowerShell używa obiektu PSObject do rozszerzania typów obiektów na dwa sposoby. Najpierw obiekt PSObject umożliwia wyświetlanie różnych widoków określonych typów obiektów. Jest to określane jako wyświetlanie dostosowanego widoku obiektu. Po drugie obiekt PSObject umożliwia dodawanie elementów członkowskich do istniejącego obiektu. Razem, opakowując istniejący obiekt, nazywany obiektem bazowym, obiekt PSObject udostępnia system typu rozszerzonego (ETS), za pomocą których deweloperzy skryptów i poleceń cmdlet mogą manipulować obiektami .NET w obrębie powłoki.

Problemy z tworzeniem skryptów i polecenia cmdlet

System ETS rozwiązuje dwa podstawowe problemy:

Po pierwsze, niektóre obiekty .NET nie mają zachowania domyślnego niezbędnego do działania jako dane między poleceniami cmdlet.

  • Niektóre obiekty .NET są obiektami "meta" (na przykład: obiektami WMI, obiektami ADO i obiektami XML), których składowe opisują zawarte w nich dane. Jednak w środowisku skryptowym najbardziej interesujące są zawarte dane, a nie ich opisy. System ETS rozwiązuje ten problem, wprowadzając system kart, które dostosowują bazowy obiekt .NET do oczekiwanej domyślnej semantyki.
  • Niektóre elementy członkowskie obiektu .NET są nazwane niespójnie, zapewniają niewystarczający zestaw publicznych elementów członkowskich lub nie zapewniają wystarczających możliwości. System ETS rozwiązuje ten problem, wprowadzając możliwość rozszerzenia obiektu .NET o dodatkowe elementy członkowskie.

Po drugie język skryptów programu PowerShell jest bezwpisywania w tym, że zmienna nie musi być zadeklarowana określonego typu. Oznacza to, że zmienne, które tworzy deweloper skryptu, są z natury bez typu. Jednak system programu PowerShell jest "oparty na typach", ponieważ zależy od posiadania nazwy typu do obsługi podstawowych operacji, takich jak wyprowadzanie wyników lub sortowanie.

W związku z tym deweloper skryptów musi mieć możliwość stanowania typu jednej ze swoich zmiennych i tworzenia własnego zestawu dynamicznie typionych "obiektów", które zawierają właściwości i metody i mogą uczestniczyć w systemie opartym na typach. System ETS rozwiązuje ten problem, udostępniając wspólny obiekt dla języka skryptów, który ma możliwość dynamicznego stanowania typu i dynamicznego dodawania elementów członkowskich.

Zasadniczo system ETS rozwiązuje problem wymieniony wcześniej, podając obiekt PSObject, który stanowi podstawę dostępu do wszystkich obiektów z języka skryptów i zapewnia standardową abstrakcję dla dewelopera polecenia cmdlet.

Deweloperzy polecenia cmdlet

Dla deweloperów polecenia cmdlet system ETS zapewnia następujące wsparcie:

  • Abstrakcje do pracy z obiektami w sposób ogólny przy użyciu obiektu PSObject. System ETS zapewnia również możliwość przechodzenia do szczegółów tych abstrakcji, jeśli jest to wymagane.
  • Mechanizmy tworzenia domyślnego zachowania formatowania, sortowania, serializacji i innych manipulacji systemu ich typu obiektu przy użyciu dobrze znanego zestawu rozszerzonych elementów członkowskich.
  • Środki do wykonywania względem dowolnego obiektu przy użyciu tej samej semantyki co język skryptów przy użyciu obiektu LanguagePrimitives.
  • Oznacza, że dynamicznie "wpisz" tabelę skrótów, aby reszta systemu skutecznie działała na jej tle.

Deweloperzy skryptów

Dla deweloperów skryptów system ETS zapewnia następujące wsparcie:

  • Możliwość odwołania się do dowolnego bazowego typu obiektu przy użyciu tej samej składni ( $a.x ).
  • Możliwość dostępu poza abstrakcją zapewnianą przez obiekt PSObject (na przykład uzyskiwanie dostępu tylko do dostosowanych elementów członkowskich lub uzyskiwanie dostępu do samego obiektu podstawowego).
  • Możliwość definiowania dobrze znanych elementów członkowskich, które kontrolują formatowanie, sortowanie, serializację i inne manipulacje wystąpienia obiektu lub typu.
  • Oznacza, aby nazwać obiekt jako określony typ i w ten sposób kontrolować dziedziczenie jego składowych opartych na typie.
  • Możliwość dodawania, usuwania i modyfikowania rozszerzonych elementów członkowskich.
  • Możliwość manipulowania samym obiektem PSObject, jeśli jest to wymagane.

Klasa PSObject

Obiekt PSObject jest podstawą całego dostępu do obiektu z języka skryptów i zapewnia standardową abstrakcję dla dewelopera polecenia cmdlet. Zawiera obiekt podstawowy (obiekt .NET) i wszystkie elementy członkowskie wystąpienia (elementy członkowskie, w szczególności rozszerzone elementy członkowskie, które znajdują się w konkretnym wystąpieniu obiektu, a niekoniecznie na innych obiektach tego samego typu). W zależności od typu obiektu podstawowego obiekt PSObject może również zapewniać niejawny i jawny dostęp do dostosowanych elementów członkowskich, a także do wszystkich rozszerzonych elementów członkowskich opartych na typach.

Obiekt PSObject zapewnia następujące mechanizmy:

  • Możliwość konstruowania obiektu PSObject z obiektem base lub bez niego.
  • Możliwość dostępu do wszystkich elementów członkowskich każdego skonstruowanego obiektu PSObject za pomocą wspólnego algorytmu wyszukiwania oraz możliwość zastąpienia tego algorytmu w razie potrzeby.
  • Możliwość uzyskania i ustawienia nazw typów skonstruowanych obiektów PSObject, dzięki czemu skrypty i polecenia cmdlet mogą odwoływać się do podobnych obiektów PSObject za pomocą tej samej nazwy typu, niezależnie od typu ich obiektu podstawowego.

How to Construct a PSObject

Na poniższej liście opisano sposoby tworzenia obiektu PSObject:

  • Wywołanie konstruktora .#ctor PSObject powoduje utworzenie nowego obiektu PSObject z obiektem base obiektu PSCustomObject. Obiekt podstawowy tego typu wskazuje, że obiekt PSObject nie ma znaczącego obiektu podstawowego. Jednak obiekt PSObject z tym typem obiektu podstawowego zapewnia tok właściwości, który deweloperzy polecenia cmdlet mogą znaleźć przydatne, dodając członków rozszerzonych.

Deweloperzy mogą również określić nazwę typu obiektu, co umożliwia temu obiektowi udostępnianie jego rozszerzonych elementów członkowskich innym obiektom PSObject o tej samej nazwie typu.

  • Wywołanie konstruktora PSObject .#ctor(System.Object) tworzy nowy obiekt PSObject z obiektem base-object typu System.Object.

    W tym przypadku nazwa-typu dla utworzonego obiektu jest kolekcją hierarchii pochodnej obiektu podstawowego. Na przykład nazwa-typu obiektu PSObject zawierającego obiekt podstawowy ProcessInfo będzie zawierać następujące nazwy:

    • System.Diagnostics.Process
    • System.ComponentModel.Component
    • System.MarshalByRefObject
    • System.Object
  • Wywoływanie psobject . Metoda AsPSObject(System.Object) tworzy nowy obiekt PSObject na podstawie podanego obiektu.

    Jeśli podany obiekt jest typu System.Object, podany obiekt jest używany jako obiekt podstawowy dla nowego obiektu PSObject. Jeśli podany obiekt jest już obiektem PSObject, dostarczony obiekt jest zwracany w stanie, w ile jest.

Elementy członkowskie podstawowe, dostosowane i rozszerzone

Koncepcyjnie system ETS używa następujących terminów, aby pokazać relację między oryginalnymi członkami obiektu podstawowego a członkami dodanymi przez program PowerShell. Aby uzyskać więcej informacji o określonych typach składowych, które są używane przez obiekt PSObject, zobacz klasę PSObject.

Składowe obiektu podstawowego

Jeśli obiekt podstawowy jest określony podczas konstruowania obiektów PSObject, elementy członkowskie obiektu podstawowego są udostępniane za pośrednictwem właściwości Members.

Dostosowane elementy członkowskie

Gdy obiekt podstawowy jest metaobiektem, który zawiera dane w sposób ogólny, którego właściwości "opisują" zawarte w nich dane, system ETS dostosowuje te obiekty do widoku, który umożliwia bezpośredni dostęp do danych za pośrednictwem dostosowanych elementów członkowskich obiektu PSObject. Dostosowane elementy członkowskie i elementy członkowskie obiektu podstawowego są dostępne za pośrednictwem właściwości Members.

Rozszerzone elementy członkowskie

Oprócz elementów członkowskich dostępnych z obiektu podstawowego lub dostosowanych elementów członkowskich utworzonych przez program PowerShell obiekt PSObject może również definiować rozszerzone elementy członkowskie, które rozszerzają oryginalny obiekt podstawowy o dodatkowe informacje przydatne w środowisku skryptowym.

Na przykład wszystkie podstawowe polecenia cmdlet udostępniane przez program PowerShell, takie jak Get-Content i Set-Content cmdlet, mają parametr path. Aby upewnić się, że te polecenia cmdlet i inne polecenia mogą współpracować z obiektami różnych typów, do tych obiektów można dodać członka ścieżki, aby wszystkie informacje były stanowane we wspólny sposób. Ten rozszerzony członek ścieżki zapewnia, że polecenia cmdlet mogą działać dla wszystkich tych typów, nawet jeśli klasa bazowa może nie mieć członka ścieżki.

Dostęp do rozszerzonych elementów członkowskich, dostosowanych elementów członkowskich i elementów członkowskich obiektów podstawowych jest uzyskiwany za pośrednictwem właściwości Members.