Een Windows PowerShell-containerprovider maken

In dit onderwerp wordt beschreven hoe u een Windows PowerShell-provider maakt die kan werken in gegevensopslag met meerdere lagen. Voor dit type gegevensopslag bevat het hoogste niveau van de winkel de hoofditems en wordt elk volgend niveau een knooppunt van onderliggende items genoemd. Door de gebruiker toe te staan op deze onderliggende knooppunten te werken, kan een gebruiker hiërarchisch communiceren via het gegevensopslag.

Providers die kunnen werken op gegevensopslag op meerdere niveau worden aangeduid als Windows PowerShell containerproviders. Let er echter op dat een Windows PowerShell containerprovider alleen kan worden gebruikt wanneer er één container (geen geneste containers) met items in staat. Als er geneste containers zijn, moet u een Windows PowerShell implementeren. Zie Creating a Windows PowerShell Navigation Provider (Een Windows PowerShell navigatieprovider) voor meer informatie over het Windows PowerShell van een navigatieprovider.

Notitie

U kunt het C#-bronbestand (AccessDBSampleProvider04.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 How to Install Windows PowerShell and Download the Windows PowerShell SDK voor downloadinstructies. De gedownloade bronbestanden zijn beschikbaar in de <PowerShell Samples> map . Zie Uw Windows PowerShell provider ontwerpen voor meer informatie over andere implementaties van Windows PowerShell-provider.

De Windows PowerShell containerprovider die hier wordt beschreven, definieert de database als één container, met de tabellen en rijen van de database gedefinieerd als items van de container.

Waarschuwing

In dit ontwerp wordt ervan uitgenomen dat er een database is met een veld met de naam-id en dat het type van het veld LongInteger is.

Een containerproviderklasse Windows PowerShell definiëren

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

[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : ContainerCmdletProvider

U ziet dat in deze klassedefinitie het kenmerk System.Management.Automation.Provider.Cmdletproviderattribute twee parameters bevat. De eerste parameter geeft een gebruiksvriendelijke naam op voor de provider die wordt gebruikt door Windows PowerShell. De tweede parameter geeft de Windows PowerShell specifieke mogelijkheden die de provider voor de Windows PowerShell tijdens de verwerking van de opdracht. Voor deze provider zijn er geen Windows PowerShell specifieke mogelijkheden die worden toegevoegd.

Basisfunctionaliteit definiëren

Zoals beschreven in Uw Windows PowerShell-providerontwerpen, is de klasse System.Management.Automation.Provider.Containercmdletprovider afgeleid van verschillende andere klassen die verschillende providerfunctionaliteit bieden. Een Windows PowerShell containerprovider moet daarom alle functionaliteit definiëren die door deze klassen wordt geboden.

Zie Creating a Basic Windows PowerShell Provider voor het implementeren van functionaliteit voor het toevoegen van sessiespecifieke initialisatiegegevens envoor het vrijgeven van resources die worden gebruikt door de provider. De meeste providers (inclusief de provider die hier wordt beschreven) kunnen echter gebruikmaken van de standaard implementatie van deze functionaliteit die wordt geleverd door Windows PowerShell.

Om toegang te krijgen tot het gegevensopslag, moet de provider de methoden van de basisklasse System.Management.Automation.Provider.Drivecmdletprovider implementeren. Zie voor meer informatie over het implementeren van deze methoden maken van een Windows PowerShell Station Provider.

Als u de items van een gegevensopslag wilt bewerken, zoals het verkrijgen, instellen en wissen van items, moet de provider de methoden implementeren die worden geleverd door de basisklasse System.Management.Automation.Provider.Itemcmdletprovider. Zie Creating an Windows PowerShell Item Provider (Een provider voor Windows PowerShell maken) voor meer informatie over het implementeren van deze methoden.

Onderliggende items ophalen

Als u een onderliggend item wilt ophalen, moet de Windows PowerShell-containerprovider de methode System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* overschrijven om aanroepen van de Get-ChildItem cmdlet te ondersteunen. Met deze methode worden onderliggende items opgehaald uit het gegevensopslag en als objecten naar de pijplijn schrijft. Als de parameter van de cmdlet is opgegeven, worden met de methode alle kinderen opgehaald, recurse ongeacht het niveau waarop ze zich in. Als de recurse parameter niet is opgegeven, haalt de methode slechts één niveau van kinderen op.

Hier is de implementatie van de methode System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* voor deze provider. U ziet dat met deze methode de onderliggende items in alle databasetabellen worden opgehaald wanneer het pad de Access-database aangeeft, en dat de onderliggende items worden opgehaald uit de rijen van die tabel als het pad een gegevenstabel aangeeft.

protected override void GetChildItems(string path, bool recurse)
{
    // If path represented is a drive then the children in the path are 
    // tables. Hence all tables in the drive represented will have to be
    // returned
    if (PathIsDrive(path))
    {
        foreach (DatabaseTableInfo table in GetTables())
        {
            WriteItemObject(table, path, true);

            // if the specified item exists and recurse has been set then 
            // all child items within it have to be obtained as well
            if (ItemExists(path) && recurse)
            {
                GetChildItems(path + pathSeparator + table.Name, recurse);
            }
        } // foreach (DatabaseTableInfo...
    } // if (PathIsDrive...
    else
    {
        // Get the table name, row number and type of path from the
        // path specified
        string tableName;
        int rowNumber;

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

        if (type == PathType.Table)
        {
            // Obtain all the rows within the table
            foreach (DatabaseRowInfo row in GetRows(tableName))
            {
                WriteItemObject(row, path + pathSeparator + row.RowNumber,
                        false);
            } // foreach (DatabaseRowInfo...
        }
        else if (type == PathType.Row)
        {
            // In this case the user has directly specified a row, hence
            // just give that particular row
            DatabaseRowInfo row = GetRow(tableName, rowNumber);
            WriteItemObject(row, path + pathSeparator + row.RowNumber,
                        false);
        }
        else
        {
            // In this case, the path specified is not valid
            ThrowTerminatingInvalidPathException(path);
        }
    } // else
} // GetChildItems

Dingen die u moet onthouden over het implementeren van GetChildItems

De volgende voorwaarden kunnen van toepassing zijn op uw implementatie van System.Management.Automation.Provider.Containercmdletprovider.Getchilditems*:

Dynamische parameters koppelen aan de Get-ChildItem cmdlet

Soms zijn voor Get-ChildItem de cmdlet die System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* aanroept, aanvullende parameters vereist die tijdens runtime dynamisch worden opgegeven. Om deze dynamische parameters op te geven, moet Windows PowerShell containerprovider de methode System.Management.Automation.Provider.Containercmdletprovider.Getchilditemsdynamicparameters* implementeren. Deze methode haalt dynamische parameters op voor het item op het aangegeven pad en retourneert een object met eigenschappen en velden met parseerkenmerken 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-ChildItem cmdlet .

Deze Windows PowerShell containerprovider implementeert deze methode niet. De volgende code is echter de standaard implementatie van deze methode.

Namen van onderliggende items ophalen

Als u de namen van onderliggende items wilt ophalen, moet de Windows PowerShell-containerprovider de methode System.Management.Automation.Provider.Containercmdletprovider.Getchildnames* overschrijven om aanroepen van de cmdlet te ondersteunen wanneer de Get-ChildItem parameter wordt Name opgegeven. Met deze methode worden de namen opgehaald van de onderliggende items voor het opgegeven pad of de namen van onderliggende items voor alle containers als de parameter van de returnAllContainers cmdlet is opgegeven. Een onderliggende naam is het bladgedeelte van een pad. De onderliggende naam voor het pad c:\windows\system32\abc.dll is bijvoorbeeld 'abc.dll'. De onderliggende naam voor de map c:\windows\system32 is system32.

Hier is de implementatie van de methode System.Management.Automation.Provider.Containercmdletprovider.Getchildnames* voor deze provider. U ziet dat met de methode tabelnamen worden opgehaald als het opgegeven pad de Access-database (station) en rijnummers aangeeft als het pad een tabel aangeeft.

protected override void GetChildNames(string path,
                              ReturnContainers returnContainers)
{
    // If the path represented is a drive, then the child items are
    // tables. get the names of all the tables in the drive.
    if (PathIsDrive(path))
    {
        foreach (DatabaseTableInfo table in GetTables())
        {
            WriteItemObject(table.Name, path, true);
        } // foreach (DatabaseTableInfo...
    } // if (PathIsDrive...
    else
    {
        // Get type, table name and row number from path specified
        string tableName;
        int rowNumber;

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

        if (type == PathType.Table)
        {
            // Get all the rows in the table and then write out the 
            // row numbers.
            foreach (DatabaseRowInfo row in GetRows(tableName))
            {
                WriteItemObject(row.RowNumber, path, false);
            } // foreach (DatabaseRowInfo...
        }
        else if (type == PathType.Row)
        {
            // In this case the user has directly specified a row, hence
            // just give that particular row
            DatabaseRowInfo row = GetRow(tableName, rowNumber);

            WriteItemObject(row.RowNumber, path, false);
        }
        else
        {
            ThrowTerminatingInvalidPathException(path);
        }
    } // else
} // GetChildNames

Dingen die u moet onthouden over het implementeren van GetChildNames

De volgende voorwaarden kunnen van toepassing zijn op uw implementatie van System.Management.Automation.Provider.Containercmdletprovider.Getchilditems*:

Dynamische parameters koppelen aan de Get-ChildItem cmdlet (naam)

Soms vereist Get-ChildItem de cmdlet (met de Name parameter) extra parameters die dynamisch zijn opgegeven tijdens runtime. Om deze dynamische parameters op te geven, moet Windows PowerShell containerprovider de methode System.Management.Automation.Provider.Containercmdletprovider.Getchildnamesdynamicparameters* implementeren. Deze methode haalt de dynamische parameters voor het item op het aangegeven pad op en retourneert een object met eigenschappen en velden met parseerkenmerken 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-ChildItem cmdlet .

Deze provider implementeert deze methode niet. De volgende code is echter de standaard implementatie van deze methode.

De naam van items wijzigen

Als u de naam van een item wilt wijzigen, moet een Windows PowerShell-containerprovider de methode System.Management.Automation.Provider.Containercmdletprovider.Renameitem* overschrijven om aanroepen van de Rename-Item cmdlet te ondersteunen. Met deze methode wordt de naam van het item op het opgegeven pad gewijzigd in de opgegeven nieuwe naam. De nieuwe naam moet altijd relatief zijn ten opzichte van het bovenliggende item (container).

Deze provider overschrijven niet de methode System.Management.Automation.Provider.Containercmdletprovider.Renameitem*. Het volgende is echter de standaard implementatie.

Dingen die u moet onthouden over het implementeren van RenameItem

De volgende voorwaarden kunnen van toepassing zijn op uw implementatie van System.Management.Automation.Provider.Containercmdletprovider.Renameitem*:

Dynamische parameters koppelen aan de Rename-Item cmdlet

Soms vereist Rename-Item de cmdlet aanvullende parameters die dynamisch worden opgegeven tijdens runtime. Als u deze dynamische parameters wilt opgeven, Windows PowerShell containerprovider de methode System.Management.Automation.Provider.Containercmdletprovider.Renameitemdynamicparameters* implementeren. Deze methode haalt de parameters voor het item op het aangegeven pad op en retourneert een object met eigenschappen en velden met parseerkenmerken 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 Rename-Item cmdlet .

Deze containerprovider implementeert deze methode niet. De volgende code is echter de standaard implementatie van deze methode.

Nieuwe items maken

Als u nieuwe items wilt maken, moet een containerprovider de methode System.Management.Automation.Provider.Containercmdletprovider.Newitem* implementeren om aanroepen van de New-Item cmdlet te ondersteunen. Met deze methode maakt u een gegevensitem dat zich op het opgegeven pad bevindt. De type parameter van de cmdlet bevat het door de provider gedefinieerde type voor het nieuwe item. De FileSystem-provider gebruikt bijvoorbeeld een type parameter met de waarde 'bestand' of 'map'. De newItemValue parameter van de cmdlet geeft een providerspecifieke waarde op voor het nieuwe item.

Hier is de implementatie van de methode System.Management.Automation.Provider.Containercmdletprovider.Newitem* voor deze provider.

protected override void NewItem( string path, string type, object newItemValue )
{
    // Create the new item here after
    // performing necessary validations
    //
    // WriteItemObject(newItemValue, path, false);

    // Example
    //
    // if (ShouldProcess(path, "new item"))
    // {
    //      // Create a new item and then call WriteObject
    //      WriteObject(newItemValue, path, false);
    // }

} // NewItem
{
    case 1:
        {
            string name = pathChunks[0];

            if (TableNameIsValid(name))
            {
                tableName = name;
                retVal = PathType.Table;
            }
        }
        break;

    case 2:
        {
            string name = pathChunks[0];

Dingen om te onthouden over het implementeren van NewItem

De volgende voorwaarden kunnen van toepassing zijn op uw implementatie van System.Management.Automation.Provider.Containercmdletprovider.Newitem*:

Dynamische parameters koppelen aan de New-Item cmdlet

Soms vereist New-Item de cmdlet aanvullende parameters die dynamisch worden opgegeven tijdens runtime. Om deze dynamische parameters op te geven, moet de containerprovider de methode System.Management.Automation.Provider.Containercmdletprovider.Newitemdynamicparameters* implementeren. Deze methode haalt de parameters voor het item op het aangegeven pad op en retourneert een object met eigenschappen en velden met parseerkenmerken 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 New-Item cmdlet .

Deze provider implementeert deze methode niet. De volgende code is echter de standaard implementatie van deze methode.

Items verwijderen

Als u items wilt verwijderen, moet de Windows PowerShell-provider de methode System.Management.Automation.Provider.Containercmdletprovider.Removeitem* overschrijven om aanroepen van de Remove-Item cmdlet te ondersteunen. Met deze methode verwijdert u een item uit het gegevensopslag op het opgegeven pad. Als de parameter van de cmdlet is ingesteld op , verwijdert de methode alle onderliggende recurse Remove-Item true items, ongeacht hun niveau. Als de parameter is ingesteld op , verwijdert de methode slechts false één item op het opgegeven pad.

Deze provider biedt geen ondersteuning voor het verwijderen van items. De volgende code is echter de standaard implementatie van System.Management.Automation.Provider.Containercmdletprovider.Removeitem*.

Dingen om te onthouden over het implementeren van RemoveItem

De volgende voorwaarden kunnen van toepassing zijn op uw implementatie van System.Management.Automation.Provider.Containercmdletprovider.Newitem*:

Dynamische parameters koppelen aan de Remove-Item cmdlet

Soms vereist Remove-Item de cmdlet aanvullende parameters die dynamisch worden opgegeven tijdens runtime. Om deze dynamische parameters op te geven, moet de containerprovider de methode System.Management.Automation.Provider.Containercmdletprovider.Removeitemdynamicparameters* implementeren om deze parameters te verwerken. Deze methode haalt de dynamische parameters voor het item op het aangegeven pad op en retourneert een object met eigenschappen en velden met parseerkenmerken 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 Remove-Item cmdlet .

Deze containerprovider implementeert deze methode niet. De volgende code is echter de standaard implementatie van System.Management.Automation.Provider.Containercmdletprovider.Removeitemdynamicparameters*.

Query's uitvoeren op onderliggende items

Als u wilt controleren of er onderliggende items bestaan op het opgegeven pad, moet de Windows PowerShell-containerprovider de methode System.Management.Automation.Provider.Containercmdletprovider.Haschilditems* overschrijven. Deze methode retourneert true als het item children heeft, en false anders. Voor een null- of leeg pad beschouwt de methode alle items in het gegevensopslag als children en retourneert true .

Hier is de overschrijvingen voor de methode System.Management.Automation.Provider.Containercmdletprovider.Haschilditems*. Als er meer dan twee padonderdelen zijn gemaakt met de Help-methode ChunkPath, retourneert de methode , omdat alleen een databasecontainer en een false tabelcontainer zijn gedefinieerd. Zie De ChunkPath-methode wordt besproken in Creating a Windows PowerShell Item Provider (Een service-itemprovider maken) voor meer informatie over deze helpermethode.

protected override bool HasChildItems( string path )
{
    return false;
} // HasChildItems
        ErrorCategory.InvalidOperation, tableName));
}

return results;

Dingen om te onthouden over het implementeren van HasChildItems

De volgende voorwaarden kunnen van toepassing zijn op uw implementatie van System.Management.Automation.Provider.Containercmdletprovider.Haschilditems*:

Items kopiëren

Als u items wilt kopiëren, moet de containerprovider de methode System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem implementeren om aanroepen van de Copy-Item cmdlet te ondersteunen. Met deze methode wordt een gegevensitem gekopieerd van de locatie die wordt aangegeven door de parameter van de cmdlet naar de path locatie die wordt aangegeven door de parameter copyPath . Als de recurse parameter is opgegeven, kopieert de methode alle subcontainers. Als de parameter niet is opgegeven, kopieert de methode slechts één niveau van items.

Deze provider implementeert deze methode niet. De volgende code is echter de standaard implementatie van System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem.

Dingen om te onthouden over het implementeren van CopyItem

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

Dynamische parameters koppelen aan de Copy-Item cmdlet

Soms vereist Copy-Item de cmdlet aanvullende parameters die dynamisch worden opgegeven tijdens runtime. Om deze dynamische parameters op te geven, moet de Windows PowerShell containerprovider de methode System.Management.Automation.Provider.Containercmdletprovider.Copyitemdynamicparameters* implementeren om deze parameters te verwerken. Deze methode haalt de parameters voor het item op het aangegeven pad op en retourneert een object met eigenschappen en velden met parseerkenmerken 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 Copy-Item cmdlet .

Deze provider implementeert deze methode niet. De volgende code is echter de standaard implementatie van System.Management.Automation.Provider.Containercmdletprovider.Copyitemdynamicparameters*.

Codevoorbeeld

Zie AccessDbProviderSample04-codevoorbeeld voor de volledige voorbeeldcode.

De Windows PowerShell-provider bouwen

Zie Cmdlets, providers en hosttoepassingen registreren.

De Windows PowerShell-provider testen

Wanneer uw Windows PowerShell-provider is geregistreerd bij Windows PowerShell, kunt u deze testen door de ondersteunde cmdlets uit te voeren op de opdrachtregel. In de volgende voorbeelduitvoer wordt een fictieve Access-database gebruikt.

  1. Voer de Get-ChildItem cmdlet uit om de lijst met onderliggende items op te halen uit een tabel Klanten in de Access-database.

    Get-ChildItem mydb:customers
    

    De volgende uitvoer wordt weergegeven.

    PSPath        : AccessDB::customers
    PSDrive       : mydb
    PSProvider    : System.Management.Automation.ProviderInfo
    PSIsContainer : True
    Data          : System.Data.DataRow
    Name          : Customers
    RowCount      : 91
    Columns       :
    
  2. Voer de Get-ChildItem cmdlet opnieuw uit om de gegevens van een tabel op te halen.

    (Get-ChildItem mydb:customers).data
    

    De volgende uitvoer wordt weergegeven.

    TABLE_CAT   : c:\PS\northwind
    TABLE_SCHEM :
    TABLE_NAME  : Customers
    TABLE_TYPE  : TABLE
    REMARKS     :
    
  3. Gebruik nu de Get-Item cmdlet om de items op rij 0 in de gegevenstabel op te halen.

    Get-Item mydb:\customers\0
    

    De volgende uitvoer wordt weergegeven.

    PSPath        : AccessDB::customers\0
    PSDrive       : mydb
    PSProvider    : System.Management.Automation.ProviderInfo
    PSIsContainer : False
    Data          : System.Data.DataRow
    RowNumber     : 0
    
  4. Gebruik Get-Item opnieuw om de gegevens voor de items in rij 0 op te halen.

    (Get-Item mydb:\customers\0).data
    

    De volgende uitvoer wordt weergegeven.

    CustomerID   : 1234
    CompanyName  : Fabrikam
    ContactName  : Eric Gruber
    ContactTitle : President
    Address      : 4567 Main Street
    City         : Buffalo
    Region       : NY
    PostalCode   : 98052
    Country      : USA
    Phone        : (425) 555-0100
    Fax          : (425) 555-0101
    
  5. Gebruik nu de New-Item cmdlet om een rij toe te voegen aan een bestaande tabel. De parameter geeft het volledige pad naar de rij aan en moet een rijnummer aangeven dat groter is dan het bestaande aantal rijen Path in de tabel. De Type parameter geeft 'rij' aan om dat type item op te geven dat moet worden toevoegen. Ten slotte geeft de parameter een door komma's scheidingstekens lijst met Value kolomwaarden voor de rij op.

    New-Item -Path mydb:\Customers\3 -ItemType "row" -Value "3,CustomerFirstName,CustomerLastName,CustomerEmailAddress,CustomerTitle,CustomerCompany,CustomerPhone, CustomerAddress,CustomerCity,CustomerState,CustomerZip,CustomerCountry"
    
  6. Controleer als volgt de juistheid van de nieuwe itembewerking.

    PS mydb:\> cd Customers
    PS mydb:\Customers> (Get-Item 3).data
    

    De volgende uitvoer wordt weergegeven.

    ID        : 3
    FirstName : Eric
    LastName  : Gruber
    Email     : ericgruber@fabrikam.com
    Title     : President
    Company   : Fabrikam
    WorkPhone : (425) 555-0100
    Address   : 4567 Main Street
    City      : Buffalo
    State     : NY
    Zip       : 98052
    Country   : USA
    

Zie ook

Windows PowerShell-providers maken

Uw Windows PowerShell-provider ontwerpen

Een itemprovider Windows PowerShell implementeren

Een navigatieprovider Windows PowerShell implementeren

Cmdlets, providers en hosttoepassingen registreren

Windows PowerShell SDK

Handleiding voor Windows PowerShell-programmeurs