Vytvoření zprostředkovatele položky Windows PowerShell

Toto téma popisuje, jak vytvořit poskytovatele Windows PowerShell, který může manipulovat s daty v úložišti dat. V tomto tématu se prvky dat v úložišti označují jako "položky" úložiště dat. Poskytovatel, který může manipulovat s daty v úložišti, se proto označuje jako poskytovatel položky Windows PowerShell.

Poznámka

Zdrojový soubor jazyka C# (AccessDBSampleProvider03.cs) pro tohoto poskytovatele si můžete stáhnout pomocí sady Microsoft Windows Software Development Kit for Windows Vista a .NET Framework 3.0 Runtime Components. Pokyny ke stažení najdete v tématu Instalace Windows PowerShell a stažení sady Windows PowerShell SDK. Stažené zdrojové soubory jsou k dispozici v PowerShell Samples adresáři. Další informace o dalších implementacích poskytovatele Windows PowerShell naleznete v tématu Návrh poskytovatele Windows PowerShell.

Poskytovatel položky Windows PowerShell popsaný v tomto tématu získává položky dat z accessové databáze. V tomto případě je položka buď tabulka v accessové databázi, nebo řádek v tabulce.

Definování třídy zprostředkovatele položky Windows PowerShell

Zprostředkovatel položky Windows PowerShell musí definovat třídu .NET, která je odvozena ze základní třídy System.Management.Automation.Provider.ItemCmdletProvider. Následuje definice třídy pro zprostředkovatele položky popsané v této části.

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

public class AccessDBProvider : ItemCmdletProvider

Všimněte si, že v této definici třídy system.Management.Automation.Provider.RutinProviderAttribute atribut obsahuje dva parametry. První parametr určuje uživatelsky přívětivý název poskytovatele, který používá Windows PowerShell. Druhý parametr určuje Windows PowerShell konkrétní možnosti, které poskytovatel během zpracování příkazů zveřejňuje pro modul runtime Windows PowerShell. Pro tohoto poskytovatele nejsou přidány žádné Windows PowerShell konkrétní možnosti.

Definování základních funkcí

Jak je popsáno v návrhu Vašeho poskytovatele Windows PowerShell, System.Management.Automation.Provider.DriveCmdletProvider třída odvozena z několika dalších tříd, které poskytují různé funkce poskytovatele. Poskytovatel položky Windows PowerShell proto musí definovat všechny funkce poskytované těmito třídami.

Další informace o implementaci funkcí pro přidání informací o inicializaci specifické pro relaci a pro uvolnění prostředků používaných poskytovatelem naleznete v tématu Vytvoření základního Windows PowerShell zprostředkovatele. Většina poskytovatelů, včetně zde popsaného poskytovatele, však může použít výchozí implementaci této funkce, kterou poskytuje Windows PowerShell.

Než poskytovatel položky Windows PowerShell může manipulovat s položkami v úložišti, musí implementovat metody System.Management.Automation.Provider.DriveCmdletProvider pro přístup k úložišti dat. Další informace o implementaci této třídy naleznete v tématu Vytvoření poskytovatele jednotky Windows PowerShell.

Kontrola platnosti cesty

Při hledání položky dat objektu runtime Windows PowerShell poskytuje Windows PowerShell cestu k poskytovateli, jak je definováno v části Koncepty PSPath v části How Windows PowerShell Works. Zprostředkovatel položky Windows PowerShell musí ověřit syntaktickou a sémantickou platnost jakékoli cesty předané jí implementací metody System.Management.Automation.Provider.ItemCmdletProvider.IsValidPath. Tato metoda vrátí true , pokud je cesta platná, a false jinak. Mějte na paměti, že implementace této metody by neměla ověřit existenci položky v cestě, ale pouze to, že cesta je syntakticky a sémanticky správná.

Tady je implementace metody System.Management.Automation.Provider.ItemCmdletProvider.IsValidPath pro tohoto zprostředkovatele. Všimněte si, že tato implementace volá pomocné metody NormalizePath k převodu všech oddělovačů v cestě na uniformní.

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

Určení, jestli položka existuje

Po ověření cesty musí modul runtime Windows PowerShell určit, jestli v této cestě existuje položka dat. Pro podporu tohoto typu dotazu poskytovatel položky Windows PowerShell implementuje metodu System.Management.Automation.Provider.ItemCmdletProvider.ItemExists. Tato metoda vrátí true položku na zadané cestě a false (výchozí) v opačném případě.

Tady je implementace metody System.Management.Automation.Provider.ItemCmdletProvider.ItemExists pro tohoto zprostředkovatele. Tato metoda volá pomocné metody PathIsDrive, ChunkPath a GetTable a používá zprostředkovatel definovaný 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

Co je potřeba pamatovat na implementaci ItemExists

Následující podmínky se můžou vztahovat na vaši implementaci System.Management.Automation.Provider.ItemCmdletProvider.ItemExists:

Připojení dynamických parametrů k rutině Test-Path

RutinaTest-Path, která volá System.Management.Automation.Provider.ItemCmdletProvider.ItemExists, někdy vyžaduje další parametry, které jsou zadány dynamicky za běhu. Chcete-li poskytnout tyto dynamické parametry, musí poskytovatel položky Windows PowerShell implementovat System.Management.Automation.Provider.ItemCmdletProvider.ItemExistsDynamicParameters metoda. Tato metoda načte dynamické parametry pro položku na uvedené cestě a vrátí objekt, který má vlastnosti a pole s parsováním atributů podobných třídě rutiny nebo System.Management.Automation.RuntimeDefinedParameterDictionary objekt. Modul runtime Windows PowerShell používá vrácený objekt k přidání parametrů do rutinyTest-Path.

Tento Windows PowerShell poskytovatel položek tuto metodu neimplementuje. Následující kód je však výchozí implementací této metody.

Načtení položky

Pokud chcete načíst položku, musí poskytovatel položky Windows PowerShell přepsat System.Management.Automation.Provider.ItemCmdletProvider.GetItem metodu pro podporu volání z rutinyGet-Item. Tato metoda zapíše položku pomocí metody System.Management.Automation.Provider.RutinProvider.WriteItemObject.

Zde je implementace metody System.Management.Automation.Provider.ItemCmdletProvider.GetItem pro tohoto zprostředkovatele. Všimněte si, že tato metoda používá pomocné metody GetTable a GetRow k načtení položek, které jsou buď tabulky v accessové databázi, nebo řádky v datové tabulce.

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

Co je potřeba pamatovat na implementaci GetItem

Následující podmínky se můžou vztahovat na implementaci System.Management.Automation.Provider.ItemCmdletProvider.GetItem:

Připojení dynamických parametrů k rutině Get-Item

Rutina Get-Item někdy vyžaduje další parametry, které se zadají dynamicky za běhu. Chcete-li poskytnout tyto dynamické parametry, musí poskytovatel položky Windows PowerShell implementovat System.Management.Automation.Provider.ItemCmdletProvider.GetItemDynamicParameters metoda. Tato metoda načte dynamické parametry pro položku na uvedené cestě a vrátí objekt, který má vlastnosti a pole s parsováním atributů podobných třídě rutiny nebo System.Management.Automation.RuntimeDefinedParameterDictionary objekt. Modul runtime Windows PowerShell používá vrácený objekt k přidání parametrů do rutinyGet-Item.

Tento zprostředkovatel tuto metodu neimplementuje. Následující kód je však výchozí implementací této metody.

Nastavení položky

Chcete-li nastavit položku, musí poskytovatel položky Windows PowerShell přepsat System.Management.Automation.Provider.ItemCmdletProvider.SetItem metodu pro podporu volání z rutinySet-Item. Tato metoda nastaví hodnotu položky na zadanou cestu.

Tento zprostředkovatel neposkytuje přepsání metody System.Management.Automation.Provider.ItemCmdletProvider.SetItem. Toto je však výchozí implementace této metody.

Co je potřeba pamatovat na implementaci SetItem

Následující podmínky se můžou vztahovat na vaši implementaci System.Management.Automation.Provider.ItemCmdletProvider.SetItem:

Načítání dynamických parametrů pro SetItem

Rutina Set-Item někdy vyžaduje další parametry, které se zadají dynamicky za běhu. Chcete-li poskytnout tyto dynamické parametry, musí poskytovatel položky Windows PowerShell implementovat System.Management.Automation.Provider.ItemCmdletProvider.SetItemDynamicParameters metoda. Tato metoda načte dynamické parametry pro položku na uvedené cestě a vrátí objekt, který má vlastnosti a pole s parsováním atributů podobných třídě rutiny nebo System.Management.Automation.RuntimeDefinedParameterDictionary objekt. Modul runtime Windows PowerShell používá vrácený objekt k přidání parametrů do rutinySet-Item.

Tento zprostředkovatel tuto metodu neimplementuje. Následující kód je však výchozí implementací této metody.

Vymazání položky

Chcete-li vymazat položku, poskytovatel položky Windows PowerShell implementuje metodu System.Management.Automation.Provider.ItemCmdletProvider.ClearItem pro podporu volání z rutinyClear-Item. Tato metoda vymaže položku dat v zadané cestě.

Tento zprostředkovatel tuto metodu neimplementuje. Následující kód je však výchozí implementací této metody.

Co je potřeba pamatovat na implementaci ClearItem

Následující podmínky se můžou vztahovat na implementaci System.Management.Automation.Provider.ItemCmdletProvider.ClearItem:

Načtení dynamických parametrů pro ClearItem

Rutina Clear-Item někdy vyžaduje další parametry, které se zadají dynamicky za běhu. Chcete-li poskytnout tyto dynamické parametry, musí poskytovatel položky Windows PowerShell implementovat System.Management.Automation.Provider.ItemCmdletProvider.ClearItemDynamicParameters metoda. Tato metoda načte dynamické parametry pro položku na uvedené cestě a vrátí objekt, který má vlastnosti a pole s parsováním atributů podobných třídě rutiny nebo System.Management.Automation.RuntimeDefinedParameterDictionary objekt. Modul runtime Windows PowerShell používá vrácený objekt k přidání parametrů do rutinyClear-Item.

Tento zprostředkovatel položky tuto metodu neimplementuje. Následující kód je však výchozí implementací této metody.

Provedení výchozí akce pro položku

Zprostředkovatel položky Windows PowerShell může implementovat metodu System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultAction pro podporu volání z Invoke-Item rutiny, která umožňuje poskytovateli provést výchozí akci pro položku v zadané cestě. Například zprostředkovatel FileSystem může tuto metodu použít k volání ShellExecute pro určitou položku.

Tento zprostředkovatel tuto metodu neimplementuje. Následující kód je však výchozí implementací této metody.

Co je potřeba pamatovat na implementaci InvokeDefaultAction

Následující podmínky se můžou vztahovat na implementaci System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultAction:

Načtení dynamických parametrů pro InvokeDefaultAction

Rutina Invoke-Item někdy vyžaduje další parametry, které se zadají dynamicky za běhu. Chcete-li poskytnout tyto dynamické parametry, musí poskytovatel položky Windows PowerShell implementovat System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultActionDynamicParameters metoda. Tato metoda načte dynamické parametry pro položku na uvedené cestě a vrátí objekt, který má vlastnosti a pole s parsováním atributů podobných třídě rutiny nebo System.Management.Automation.RuntimeDefinedParameterDictionary objekt. Modul runtime Windows PowerShell používá vrácený objekt k přidání dynamických parametrů do rutinyInvoke-Item.

Tento zprostředkovatel položky tuto metodu neimplementuje. Následující kód je však výchozí implementací této metody.

Implementace pomocných metod a tříd

Tento poskytovatel položek implementuje několik pomocných metod a tříd, které jsou používány veřejnými metodami přepsání definované Windows PowerShell. Kód pro tyto pomocné metody a třídy se zobrazí v části Ukázka kódu .

NormalPath – metoda

Tento zprostředkovatel položek implementuje pomocnou metodu NormalizePath , aby se zajistilo, že cesta má konzistentní formát. Zadaný formát používá zpětné lomítko (\) jako oddělovač.

Metoda PathIsDrive

Tento zprostředkovatel položky implementuje pomocnou metodu PathIsDrive , která určuje, jestli je zadaná cesta ve skutečnosti názvem jednotky.

ChunkPath – metoda

Tento zprostředkovatel položky implementuje pomocnou metodu ChunkPath , která rozdělí zadanou cestu, aby zprostředkovatel mohl identifikovat své jednotlivé prvky. Vrátí pole složené z elementů cesty.

Metoda GetTable

Tento zprostředkovatel položky implementuje pomocnou metodu GetTables , která vrací DatabaseTableInfo objekt, který představuje informace o tabulce zadané ve volání.

GetRow – metoda

Metoda System.Management.Automation.Provider.ItemCmdletProvider.GetItem tohoto zprostředkovatele položky volá metodu pomocníka GetRows. Tato pomocná metoda načte DatabaseRowInfo objekt, který představuje informace o zadaném řádku v tabulce.

DatabaseTableInfo – třída

Tento poskytovatel položky definuje DatabaseTableInfo třída, která představuje kolekci informací v datové tabulce v databázi. Tato třída je podobná system.IO.Directoryinfo třídy.

Zprostředkovatel ukázkové položky definuje metodu DatabaseTableInfo.GetTables , která vrací kolekci objektů s informacemi o tabulce definující tabulky v databázi. Tato metoda obsahuje blok try/catch, který zajistí, že se jakákoli chyba databáze zobrazí jako řádek s nulovými položkami.

DatabaseRowInfo – třída

Tento zprostředkovatel položky definuje pomocné třídy DatabaseRowInfo , která představuje řádek v tabulce databáze. Tato třída je podobná System.IO.FileInfo třídy.

Ukázkový zprostředkovatel definuje Metodu DatabaseRowInfo.GetRows , která vrátí kolekci objektů informací o řádcích pro zadanou tabulku. Tato metoda zahrnuje blok try/catch k zachycení výjimek. Všechny chyby nebudou mít za následek žádné informace o řádku.

Ukázka kódu

Úplný ukázkový kód naleznete v části Ukázka kódu AccessDbProviderSample03.

Definování typů objektů a formátování

Při psaní zprostředkovatele může být nutné přidat členy do existujících objektů nebo definovat nové objekty. Po dokončení vytvořte soubor Type, který Windows PowerShell může použít k identifikaci členů objektu a formátu souboru, který definuje, jak se objekt zobrazí. Další informace naleznete v tématu Rozšíření typů objektů a formátování.

Sestavení poskytovatele Windows PowerShell

Přečtěte si, jak zaregistrovat rutiny, poskytovatele a hostitelské aplikace.

Testování poskytovatele Windows PowerShell

Pokud je tento poskytovatel položek Windows PowerShell zaregistrovaný v Windows PowerShell, můžete pouze otestovat základní a řídit funkce poskytovatele. Pokud chcete otestovat manipulaci s položkami, musíte také implementovat funkce kontejneru popsané v implementaci zprostředkovatele kontejneru Windows PowerShell.

Viz také