Skapa en Windows PowerShell objektprovider

I det här avsnittet beskrivs hur du skapar en Windows PowerShell provider som kan manipulera data i ett datalager. I det här avsnittet kallas dataelementen i arkivet för "objekt" i datalagret. Därför kallas en provider som kan manipulera data i arkivet för en Windows PowerShell objektprovider.

Anteckning

Du kan ladda ned C#-källfilen (AccessDBSampleProvider03.cs) för den här providern med hjälp av Microsoft Windows Software Development Kit för Windows Vista och .NET Framework 3.0 Runtime Components. Instruktioner för nedladdning finns i Så här installerar du Windows PowerShell och laddar ned Windows PowerShell SDK. De nedladdade källfilerna PowerShell Samples är tillgängliga i katalogen . Mer information om andra implementeringar av Windows PowerShell-providern finns i Designing Your Windows PowerShell Provider (Utforma din Windows PowerShell-provider).

Den Windows PowerShell objektprovider som beskrivs i det här avsnittet hämtar data från en Access-databas. I det här fallet är ett "objekt" antingen en tabell i Access-databasen eller en rad i en tabell.

Definiera providerklassen för Windows PowerShell objekt

En Windows PowerShell objektprovider måste definiera en .NET-klass som härleds från basklassen System.Management.Automation.Provider.ItemCmdletProvider. Följande är klassdefinitionen för objektprovidern som beskrivs i det här avsnittet.

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

public class AccessDBProvider : ItemCmdletProvider

Observera att attributet System.Management.Automation.Provider.CmdletProviderAttribute i den här klassdefinitionen innehåller två parametrar. Den första parametern anger ett användarvänligt namn för providern som används av Windows PowerShell. Den andra parametern anger Windows PowerShell specifika funktioner som providern exponerar för Windows PowerShell-körningen under kommandobearbetningen. För den här providern finns det inga ytterligare Windows PowerShell specifika funktioner.

Definiera grundläggande funktioner

Enligt beskrivningen i Designa din Windows PowerShell-provider härleds klassen System.Management.Automation.Provider.DriveCmdletProvider från flera andra klasser som tillhandahöll olika providerfunktioner. En Windows PowerShell objektprovider måste därför definiera alla funktioner som tillhandahålls av dessa klasser.

Mer information om hur du implementerar funktioner för att lägga till sessionsspecifik initieringsinformation och för att frigöra resurser som används av providern finns i Skapa en grundläggande Windows PowerShell-provider. De flesta leverantörer, inklusive leverantören som beskrivs här, kan dock använda standardimplementeringen av den här funktionen som tillhandahålls av Windows PowerShell.

Innan Windows PowerShell objektprovidern kan manipulera objekten i arkivet måste den implementera metoderna i basklassen System.Management.Automation.Provider.DriveCmdletProvider för att få åtkomst till datalagret. Mer information om hur du implementerar den här klassen finns i Skapa en Windows PowerShell-enhetsprovider.

Söka efter sökvägens giltighet

När du letar efter ett dataobjekt tillhandahåller Windows PowerShell-körningen en Windows PowerShell sökväg till providern, enligt definitionen i avsnittet "PSPath-begrepp" i Hur Windows PowerShell fungerar. En Windows PowerShell objektprovider måste verifiera syntaktisk och semantisk giltighet för alla sökvägar som skickas till den genom att implementera metoden System.Management.Automation.Provider.ItemCmdletProvider.IsValidPath. Den här metoden returnerar true om sökvägen är giltig och false annars. Tänk på att implementeringen av den här metoden inte bör verifiera förekomsten av objektet på sökvägen, utan bara att sökvägen är syntaktiskt och semantiskt korrekt.

Här är implementeringen av metoden System.Management.Automation.Provider.ItemCmdletProvider.IsValidPath för den här providern. Observera att den här implementeringen anropar en NormalizePath-hjälpmetod för att konvertera alla avgränsare i sökvägen till en enhetlig.

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

Avgöra om ett objekt finns

När du har verifierat sökvägen måste Windows PowerShell-körningen avgöra om det finns ett dataobjekt på den sökvägen. För att stödja den här typen av fråga implementerar Windows PowerShell objektprovidern metoden System.Management.Automation.Provider.ItemCmdletProvider.ItemExists. Den här metoden returnerar true att ett objekt hittas på den angivna sökvägen och false (standard) annars.

Här är implementeringen av metoden System.Management.Automation.Provider.ItemCmdletProvider.ItemExists för den här providern. Observera att den här metoden anropar hjälpmetoderna PathIsDrive, ChunkPath och GetTable och använder ett providerdefinierat 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 implementeringen av System.Management.Automation.Provider.ItemCmdletProvider.ItemExists:

Koppla dynamiska parametrar till cmdleten Test-Path

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

Den här Windows PowerShell objektprovidern implementerar inte den här metoden. Följande kod är dock standardimplementeringen av den här metoden.

Hämtar ett objekt

För att hämta ett objekt måste Windows PowerShell objektprovidern åsidosätta metoden System.Management.Automation.Provider.ItemCmdletProvider.GetItem för att stödja anrop från cmdletenGet-Item. Den här metoden skriver objektet med hjälp av metoden System.Management.Automation.Provider.CmdletProvider.WriteItemObject .

Här är implementeringen av metoden System.Management.Automation.Provider.ItemCmdletProvider.GetItem för den här providern. Observera att den här metoden använder hjälpmetoderna GetTable och GetRow 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 du implementerar GetItem

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

Koppla dynamiska parametrar till cmdleten Get-Item

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

Den här providern implementerar inte den här metoden. Följande kod är dock standardimplementeringen av den här metoden.

Ange ett objekt

Om du vill ange ett objekt måste Windows PowerShell objektprovidern åsidosätta metoden System.Management.Automation.Provider.ItemCmdletProvider.SetItem för att stödja anrop från cmdletenSet-Item. Den här metoden anger värdet för objektet på den angivna sökvägen.

Den här providern tillhandahåller ingen åsidosättning för metoden System.Management.Automation.Provider.ItemCmdletProvider.SetItem . Följande är dock standardimplementeringen av den här metoden.

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

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

Hämtar dynamiska parametrar för SetItem

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

Den här providern implementerar inte den här metoden. Följande kod är dock standardimplementeringen av den här metoden.

Rensa ett objekt

För att rensa ett objekt implementerar Windows PowerShell-objektprovidern metoden System.Management.Automation.Provider.ItemCmdletProvider.ClearItem för att stödja anrop från cmdletenClear-Item. Den här metoden raderar dataobjektet på den angivna sökvägen.

Den här providern implementerar inte den här metoden. Följande kod är dock standardimplementeringen av den här metoden.

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

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

Hämta dynamiska parametrar för ClearItem

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

Den här objektprovidern implementerar inte den här metoden. Följande kod är dock standardimplementeringen av den här metoden.

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

En Windows PowerShell objektprovider kan implementera metoden System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultAction för att stödja anrop från cmdletenInvoke-Item, vilket gör att providern kan utföra en standardåtgärd för objektet på den angivna sökvägen. FileSystem-providern kan till exempel använda den här metoden för att anropa ShellExecute för ett specifikt objekt.

Den här providern implementerar inte den här metoden. Följande kod är dock standardimplementeringen av den här metoden.

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

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

Hämta dynamiska parametrar för InvokeDefaultAction

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

Den här objektprovidern implementerar inte den här metoden. Följande kod är dock standardimplementeringen av den här metoden.

Implementera hjälpmetoder och klasser

Den här objektprovidern implementerar flera hjälpmetoder och klasser som används av de offentliga åsidosättningsmetoder som definieras av Windows PowerShell. Koden för dessa hjälpmetoder och klasser visas i avsnittet Kodexempel .

NormalizePath-metod

Den här objektprovidern implementerar en NormalizePath-hjälpmetod för att säkerställa att sökvägen har ett konsekvent format. Det angivna formatet använder ett omvänt snedstreck (\) som avgränsare.

PathIsDrive-metod

Den här objektprovidern implementerar en PathIsDrive-hjälpmetod för att avgöra om den angivna sökvägen faktiskt är enhetsnamnet.

ChunkPath-metod

Den här objektprovidern implementerar en ChunkPath-hjälpmetod som delar upp den angivna sökvägen så att providern kan identifiera sina enskilda element. Den returnerar en matris som består av sökvägselementen.

GetTable-metod

Den här objektprovidern implementerar hjälpmetoden GetTables som returnerar ett DatabaseTableInfo-objekt som representerar information om tabellen som anges i anropet.

GetRow-metod

Metoden System.Management.Automation.Provider.ItemCmdletProvider.GetItem för den här objektprovidern anropar hjälpmetoden GetRows . Den här hjälpmetoden hämtar ett DatabaseRowInfo-objekt som representerar information om den angivna raden i tabellen.

DatabaseTableInfo-klass

Den här objektprovidern definierar en DatabaseTableInfo-klass som representerar en samling information i en datatabell i databasen. Den här klassen liknar klassen System.IO.Directoryinfo .

Exempelobjektprovidern definierar en DatabaseTableInfo.GetTables-metod som returnerar en samling tabellinformationsobjekt som definierar tabellerna i databasen. Den här metoden innehåller ett try/catch-block för att säkerställa att eventuella databasfel visas som en rad med noll poster.

DatabaseRowInfo-klass

Den här objektprovidern definierar hjälpklassen DatabaseRowInfo som representerar en rad i en tabell i databasen. Den här klassen liknar klassen System.IO.FileInfo .

Exempelprovidern definierar metoden DatabaseRowInfo.GetRows för att returnera en samling radinformationsobjekt för den angivna tabellen. Den här metoden innehåller ett try/catch-block för att fånga undantag. Eventuella fel resulterar inte i någon radinformation.

Kodexempel

Fullständig exempelkod finns i AccessDbProviderSample03-kodexempel.

Definiera objekttyper och formatering

När du skriver en provider kan det vara nödvändigt att lägga till medlemmar i befintliga objekt eller definiera nya objekt. När du är klar skapar du en typfil som Windows PowerShell kan använda för att identifiera medlemmarna i objektet och en formatfil som definierar hur objektet visas. Mer information finns i Utöka objekttyper och formatering.

Skapa Windows PowerShell-providern

Se Registrera cmdletar, leverantörer och värdprogram.

Testa Windows PowerShell-providern

När den här Windows PowerShell objektprovidern är registrerad med Windows PowerShell kan du bara testa providerns grundläggande funktioner och enhetsfunktioner. För att testa manipuleringen av objekt måste du även implementera containerfunktioner som beskrivs i Implementera en container Windows PowerShell provider.

Se även