Delen via


Het aanmaken van een Windows PowerShell-itemprovider

Dit onderwerp beschrijft hoe je een Windows PowerShell-provider kunt maken die de data in een datastore kan manipuleren. In dit onderwerp worden de data-elementen in de opslag aangeduid als de "items" van de datastore. Als gevolg hiervan wordt een provider die de gegevens in de opslag kan manipuleren aangeduid als een Windows PowerShell item provider.

Opmerking

Je kunt het C#-bronbestand (AccessDBSampleProvider03.cs) van deze provider downloaden met behulp van de Microsoft Windows Software Development Kit voor Windows Vista en .NET Framework 3.0 Runtime Components. Voor downloadinstructies, zie Hoe installeer je Windows PowerShell en download de Windows PowerShell SDK. De gedownloade bronbestanden zijn beschikbaar in de PowerShell Samples map. Voor meer informatie over andere implementaties van Windows PowerShell-providers, zie Designing Your Windows PowerShell Provider.

De Windows PowerShell-itemprovider die in dit onderwerp wordt beschreven, haalt gegevens uit een Access-database. In dit geval is een "item" ofwel een tabel in de Access-database of een rij in een tabel.

Het definiëren van de Windows PowerShell item provider-klasse

Een Windows PowerShell-itemprovider moet een .NET-klasse definiëren die is afgeleid van de System.Management.Automation.Provider.ItemCmdletProvider-basisklasse . Hieronder volgt de klassedefinitie voor de itemleverancier die in deze sectie wordt beschreven.

[CmdletProvider("AccessDB", ProviderCapabilities.None)]

public class AccessDBProvider : ItemCmdletProvider

Let op dat in deze klassedefinitie het attribuut System.Management.Automation.Provider.CmdletProviderAttribute twee parameters bevat. De eerste parameter specificeert een gebruiksvriendelijke naam voor de provider die door Windows PowerShell wordt gebruikt. De tweede parameter specificeert de Windows PowerShell-specifieke mogelijkheden die de provider tijdens de commandoverwerking aan de Windows PowerShell-runtime blootstelt. Voor deze provider zijn er geen extra Windows PowerShell-specifieke mogelijkheden.

Basisfunctionaliteit definiëren

Zoals beschreven in Design Your Windows PowerShell Provider, is de klasse System.Management.Automation.Provider.DriveCmdletProvider afgeleid van verschillende andere klassen die verschillende providerfunctionaliteit boden. Een Windows PowerShell-itemprovider moet daarom alle functionaliteit definiëren die door die klassen wordt geleverd.

Voor meer informatie over hoe functionaliteit geïmplementeerd kan worden voor het toevoegen van sessie-specifieke initialisatie-informatie en het vrijgeven van resources die door de provider worden gebruikt, zie Een Basis Windows PowerShell Provider aanmaken. De meeste providers, inclusief de hier beschreven provider, kunnen echter de standaardimplementatie van deze functionaliteit gebruiken die door Windows PowerShell wordt geleverd.

Voordat de Windows PowerShell-itemprovider de items in de opslag kan manipuleren, moet hij de methoden van de System.Management.Automation.Automation.Provider.DriveCmdletProvider basisklasse implementeren om toegang te krijgen tot de datastore. Voor meer informatie over het implementeren van deze klasse, zie Het aanmaken van een Windows PowerShell Drive Provider.

Controle op padvaliditeit

Bij het zoeken naar een data-item levert de Windows PowerShell-runtime een Windows PowerShell-pad naar de provider, zoals gedefinieerd in de sectie "PSPath Concepts" van Hoe Windows PowerShell werkt. Een Windows PowerShell-itemprovider moet de syntactische en semantische geldigheid van elk pad dat aan hem wordt doorgegeven verifiëren door de methode System.Management.Automation.Provider.ItemCmdletProvider.IsValidPath te implementeren. Deze methode geeft terug true als het pad geldig is, en false anders. Wees je ervan bewust dat de implementatie van deze methode niet het bestaan van het item op het pad moet verifiëren, maar alleen dat het pad syntactisch en semantisch correct is.

Hier is de implementatie van de System.Management.Automation.Provider.ItemCmdletProvider.IsValidPath-methode voor deze provider. Let op dat deze implementatie een NormalizePath hulpmethode aanroept om alle scheiders in het pad om te zetten naar een uniforme.

protected override bool IsValidPath(string path)
{
    bool result = true;

    // check if the path is null or empty
    if (String.IsNullOrEmpty(path))
    {
        result = false;
    }

    // convert all separators in the path to a uniform one
    path = NormalizePath(path);

    // split the path into individual chunks
    string[] pathChunks = path.Split(pathSeparator.ToCharArray());

    foreach (string pathChunk in pathChunks)
    {
        if (pathChunk.Length == 0)
        {
            result = false;
        }
    }
    return result;
} // IsValidPath

Bepalen of een item bestaat

Na verificatie van het pad moet de Windows PowerShell-runtime bepalen of er een dataitem op dat pad bestaat. Om dit type query te ondersteunen, implementeert de Windows PowerShell-itemprovider de methode System.Management.Automation.Provider.ItemCmdletProvider.ItemExists . Deze methode geeft een item terug true dat gevonden wordt op het opgegeven pad en false (standaard) anders.

Hier is de implementatie van de System.Management.Automation.Provider.ItemCmdletProvider.ItemExist-methode voor deze provider. Let op dat deze methode de hulpmethoden PathIsDrive, ChunkPath en GetTable aanroept, en gebruikmaakt van een door providers gedefinieerd object DatabaseTableInfo .

protected override bool ItemExists(string path)
{
    // check if the path represented is a drive
    if (PathIsDrive(path))
    {
        return true;
    }

    // Obtain type, table name and row number from path
    string tableName;
    int rowNumber;

    PathType type = GetNamesFromPath(path, out tableName, out rowNumber);

    DatabaseTableInfo table = GetTable(tableName);

    if (type == PathType.Table)
    {
        // if specified path represents a table then DatabaseTableInfo
        // object for the same should exist
        if (table != null)
        {
            return true;
        }
    }
    else if (type == PathType.Row)
    {
        // if specified path represents a row then DatabaseTableInfo should
        // exist for the table and then specified row number must be within
        // the maximum row count in the table
        if (table != null && rowNumber < table.RowCount)
        {
            return true;
        }
    }

    return false;

} // ItemExists

Dingen om te onthouden bij het implementeren van ItemExists

De volgende voorwaarden kunnen van toepassing zijn op uw implementatie van System.Management.Automation.Provider.ItemCmdletProvider.ItemExists:

Dynamische parameters toevoegen aan de Test-Path cmdlet

Soms vereist de Test-Path cmdlet die System.Management.Automation.Provider.ItemCmdletProvider.ItemExists aanroept extra parameters die dynamisch worden gespecificeerd tijdens runtime. Om deze dynamische parameters te bieden, moet de Windows PowerShell-itemprovider de methode System.Management.Automation.Provider.ItemCmdletProvider.ItemExistsDynamicParameters implementeren. Deze methode haalt de dynamische parameters op voor het item op het aangegeven pad en geeft een object terug dat eigenschappen en velden heeft met parsingattributen vergelijkbaar met een cmdlet-klasse of een System.Management.Automation.RuntimeDefinedParameterDictionary-object . De Windows PowerShell-runtime gebruikt het geretourneerde object om de parameters aan de Test-Path cmdlet toe te voegen.

Deze Windows PowerShell-itemprovider implementeert deze methode niet. De volgende code is echter de standaardimplementatie van deze methode.

Een voorwerp terughalen

Om een item op te halen, moet de Windows PowerShell-itemprovider System.Management.Automation.Provider.ItemCmdletProvider.GetItem-methode overschrijven om aanroepen van de Get-Item cmdlet te ondersteunen. Deze methode schrijft het item met de methode System.Management.Automation.Provider.CmdletProvider.WriteItemObject .

Hier is de implementatie van de System.Management.Automation.Provider.ItemCmdletProvider.GetItem-methode voor deze provider. Let op dat deze methode de GetTable en GetRow helper-methoden gebruikt om items op te halen die ofwel tabellen in de Access-database zijn of rijen in een datatabel.

protected override void GetItem(string path)
{
    // check if the path represented is a drive
    if (PathIsDrive(path))
    {
        WriteItemObject(this.PSDriveInfo, path, true);
        return;
    }// if (PathIsDrive...

     // Get table name and row information from the path and do 
     // necessary actions
     string tableName;
     int rowNumber;

     PathType type = GetNamesFromPath(path, out tableName, out rowNumber);

     if (type == PathType.Table)
     {
         DatabaseTableInfo table = GetTable(tableName);
         WriteItemObject(table, path, true);
     }
     else if (type == PathType.Row)
     {
         DatabaseRowInfo row = GetRow(tableName, rowNumber);
         WriteItemObject(row, path, false);
     }
     else
     {
         ThrowTerminatingInvalidPathException(path);
     }

 } // GetItem

Dingen om te onthouden bij het implementeren van GetItem

De volgende voorwaarden kunnen van toepassing zijn op een implementatie van System.Management.Automation.Provider.ItemCmdletProvider.GetItem:

Dynamische parameters toevoegen aan de Get-Item cmdlet

Soms vereist de Get-Item cmdlet extra parameters die dynamisch worden gespecificeerd tijdens runtime. Om deze dynamische parameters te bieden, moet de Windows PowerShell-itemprovider de methode System.Management.Automation.Provider.ItemCmdletProvider.GetItemDynamicParameters implementeren. Deze methode haalt de dynamische parameters op voor het item op het aangegeven pad en geeft een object terug dat eigenschappen en velden heeft met parsingattributen vergelijkbaar met een cmdlet-klasse of een System.Management.Automation.RuntimeDefinedParameterDictionary-object . De Windows PowerShell-runtime gebruikt het geretourneerde object om de parameters aan de Get-Item cmdlet toe te voegen.

Deze aanbieder voert deze methode niet toe. De volgende code is echter de standaardimplementatie van deze methode.

Een voorwerp neerzetten

Om een item in te stellen, moet de Windows PowerShell-itemprovider de methode System.Management.Automation.Provider.ItemCmdletProvider.SetItem overschrijven om aanroepen van de Set-Item cmdlet te ondersteunen. Deze methode stelt de waarde van het item in op het opgegeven pad.

Deze provider biedt geen override voor de System.Management.Automation.Provider.ItemCmdletProvider.SetItem-methode . Het volgende is echter de standaardimplementatie van deze methode.

Dingen om te onthouden bij het implementeren van SetItem

De volgende voorwaarden kunnen van toepassing zijn op uw implementatie van System.Management.Automation.Provider.ItemCmdletProvider.SetItem:

Dynamische parameters ophalen voor SetItem

Soms vereist de Set-Item cmdlet extra parameters die dynamisch worden gespecificeerd tijdens runtime. Om deze dynamische parameters te bieden, moet de Windows PowerShell-itemprovider de methode System.Management.Automation.Provider.ItemCmdletProvider.SetItemDynamicParameters implementeren. Deze methode haalt de dynamische parameters op voor het item op het aangegeven pad en geeft een object terug dat eigenschappen en velden heeft met parsingattributen vergelijkbaar met een cmdlet-klasse of een System.Management.Automation.RuntimeDefinedParameterDictionary-object . De Windows PowerShell-runtime gebruikt het geretourneerde object om de parameters aan de Set-Item cmdlet toe te voegen.

Deze aanbieder voert deze methode niet toe. De volgende code is echter de standaardimplementatie van deze methode.

Een item vrijmaken

Om een item te wissen, implementeert de Windows PowerShell-itemprovider de System.Management.Automation.Provider.ItemCmdletProvider.ClearItem-methode om aanroepen van de Clear-Item cmdlet te ondersteunen. Deze methode verwijdert het data-item op het opgegeven pad.

Deze aanbieder voert deze methode niet toe. De volgende code is echter de standaardimplementatie van deze methode.

Dingen om te onthouden bij het implementeren van ClearItem

De volgende voorwaarden kunnen van toepassing zijn op een implementatie van System.Management.Automation.Provider.ItemCmdletProvider.ClearItem:

Haal dynamische parameters op voor ClearItem

Soms vereist de Clear-Item cmdlet extra parameters die dynamisch worden gespecificeerd tijdens runtime. Om deze dynamische parameters te bieden, moet de Windows PowerShell-itemprovider de System.Management.Automation.Provider.ItemCmdletProvider.ClearItemDynamicParameters-methode implementeren. Deze methode haalt de dynamische parameters op voor het item op het aangegeven pad en geeft een object terug dat eigenschappen en velden heeft met parsingattributen vergelijkbaar met een cmdlet-klasse of een System.Management.Automation.RuntimeDefinedParameterDictionary-object . De Windows PowerShell-runtime gebruikt het geretourneerde object om de parameters aan de Clear-Item cmdlet toe te voegen.

Deze itemprovider implementeert deze methode niet. De volgende code is echter de standaardimplementatie van deze methode.

Een standaardactie uitvoeren voor een item

Een Windows PowerShell-itemprovider kan de System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultAction implementeren om aanroepen van de Invoke-Item cmdlet te ondersteunen, waarmee de provider een standaardactie voor het item op het opgegeven pad kan uitvoeren. Bijvoorbeeld, de FileSystem-provider kan deze methode gebruiken om ShellExecute aan te roepen voor een specifiek item.

Deze aanbieder voert deze methode niet toe. De volgende code is echter de standaardimplementatie van deze methode.

Dingen om te onthouden bij het implementeren van InvokeDefaultAction

De volgende voorwaarden kunnen van toepassing zijn op een implementatie van System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultAction:

Haal dynamische parameters op voor InvokeDefaultAction

Soms vereist de Invoke-Item cmdlet extra parameters die dynamisch worden gespecificeerd tijdens runtime. Om deze dynamische parameters te bieden, moet de Windows PowerShell-itemprovider de methode System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultActionDynamicParameters implementeren. Deze methode haalt de dynamische parameters op voor het item op het aangegeven pad en geeft een object terug dat eigenschappen en velden heeft met parsingattributen vergelijkbaar met een cmdlet-klasse of een System.Management.Automation.RuntimeDefinedParameterDictionary-object . De Windows PowerShell-runtime gebruikt het teruggegeven object om de dynamische parameters aan de Invoke-Item cmdlet toe te voegen.

Deze itemprovider implementeert deze methode niet. De volgende code is echter de standaardimplementatie van deze methode.

Implementatie van hulpmethoden en -klassen

Deze itemprovider implementeert verschillende helper-methoden en -klassen die worden gebruikt door de public override-methoden die door Windows PowerShell zijn gedefinieerd. De code voor deze hulpmethoden en klassen wordt weergegeven in de sectie Codevoorbeeld .

NormalizePath-methode

Deze itemprovider implementeert een NormalizePath-hulpmethode om ervoor te zorgen dat het pad een consistent formaat heeft. Het gespecificeerde formaat gebruikt een backslash (\) als scheiding.

PathIsDrive-methode

Deze itemprovider implementeert een PathIsDrive hulpmethode om te bepalen of het opgegeven pad daadwerkelijk de schijfnaam is.

ChunkPath-methode

Deze itemprovider implementeert een ChunkPath-helpermethode die het opgegeven pad opsplitst zodat de provider zijn individuele elementen kan identificeren. Het geeft een array terug die bestaat uit de padelementen.

GetTable-methode

Deze itemprovider implementeert de GetTables hulpmethode, die een DatabaseTableInfo-object teruggeeft dat informatie over de in de aanroep gespecificeerde tabel vertegenwoordigt.

Methode GetRow

De System.Management.Automation.Provider.ItemCmdletProvider.GetItem-methode van deze itemprovider roept de GetRows-hulpmethode aan. Deze hulpmethode haalt een DatabaseRowInfo-object op dat informatie over de gespecificeerde rij in de tabel weergeeft.

DatabaseTableInfo-klasse

Deze itemprovider definieert een DatabaseTableInfo-klasse die een verzameling informatie in een datatabel in de database vertegenwoordigt. Deze klasse lijkt op de System.IO.Directoryinfo-klasse .

De voorbeelditemprovider definieert een DatabaseTableInfo.GetTabletables-methode die een verzameling tabelinformatieobjecten teruggeeft die de tabellen in de database definiëren. Deze methode bevat een try/catch-blok om ervoor te zorgen dat elke databasefout als een rij zonder vermeldingen wordt weergegeven.

DatabaseRowInfo-klasse

Deze itemprovider definieert de DatabaseRowInfo helperklasse die een rij in een tabel van de database vertegenwoordigt. Deze klasse lijkt op de System.IO.FileInfo-klasse .

De sample provider definieert een DatabaseRowInfo.GetRows-methode om een verzameling rijinformatieobjecten voor de opgegeven tabel terug te geven. Deze methode omvat een try/catch-blok om uitzonderingen te vangen. Eventuele fouten resulteren in geen rij-informatie.

Codevoorbeeld

Voor volledige voorbeeldcode, zie AccessDbProviderSample03 Codevoorbeeld.

Objecttypes en opmaak definiëren

Bij het schrijven van een provider kan het nodig zijn leden toe te voegen aan bestaande objecten of nieuwe objecten te definiëren. Als je klaar bent, maak je een Types-bestand aan dat Windows PowerShell kan gebruiken om de leden van het object te identificeren en een Format-bestand dat definieert hoe het object wordt weergegeven. Voor meer informatie, zie Uitbreiden van Objecttypes en Opmaak.

Het bouwen van de Windows PowerShell-provider

Bekijk hoe u cmdlets, providers en hostapplicaties registreert.

De Windows PowerShell-provider testen

Wanneer deze Windows PowerShell-itemprovider geregistreerd is bij Windows PowerShell, kun je alleen de basis- en schijffunctionaliteit van de provider testen. Om de manipulatie van items te testen, moet je ook containerfunctionaliteit implementeren zoals beschreven in Implementing a Container Windows PowerShell Provider.

Zie ook