Een Windows PowerShell-itemprovider maken

In dit onderwerp wordt beschreven hoe u een Windows PowerShell-provider maakt waarmee de gegevens in een gegevensarchief kunnen worden bewerkt. In dit onderwerp worden de elementen van gegevens in het archief aangeduid als de 'items' van het gegevensarchief. Als gevolg hiervan wordt een provider genoemd die de gegevens in het archief kan bewerken een Windows PowerShell itemprovider.

Notitie

U kunt het C#-bronbestand (AccessDBSampleProvider03.cs) voor deze provider downloaden met behulp van de Microsoft Windows Software Development Kit voor Windows Vista en .NET Framework 3.0 Runtime Components. Zie Windows PowerShell installeren en de Windows PowerShell SDK downloaden voor downloadinstructies. De gedownloade bronbestanden zijn beschikbaar in de PowerShell Samples map. Zie Uw Windows PowerShell-provider ontwerpen voor meer informatie over andere Windows PowerShell providerimplementaties.

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

De Windows PowerShell-itemproviderklasse definiëren

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

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

public class AccessDBProvider : ItemCmdletProvider

Houd er rekening mee dat het kenmerk System.Management.Automation.Provider.CmdletProviderAttribute in deze klassedefinitie twee parameters bevat. Met de eerste parameter wordt een gebruiksvriendelijke naam opgegeven voor de provider die wordt gebruikt door Windows PowerShell. Met de tweede parameter geeft u de Windows PowerShell specifieke mogelijkheden op die de provider beschikbaar maakt voor de Windows PowerShell runtime tijdens het verwerken van opdrachten. Voor deze provider zijn er geen Windows PowerShell specifieke mogelijkheden toegevoegd.

Basisfunctionaliteit definiëren

Zoals beschreven in Uw Windows PowerShell-provider ontwerpen, is de klasse System.Management.Automation.Provider.DriveCmdletProvider afgeleid van verschillende andere klassen die verschillende providerfunctionaliteit bieden. Een Windows PowerShell itemprovider moet daarom alle functionaliteit van deze klassen definiëren.

Zie Een Basic Windows PowerShell Provider maken voor meer informatie over het implementeren van functionaliteit voor het toevoegen van sessiespecifieke initialisatiegegevens en het vrijgeven van resources die door de provider worden gebruikt. De meeste providers, waaronder de provider die hier wordt beschreven, kunnen echter de standaardimplementatie van deze functionaliteit gebruiken die wordt geleverd door Windows PowerShell.

Voordat de Windows PowerShell itemprovider de items in het archief kan bewerken, moet deze de methoden van de basisklasse System.Management.Automation.Provider.DriveCmdletProvider implementeren om toegang te krijgen tot het gegevensarchief. Zie Een Windows PowerShell Drive Provider maken voor meer informatie over het implementeren van deze klasse.

Controleren op padvaliditeit

Wanneer u op zoek bent naar een gegevensitem, maakt de Windows PowerShell runtime een Windows PowerShell pad naar de provider, zoals gedefinieerd in de sectie PSPath-concepten van Hoe Windows PowerShell werkt. Een Windows PowerShell itemprovider moet de syntactische en semantische geldigheid controleren van een pad dat eraan wordt doorgegeven door de methode System.Management.Automation.Provider.ItemCmdletProvider.IsValidPath te implementeren. Deze methode retourneert true als het pad geldig is en false anders. Houd er rekening mee dat de implementatie van deze methode het bestaan van het item op het pad niet mag verifiëren, maar alleen dat het pad syntactisch en semantisch juist is.

Hier volgt de implementatie van de methode System.Management.Automation.Provider.ItemCmdletProvider.IsValidPath voor deze provider. Houd er rekening mee dat deze implementatie een normalizePath-helpermethode aanroept om alle scheidingstekens in het pad te converteren naar een uniform.

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

Nadat het pad is geverifieerd, moet de Windows PowerShell runtime bepalen of er een gegevensitem op dat pad bestaat. Ter ondersteuning van dit type query implementeert de Windows PowerShell itemprovider de methode System.Management.Automation.Provider.ItemCmdletProvider.ItemExists. Deze methode retourneert true een item dat wordt gevonden op het opgegeven pad en false (standaard) anders.

Hier volgt de implementatie van de methode System.Management.Automation.Provider.ItemCmdletProvider.ItemExists voor deze provider. Houd er rekening mee dat met deze methode de helpermethoden PathIsDrive, ChunkPath en GetTable worden aangeroepen en een door de provider gedefinieerd DatabaseTableInfo-object wordt gebruikt.

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 die u moet onthouden over het implementeren van ItemExists

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

Dynamische parameters koppelen aan de Test-Path-cmdlet

Soms vereist de Test-Path cmdlet die System.Management.Automation.Provider.ItemCmdletProvider.ItemExists aanvullende parameters vereist die dynamisch tijdens runtime worden opgegeven. Als u deze dynamische parameters wilt opgeven, moet de Windows PowerShell itemprovider de methode System.Management.Automation.Provider.ItemCmdletProvider.ItemExistsDynamicParameters implementeren. Met deze methode worden de dynamische parameters voor het item opgehaald op het aangegeven pad en wordt een object geretourneerd met eigenschappen en velden met parseringskenmerken die vergelijkbaar zijn met een cmdlet-klasse of een System.Management.Automation.RuntimeDefinedParameterDictionary-object . De Windows PowerShell runtime gebruikt het geretourneerde object om de parameters toe te voegen aan de Test-Path cmdlet.

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

Een item ophalen

Als u een item wilt ophalen, moet de Windows PowerShell itemprovider de methode System.Management.Automation.Provider.ItemCmdletProvider.GetItem overschrijven om aanroepen van de Get-Item cmdlet te ondersteunen. Met deze methode wordt het item geschreven met behulp van de methode System.Management.Automation.Provider.CmdletProvider.WriteItemObject .

Hier volgt de implementatie van de methode System.Management.Automation.Provider.ItemCmdletProvider.GetItem voor deze provider. Houd er rekening mee dat deze methode de helpermethoden GetTable en GetRow gebruikt om items op te halen die tabellen zijn in de Access-database of rijen in een gegevenstabel.

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 die u moet onthouden over het implementeren van GetItem

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

Dynamische parameters koppelen aan de Get-Item-cmdlet

Soms vereist de Get-Item cmdlet aanvullende parameters die dynamisch worden opgegeven tijdens runtime. Als u deze dynamische parameters wilt opgeven, moet de Windows PowerShell itemprovider de methode System.Management.Automation.Provider.ItemCmdletProvider.GetItemDynamicParameters implementeren. Met deze methode worden de dynamische parameters voor het item opgehaald op het aangegeven pad en wordt een object geretourneerd met eigenschappen en velden met parseringskenmerken die vergelijkbaar zijn met een cmdlet-klasse of een System.Management.Automation.RuntimeDefinedParameterDictionary-object . De Windows PowerShell runtime gebruikt het geretourneerde object om de parameters toe te voegen aan de Get-Item cmdlet.

Deze methode wordt niet door deze provider geïmplementeerd. De volgende code is echter de standaardimplementatie van deze methode.

Een item instellen

Als u een item wilt instellen, moet de Windows PowerShell itemprovider de methode System.Management.Automation.Provider.ItemCmdletProvider.SetItem overschrijven om aanroepen van de Set-Item cmdlet te ondersteunen. Met deze methode wordt de waarde van het item op het opgegeven pad ingesteld.

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

Dingen die u moet onthouden over 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 aanvullende parameters die dynamisch worden opgegeven tijdens runtime. Als u deze dynamische parameters wilt opgeven, moet de Windows PowerShell itemprovider de methode System.Management.Automation.Provider.ItemCmdletProvider.SetItemDynamicParameters implementeren. Met deze methode worden de dynamische parameters voor het item opgehaald op het aangegeven pad en wordt een object geretourneerd met eigenschappen en velden met parseringskenmerken die vergelijkbaar zijn met een cmdlet-klasse of een System.Management.Automation.RuntimeDefinedParameterDictionary-object . De Windows PowerShell runtime gebruikt het geretourneerde object om de parameters toe te voegen aan de Set-Item cmdlet.

Deze methode wordt niet door deze provider geïmplementeerd. De volgende code is echter de standaardimplementatie van deze methode.

Een item wissen

Als u een item wilt wissen, implementeert de Windows PowerShell itemprovider de methode System.Management.Automation.Provider.ItemCmdletProvider.ClearItem om aanroepen van de Clear-Item cmdlet te ondersteunen. Met deze methode wordt het gegevensitem op het opgegeven pad gewist.

Deze methode wordt niet door deze provider geïmplementeerd. De volgende code is echter de standaardimplementatie van deze methode.

Dingen die u moet onthouden over het implementeren van ClearItem

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

Dynamische parameters ophalen voor ClearItem

Soms vereist de Clear-Item cmdlet aanvullende parameters die dynamisch worden opgegeven tijdens runtime. Als u deze dynamische parameters wilt opgeven, moet de Windows PowerShell itemprovider de methode System.Management.Automation.Provider.ItemCmdletProvider.ClearItemDynamicParameters implementeren. Met deze methode worden de dynamische parameters voor het item opgehaald op het aangegeven pad en wordt een object geretourneerd met eigenschappen en velden met parseringskenmerken die vergelijkbaar zijn met een cmdlet-klasse of een System.Management.Automation.RuntimeDefinedParameterDictionary-object . De Windows PowerShell runtime gebruikt het geretourneerde object om de parameters toe te voegen aan de Clear-Item cmdlet.

Deze methode wordt niet door deze itemprovider geïmplementeerd. De volgende code is echter de standaardimplementatie van deze methode.

Een standaardactie uitvoeren voor een item

Een Windows PowerShell itemprovider kan de methode System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultAction implementeren ter ondersteuning van aanroepen vanuit de Invoke-Item cmdlet, waardoor de provider een standaardactie kan uitvoeren voor het item op het opgegeven pad. De provider van het bestandssysteem kan bijvoorbeeld deze methode gebruiken om ShellExecute aan te roepen voor een specifiek item.

Deze methode wordt niet door deze provider geïmplementeerd. De volgende code is echter de standaardimplementatie van deze methode.

Dingen die u moet onthouden over het implementeren van InvokeDefaultAction

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

Dynamische parameters ophalen voor InvokeDefaultAction

Soms vereist de Invoke-Item cmdlet aanvullende parameters die dynamisch worden opgegeven tijdens runtime. Als u deze dynamische parameters wilt opgeven, moet de Windows PowerShell itemprovider de methode System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultActionDynamicParameters implementeren. Met deze methode worden de dynamische parameters voor het item opgehaald op het aangegeven pad en wordt een object geretourneerd met eigenschappen en velden met parseringskenmerken die vergelijkbaar zijn met een cmdlet-klasse of een System.Management.Automation.RuntimeDefinedParameterDictionary-object . De Windows PowerShell runtime gebruikt het geretourneerde object om de dynamische parameters toe te voegen aan de Invoke-Item cmdlet.

Deze methode wordt niet door deze itemprovider geïmplementeerd. De volgende code is echter de standaardimplementatie van deze methode.

Helpermethoden en -klassen implementeren

Deze itemprovider implementeert verschillende helpermethoden en -klassen die worden gebruikt door de openbare onderdrukkingsmethoden die zijn gedefinieerd door Windows PowerShell. De code voor deze helpermethoden en -klassen wordt weergegeven in de sectie Codevoorbeeld .

NormalizePath-methode

Deze itemprovider implementeert een NormalizePath-helpermethode om ervoor te zorgen dat het pad een consistente indeling heeft. De opgegeven indeling maakt gebruik van een backslash (\) als scheidingsteken.

PathIsDrive-methode

Deze itemprovider implementeert een PathIsDrive-helpermethode om te bepalen of het opgegeven pad daadwerkelijk de naam van het station is.

Methode ChunkPath

Deze itemprovider implementeert een ChunkPath-helpermethode waarmee het opgegeven pad wordt gesplitst, zodat de provider de afzonderlijke elementen kan identificeren. Hiermee wordt een matrix geretourneerd die bestaat uit de padelementen.

Methode GetTable

Deze itemprovider implementeert de helpermethode GetTables die een DatabaseTableInfo-object retourneert dat informatie vertegenwoordigt over de tabel die is opgegeven in de aanroep.

Methode GetRow

De methode System.Management.Automation.Provider.ItemCmdletProvider.GetItem van deze itemprovider roept de GetRows-helpermethode aan. Met deze helpermethode wordt een DatabaseRowInfo-object opgehaald dat informatie vertegenwoordigt over de opgegeven rij in de tabel.

DatabaseTableInfo-klasse

Deze itemprovider definieert een DatabaseTableInfo-klasse die een verzameling informatie in een gegevenstabel in de database vertegenwoordigt. Deze klasse is vergelijkbaar met de klasse System.IO.Directoryinfo .

De provider van het voorbeelditem definieert een DatabaseTableInfo.GetTables-methode die een verzameling tabelinformatieobjecten retourneert die de tabellen in de database definiëren. Deze methode bevat een try/catch-blok om ervoor te zorgen dat elke databasefout wordt weergegeven als een rij met nul vermeldingen.

DatabaseRowInfo-klasse

Deze itemprovider definieert de Helper-klasse DatabaseRowInfo die een rij in een tabel van de database vertegenwoordigt. Deze klasse is vergelijkbaar met de klasse System.IO.FileInfo .

De voorbeeldprovider definieert een DatabaseRowInfo.GetRows-methode om een verzameling rijgegevensobjecten voor de opgegeven tabel te retourneren. Deze methode bevat een try/catch-blok om uitzonderingen te ondervangen. Eventuele fouten resulteren in geen rijgegevens.

Codevoorbeeld

Zie AccessDbProviderSample03-codevoorbeeld voor volledige voorbeeldcode.

Objecttypen en -opmaak definiëren

Bij het schrijven van een provider kan het nodig zijn om leden toe te voegen aan bestaande objecten of om nieuwe objecten te definiëren. Wanneer u klaar bent, maakt u een bestandstype dat Windows PowerShell kunt gebruiken om de leden van het object en een indelingsbestand te identificeren waarmee wordt gedefinieerd hoe het object wordt weergegeven. Zie Objecttypen en opmaak uitbreiden voor meer informatie.

De Windows PowerShell-provider bouwen

Zie Cmdlets, providers en hosttoepassingen registreren.

De Windows PowerShell-provider testen

Wanneer deze Windows PowerShell itemprovider is geregistreerd bij Windows PowerShell, kunt u alleen de basis- en stationsfunctionaliteit van de provider testen. Als u de manipulatie van items wilt testen, moet u ook containerfunctionaliteit implementeren die wordt beschreven in Het implementeren van een container Windows PowerShell Provider.

Zie ook