Översikt över utökat typsystem

PowerShell använder sitt PSObject-objekt för att utöka objekttyperna på två sätt. Först ger PSObject-objektet ett sätt att visa olika vyer av specifika objekttyper. Detta kallas för att visa en anpassad vy av ett objekt. För det andra ger PSObject-objektet ett sätt att lägga till medlemmar i ett befintligt objekt. Genom att omsluta ett befintligt objekt, som kallas basobjektet, tillhandahåller PSObject-objektet ett utökat typsystem (ETS) som skript- och cmdlet-utvecklare kan använda för att manipulera .NET-objekt i gränssnittet.

Problem med cmdlet- och skriptutveckling

ETS löser två grundläggande problem:

För det första har vissa .NET-objekt inte det standardbeteende som krävs för att fungera som data mellan cmdlets.

  • Vissa .NET-objekt är "metaobjekt" (till exempel WMI-objekt, ADO-objekt och XML-objekt) vars medlemmar beskriver de data som de innehåller. I en skriptmiljö är det dock de inneslutna data som är mest intressanta, inte beskrivningen av inneslutna data. ETS löser det här problemet genom att introducera begreppet kort som anpassar det underliggande .NET-objektet så att det har den förväntade standardsemantiken.
  • Vissa .NET-objektmedlemmar namnges inkonsekvent, tillhandahåller en otillräcklig uppsättning offentliga medlemmar eller ger otillräcklig kapacitet. ETS löser det här problemet genom att introducera möjligheten att utöka .NET-objektet med ytterligare medlemmar.

För det andra är PowerShell-skriptspråket typlöst eftersom en variabel inte behöver deklareras av en viss typ. Det vill säga att variablerna som en skriptutvecklare skapar är av naturen typlösa. PowerShell-systemet är dock "typdrivet" på så sätt att det är beroende av att ha ett typnamn att arbeta mot för grundläggande åtgärder som att mata ut resultat eller sortera.

Därför måste en skriptutvecklare ha möjlighet att ange typen av en av sina variabler och skapa en egen uppsättning dynamiskt typade "objekt" som innehåller egenskaper och metoder och kan delta i det typdrivna systemet. ETS löser det här problemet genom att tillhandahålla ett gemensamt objekt för skriptspråket som har möjlighet att ange sin typ dynamiskt och lägga till medlemmar dynamiskt.

I grunden löser ETS problemet som nämnts tidigare genom att tillhandahålla PSObject-objektet, som fungerar som grund för all objektåtkomst från skriptspråket och tillhandahåller en standardabstrahering för cmdlet-utvecklaren.

Cmdlet-utvecklare

För cmdlet-utvecklare ger ETS följande stöd:

  • Abstraktioner för att arbeta mot objekt på ett allmänt sätt med PSObject-objektet. ETS ger också möjlighet att detaljgranska dessa abstraktioner om det behövs.
  • Mekanismerna för att skapa ett standardbeteende för formatering, sortering, serialisering och andra systemmanipulering av objekttypen med hjälp av en välkänd uppsättning utökade medlemmar.
  • Sättet att arbeta mot alla objekt med samma semantik som skriptspråket med ett LanguagePrimitives-objekt.
  • Innebär att dynamiskt "skriva" en hash-tabell så att resten av systemet kan användas mot den effektivt.

Skriptutvecklare

För skriptutvecklare tillhandahåller ETS följande stöd:

  • Möjligheten att referera till alla underliggande objekttyper med samma syntax ( $a.x ).
  • Möjlighet att komma åt utöver abstraktionen som tillhandahålls av PSObject-objektet (till exempel åtkomst till endast anpassade medlemmar eller åtkomst till själva basobjektet).
  • Möjligheten att definiera välkända medlemmar som styr formatering, sortering, serialisering och andra manipuleringar av en objektinstans eller objekttyp.
  • Innebär att namnge ett objekt som en specifik typ och därmed styra arvet av dess typbaserade medlemmar.
  • Möjlighet att lägga till, ta bort och ändra utökade medlemmar.
  • Möjlighet att ändra själva PSObject-objektet om det behövs.

PSObject-klassen

PSObject-objektet utgör grunden för all objektåtkomst från skriptspråket och tillhandahåller en standardabstrahering för cmdletutvecklaren. Den innehåller ett basobjekt (ett .NET-objekt) och alla instansmedlemmar (medlemmar, särskilt utökade medlemmar, som finns på en viss objektinstans, men inte nödvändigtvis på andra objekt av samma typ). Beroende på typen av basobjekt kan PSObject-objektet också ge implicit och explicit åtkomst till anpassade medlemmar samt alla typbaserade utökade medlemmar.

PSObject-objektet har följande metoder:

  • Möjligheten att konstruera ett PSObject med eller utan ett basobjekt.
  • Möjligheten att komma åt alla medlemmar i varje konstruerat PSObject-objekt via en gemensam sökalgoritm och möjligheten att åsidosätta algoritmen vid behov.
  • Möjligheten att hämta och ange typnamn för de konstruerade PSObject-objekten så att skript och cmdlets kan referera till liknande PSObject-objekt med samma typnamn, oavsett typ av basobjekt.

Så här skapar du ett PSObject

I följande lista beskrivs hur du skapar ett PSObject-objekt:

  • Genom att anropa PSObject .#ctor-konstruktorn skapas ett nytt PSObject-objekt med ett basobjekt för PSCustomObject. Ett basobjekt av den här typen anger att PSObject-objektet inte har något meningsfullt basobjekt. Ett PSObject-objekt med den här typen av basobjekt tillhandahåller dock en egenskapsdetalj som cmdlet-utvecklare kan ha nytta av genom att lägga till extended-members.

Utvecklare kan också ange objekttypens namn, vilket gör att objektet kan dela sina extended-members med andra PSObject-objekt av samma typnamn.

  • Om du anropar PSObject .#ctor(System.Object)-konstruktorn skapas ett nytt PSObject-objekt med ett basobjekt av typen System.Object.

    I det här fallet är typnamnet för det skapade objektet en samling av hierarkin för basobjektet. Till exempel skulle typnamnet för PSObject som innehåller ett ProcessInfo-basobjekt innehålla följande namn:

    • System.Diagnostics.Process
    • System.ComponentModel.Component
    • System.PacketByRefObject
    • System.Object
  • Anropa PSObject . Metoden AsPSObject(System.Object) skapar ett nytt PSObject-objekt baserat på ett an angett objekt.

    Om det angivna objektet är av typen System.Object används det angivna objektet som basobjekt för det nya PSObject-objektet. Om det angivna objektet redan är ett PSObject-objekt returneras det angivna objektet som det är.

Basmedlemmar, anpassade och utökade medlemmar

Konceptuellt använder ETS följande termer för att visa relationen mellan de ursprungliga medlemmarna i basobjektet och de medlemmar som lagts till av PowerShell. Mer information om de specifika typer av medlemmar som används av PSObject-objektet finns i PSObject-klassen.

Basobjektmedlemmar

Om basobjektet anges när PSObject-objekten skapas görs medlemmarna i basobjektet tillgängliga via egenskapen Medlemmar.

Anpassade medlemmar

När ett basobjekt är ett metaobjekt, ett som innehåller data på ett generiskt sätt vars egenskaper "beskriver" deras inneslutna data, anpassar ETS dessa objekt till en vy som ger direkt åtkomst till data via anpassade medlemmar i PSObject-objektet. Anpassade medlemmar och basobjektmedlemmar nås via egenskapen Medlemmar.

Utökade medlemmar

Förutom de medlemmar som görs tillgängliga från basobjektet eller de anpassade medlemmar som skapats av PowerShell, kan ett PSObject också definiera utökade medlemmar som utökar det ursprungliga basobjektet med ytterligare information som är användbar i skriptmiljön.

Till exempel kan alla kärn-cmdlets som tillhandahålls av PowerShell, till exempel Get-Content och Set-Content cmdlets, ta en sökvägsparameter. För att säkerställa att dessa cmdlets och andra kan fungera mot objekt av olika typer kan en Path-medlem läggas till i dessa objekt så att alla uppger sin information på ett gemensamt sätt. Den här utökade Path-medlemmen ser till att cmdletarna kan fungera mot alla dessa typer även om basklassen kanske inte har någon Path-medlem.

Utökade medlemmar, anpassade medlemmar och basobjektmedlemmar nås alla via egenskapen Medlemmar.