Skapa en Windows PowerShell-produktleverantör

Detta ämne beskriver hur man skapar en Windows PowerShell-leverantör som kan manipulera data i en datalagring. I detta ämne kallas dataelementen i lagringen för "objekten" i datamagasinet. Som en följd kallas en leverantör som kan manipulera data i lagret för en Windows PowerShell-produktleverantör.

Anmärkning

Du kan ladda ner C#-källfilen (AccessDBSampleProvider03.cs) för denna leverantör med Microsoft Windows Software Development Kit för Windows Vista och .NET Framework 3.0 Runtime Components. För nedladdningsinstruktioner, se Hur man installerar Windows PowerShell och laddar ner Windows PowerShell SDK. De nedladdade källfilerna finns tillgängliga i katalogen PowerShell Samples . För mer information om andra implementeringar av Windows PowerShell-leverantörer, se Designing Your Windows PowerShell Provider.

Windows PowerShell-produktleverantören som beskrivs i detta ämne hämtar data från en Access-databas. I detta fall är ett "objekt" antingen en tabell i Access-databasen eller en rad i en tabell.

Definiera Windows PowerShell item provider-klassen

En Windows PowerShell-itemleverantör måste definiera en .NET-klass som härstammar från Basklassen System.Management.Automation.Provider.ItemCmdletProvider . Följande är klassdefinitionen för den föremålsleverantör som beskrivs i detta avsnitt.

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

public class AccessDBProvider : ItemCmdletProvider

Observera att i denna klassdefinition innehåller attributet System.Management.Automation.Provider.CmdletProviderAttribute två parametrar. Den första parametern specificerar ett användarvänligt namn för leverantören som används av Windows PowerShell. Den andra parametern specificerar de Windows PowerShell-specifika funktioner som leverantören exponerar för Windows PowerShell-runtime under kommandobearbetningen. För denna leverantör finns inga extra Windows PowerShell-specifika funktioner.

Definiera basfunktionalitet

Som beskrivs i Design Your Windows PowerShell Provider härstammar klassen System.Management.Automation.Provider.DriveCmdletProvider från flera andra klasser som erbjöd olika funktionalitet för leverantörer. En Windows PowerShell-produktleverantör måste därför definiera all funktionalitet som tillhandahålls av dessa klasser.

För mer information om hur man implementerar funktionalitet för att lägga till sessionsspecifik initieringsinformation och för att frigöra resurser som används av leverantören, se Skapa en grundläggande Windows PowerShell-leverantör. De flesta leverantörer, inklusive den som beskrivs här, kan dock använda standardimplementeringen av denna funktionalitet som tillhandahålls av Windows PowerShell.

Innan Windows PowerShell-produktleverantören kan manipulera objekten i lagret måste den implementera metoderna i basklassen System.Management.Automation.Provider.DriveCmdletProvider för att få tillgång till datalagret. För mer information om hur man implementerar denna klass, se Skapa en Windows PowerShell Drive Provider.

Kontroll av vägens validitet

När man letar efter en databit tillhandahåller Windows PowerShell-runtime en Windows PowerShell-path till leverantören, enligt definitionen i avsnittet "PSPath Concepts" i How Windows PowerShell Works. En Windows PowerShell-produktleverantör måste verifiera den syntaktiska och semantiska giltigheten för varje väg som skickas till den genom att implementera metoden System.Management.Automation.Provider.ItemCmdletProvider.IsValidPath . Denna metod returnerar true om vägen är giltig, och false annars. Var medveten om att implementeringen av denna metod inte bör verifiera förekomsten av objektet vid vägen, utan endast att sökvägen är syntaktiskt och semantiskt korrekt.

Här är implementeringen av System.Management.Automation.Provider.ItemCmdletProvider.IsValidPath för denna leverantör. Observera att denna implementation anropar en NormalizePath-hjälpmetod för att konvertera alla separatorer i vägen till en 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

Att avgöra om ett föremål existerar

Efter att ha verifierat vägen måste Windows PowerShell-runtime avgöra om ett dataobjekt finns på den vägen. För att stödja denna typ av förfrågan implementerar Windows PowerShell-produktleverantören metoden System.Management.Automation.Provider.ItemCmdletProvider.ItemExist. Denna metod returnerar true ett objekt som hittas vid den angivna sökvägen och false (standard) annars.

Här är implementeringen av System.Management.Automation.Provider.ItemCmdletProvider.ItemExistist-metoden för denna leverantör. Observera att denna metod anropar hjälpmetoderna PathIsDrive, ChunkPath och GetTable och använder ett leverantörsdefinierad DatabaseTableInfo-objekt .

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

Saker att komma ihåg när du implementerar ItemExists

Följande villkor kan gälla för din implementation av System.Management.Automation.Provider.ItemCmdletProvider.ItemExists:

Att koppla dynamiska parametrar till Test-Path-cmdleten

Ibland kräver cmdleten som anropar Test-PathSystem.Management.Automation.Provider.ItemCmdletProvider.ItemExists ytterligare parametrar som specificeras dynamiskt vid körning. För att tillhandahålla dessa dynamiska parametrar måste Windows PowerShell-produktleverantören implementera metoden System.Management.Automation.Provider.ItemCmdletProvider.ItemExistsDynamicParameters . Denna metod hämtar de dynamiska parametrarna för objektet vid den angivna sökvägen och returnerar ett objekt som har egenskaper och fält med parsningsattribut liknande en cmdlet-klass eller ett System.Management.Automation.RuntimeDefinedParameterDictionary-objekt . Windows PowerShell-runtime använder det returnerade objektet för att lägga till parametrarna i Test-Path cmdleten.

Denna Windows PowerShell-produktleverantör implementerar inte denna metod. Följande kod är dock standardimplementeringen av denna metod.

Att hämta ett föremål

För att hämta ett objekt måste Windows PowerShell-produktleverantören åsidosätta System.Management.Automation.Provider.ItemCmdletProvider.GetItem-metoden för att stödja anrop från Get-Item cmdleten. Denna metod skriver objektet med metoden System.Management.Automation.Provider.CmdletProvider.WriteItemObject .

Här är implementeringen av System.Management.Automation.Provider.ItemCmdletProvider.GetItem-metoden för denna leverantör. Observera att denna metod använder GetTable och GetRow hjälpmetoder för att hämta objekt som antingen är tabeller i Access-databasen eller rader i en datatabell.

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

Saker att komma ihåg när man implementerar GetItem

Följande villkor kan gälla för en implementation av System.Management.Automation.Provider.ItemCmdletProvider.GetItem:

Att koppla dynamiska parametrar till Get-Item-cmdleten

Ibland kräver cmdleten Get-Item ytterligare parametrar som specificeras dynamiskt vid körning. För att tillhandahålla dessa dynamiska parametrar måste Windows PowerShell-produktleverantören implementera metoden System.Management.Automation.Provider.ItemCmdletProvider.GetItemDynamicParameters . Denna metod hämtar de dynamiska parametrarna för objektet vid den angivna sökvägen och returnerar ett objekt som har egenskaper och fält med parsningsattribut liknande en cmdlet-klass eller ett System.Management.Automation.RuntimeDefinedParameterDictionary-objekt . Windows PowerShell-runtime använder det returnerade objektet för att lägga till parametrarna i Get-Item cmdleten.

Denna leverantör implementerar inte denna metod. Följande kod är dock standardimplementeringen av denna metod.

Att ställa upp ett föremål

För att sätta ett element måste Windows PowerShell-produktleverantören åsidosätta metoden System.Management.Automation.Provider.ItemCmdletProvider.SetItem för att stödja anrop från Set-Item cmdleten. Denna metod sätter värdet på objektet vid den angivna vägen.

Denna leverantör tillhandahåller ingen överskrivning för System.Management.Automation.Provider.ItemCmdletProvider.SetItem-metoden . Följande är dock standardimplementeringen av denna metod.

Saker att komma ihåg när du implementerar SetItem

Följande villkor kan gälla för din implementation av System.Management.Automation.Provider.ItemCmdletProvider.SetItem:

Hämta dynamiska parametrar för SetItem

Ibland kräver cmdleten Set-Item ytterligare parametrar som specificeras dynamiskt vid körning. För att tillhandahålla dessa dynamiska parametrar måste Windows PowerShell-produktleverantören implementera metoden System.Management.Automation.Provider.ItemCmdletProvider.SetItemDynamicParameters . Denna metod hämtar de dynamiska parametrarna för objektet vid den angivna sökvägen och returnerar ett objekt som har egenskaper och fält med parsningsattribut liknande en cmdlet-klass eller ett System.Management.Automation.RuntimeDefinedParameterDictionary-objekt . Windows PowerShell-runtime använder det returnerade objektet för att lägga till parametrarna i Set-Item cmdleten.

Denna leverantör implementerar inte denna metod. Följande kod är dock standardimplementeringen av denna metod.

Rensa ett föremål

För att rensa ett element implementerar Windows PowerShell-produktleverantören metoden System.Management.Automation.Provider.ItemCmdletProvider.ClearItem för att stödja anrop från Clear-Item cmdleten. Denna metod raderar dataobjektet vid den angivna vägen.

Denna leverantör implementerar inte denna metod. Följande kod är dock standardimplementeringen av denna metod.

Saker att komma ihåg när man implementerar ClearItem

Följande villkor kan gälla för en implementation av System.Management.Automation.Provider.ItemCmdletProvider.ClearItem:

Hämta dynamiska parametrar för ClearItem

Ibland kräver cmdleten Clear-Item ytterligare parametrar som specificeras dynamiskt vid körning. För att tillhandahålla dessa dynamiska parametrar måste Windows PowerShell-produktleverantören implementera metoden: System.Management.Automation.Provider.ItemCmdletProvider.ClearItemDynamicParameters . Denna metod hämtar de dynamiska parametrarna för objektet vid den angivna sökvägen och returnerar ett objekt som har egenskaper och fält med parsningsattribut liknande en cmdlet-klass eller ett System.Management.Automation.RuntimeDefinedParameterDictionary-objekt . Windows PowerShell-runtime använder det returnerade objektet för att lägga till parametrarna i Clear-Item cmdleten.

Denna föremålsleverantör implementerar inte denna metod. Följande kod är dock standardimplementeringen av denna metod.

Utförande av en standardåtgärd för ett objekt

En Windows PowerShell-produktleverantör kan implementera metoden System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultAction för att stödja anrop från Invoke-Item cmdleten, vilket tillåter leverantören att utföra en standardåtgärd för objektet på den angivna sökvägen. Till exempel kan filsystemleverantören använda denna metod för att anropa ShellExecute för ett specifikt objekt.

Denna leverantör implementerar inte denna metod. Följande kod är dock standardimplementeringen av denna metod.

Saker att komma ihåg när du implementerar InvokeDefaultAction

Följande villkor kan gälla för en implementation av System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultAction:

Hämta dynamiska parametrar för InvokeDefaultAction

Ibland kräver cmdleten Invoke-Item ytterligare parametrar som specificeras dynamiskt vid körning. För att tillhandahålla dessa dynamiska parametrar måste Windows PowerShell-produktleverantören implementera metoden System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultActionDynamicParameters . Denna metod hämtar de dynamiska parametrarna för objektet vid den angivna sökvägen och returnerar ett objekt som har egenskaper och fält med parsningsattribut liknande en cmdlet-klass eller ett System.Management.Automation.RuntimeDefinedParameterDictionary-objekt . Windows PowerShell-runtime använder det returnerade objektet för att lägga till de dynamiska parametrarna i Invoke-Item cmdleten.

Denna föremålsleverantör implementerar inte denna metod. Följande kod är dock standardimplementeringen av denna metod.

Implementering av hjälpmetoder och klasser

Denna itemleverantör implementerar flera hjälpmetoder och klasser som används av de offentliga överskrivningsmetoder som definieras av Windows PowerShell. Koden för dessa hjälpmetoder och klasser visas i avsnittet Kodexempel .

NormalizePath-metoden

Denna itemleverantör implementerar en NormalizePath-hjälpmetod för att säkerställa att sökvägen har ett konsekvent format. Det angivna formatet använder en backslash (\) som separator.

PathIsDrive-metoden

Denna item provider implementerar en PathIsDrive-hjälpmetod för att avgöra om den angivna sökvägen faktiskt är disknamnet.

ChunkPath-metoden

Denna produktleverantör implementerar en ChunkPath-hjälpmetod som delar upp den angivna vägen så att leverantören kan identifiera sina individuella element. Den returnerar en array bestående av ban-elementen.

GetTable-metoden

Denna itemleverantör implementerar hjälpmetoden GetTables som returnerar ett DatabaseTableInfo-objekt som representerar information om tabellen som anges i anropet.

GetRow-metod

System.Management.Automation.Provider.ItemCmdletProvider.GetItem-metoden för denna itemprovider anropar GetRows-hjälpmetoden. Denna hjälpmetod hämtar ett DatabaseRowInfo-objekt som representerar information om den angivna raden i tabellen.

DatabaseTableInfo-klassen

Denna itemleverantör definierar en DatabaseTableInfo-klass som representerar en samling information i en datatabell i databasen. Denna klass liknar System.IO.Directoryinfo-klassen .

Exempelobjektsleverantören definierar en DatabaseTableInfo.GetTabletables-metod som returnerar en samling tabellinformationsobjekt som definierar tabellerna i databasen. Denna metod inkluderar ett försök/fånga-block för att säkerställa att eventuella databasfel visas som en rad utan några poster.

DatabaseRowInfo-klassen

Denna itemleverantör definierar hjälpklassen DatabaseRowInfo som representerar en rad i en tabell i databasen. Denna klass liknar System.IO.FileInfo-klassen .

Exempelleverantören definierar en DatabaseRowInfo.GetRows-metod för att returnera en samling radinformationsobjekt för den angivna tabellen. Denna metod inkluderar en försök/fånga-block för att fånga undantag. Eventuella fel kommer inte att resultera i någon radinformation.

Kodexempel

För komplett exempelkod, se AccessDbProviderSample03 Code Sample.

Definiera objekttyper och formatering

När man skriver en leverantör kan det vara nödvändigt att lägga till medlemmar till befintliga objekt eller definiera nya objekt. När det är klart, skapa en Types-fil som Windows PowerShell kan använda för att identifiera objektets medlemmar och en Format-fil som definierar hur objektet visas. För mer information, se Utökning av objekttyper och formatering.

Bygger Windows PowerShell-leverantören

Se hur du registrerar cmdlets, leverantörer och värdapplikationer.

Testning av Windows PowerShell-leverantören

När denna Windows PowerShell-produktleverantör är registrerad hos Windows PowerShell kan du endast testa leverantörens grundläggande och drivfunktionalitet. För att testa manipulationen av objekt måste du också implementera containerfunktionalitet som beskrivs i Implementing a Container Windows PowerShell Provider.

Se även