Sdílet prostřednictvím


Vytvoření poskytovatele položek ve Windows PowerShell

Toto téma popisuje, jak vytvořit poskytovatele Windows PowerShell, který dokáže manipulovat s daty v datovém úložišti. V tomto tématu se prvky dat v úložišti označují jako "položky" datového úložiště. V důsledku toho se poskytovatel, který dokáže manipulovat s daty v úložišti, nazývá poskytovatel položek Windows PowerShell.

Poznámka:

Zdrojový soubor C# (AccessDBSampleProvider03.cs) pro tohoto poskytovatele si můžete stáhnout pomocí Microsoft Windows Software Development Kit for Windows Vista a .NET Framework 3.0 Runtime Components. Pro návod ke stažení viz Jak nainstalovat Windows PowerShell a Stáhněte si Windows PowerShell SDK. Stažené zdrojové soubory jsou dostupné v adresáři PowerShell Samples . Pro více informací o dalších implementacích poskytovatelů Windows PowerShell viz Návrh vašeho poskytovatele Windows PowerShell.

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

Definování třídy poskytovatele položek Windows PowerShell

Poskytovatel položek Windows PowerShell musí definovat třídu .NET, která vychází ze základní třídy System.Management.Automation.Provider.ItemCmdletProvider . Následuje definice třídy poskytovatele položek popsaná v této sekci.

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

public class AccessDBProvider : ItemCmdletProvider

Všimněte si, že v této definici třídy atribut System.Management.Automation.Provider.CmdletProviderAttribute obsahuje dva parametry. První parametr určuje uživatelsky přívětivé jméno poskytovatele, které používá Windows PowerShell. Druhý parametr specifikuje specifické schopnosti Windows PowerShell, které poskytovatel zpřístupňuje běhu Windows PowerShell během zpracování příkazů. Pro tohoto poskytovatele nejsou přidané specifické funkce Windows PowerShell.

Definování základní funkcionality

Jak je popsáno v knize Design Your Windows PowerShell Provider, třída System.Management.Automation.Provider.DriveCmdletProvider pochází z několika dalších tříd, které nabízely různé funkce poskytovatele. Poskytovatel položek Windows PowerShell proto musí definovat veškerou funkcionalitu poskytovanou těmito třídami.

Pro více informací o tom, jak implementovat funkce pro přidávání inicializačních informací specifických pro relace a pro uvolňování zdrojů používaných poskytovatelem, viz Vytvoření základního poskytovatele Windows PowerShell. 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ž může poskytovatel položek Windows PowerShell manipulovat s položkami ve skladu, musí implementovat metody základní třídy System.Management.Automation.Provider.DriveCmdletProvider pro přístup k datovému úložišti. Pro více informací o implementaci této třídy viz Vytvoření poskytovatele disku Windows PowerShell.

Kontrola platnosti cesty

Při hledání datového bodu poskytuje runtime Windows PowerShell poskytovateli cestu k Windows PowerShell, jak je definováno v sekci "PSPath Concepts" v How Windows PowerShell Works. Poskytovatel položek Windows PowerShell musí ověřit syntaktickou a sémantickou platnost každé cesty, která mu byla předána, implementací metody System.Management.Automation.Provider.ItemCmdletProvider.IsValidPath . Tato metoda vrací true , pokud je cesta platná, a false jinak. Mějte na paměti, že implementace této metody by neměla ověřovat existenci položky na cestě, ale pouze to, že cesta je syntakticky a sémanticky správná.

Zde je implementace metody System.Management.Automation.Provider.ItemCmdletProvider.IsValidPath pro tohoto poskytovatele. Všimněte si, že tato implementace volá pomocnou metodu NormalizePath pro převod všech separatorů na 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í, zda položka existuje

Po ověření cesty musí runtime Windows PowerShell určit, zda na této cestě existuje položka dat. Pro podporu tohoto typu dotazu implementuje poskytovatel položek Windows PowerShell metodu System.Management.Automation.Provider.ItemCmdletProvider.ItemExists . Tato metoda vrací true položku, která se nachází na určené cestě a false (výchozí) jinak.

Zde je implementace metody System.Management.Automation.Provider.ItemCmdletProvider.ItemExists pro tohoto poskytovatele. Všimněte si, že tato metoda volá pomocné metody PathIsDrive, ChunkPath a GetTable a používá objekt DatabaseTableInfo definovaný poskytovatelem.

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

Na co si pamatovat při implementaci ItemExists

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

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

Někdy cmdlet Test-Path , který volá System.Management.Automation.Provider.ItemCmdletProvider.ItemExists, vyžaduje další parametry, které jsou dynamicky specifikovány za běhu. Pro poskytnutí těchto dynamických parametrů musí poskytovatel položek Windows PowerShell implementovat metodu System.Management.Automation.Provider.ItemCmdletProvider.ItemExistsDynamicParameters . Tato metoda získá dynamické parametry položky na uvedené cestě a vrátí objekt, který má vlastnosti a pole s atributy pro parsování podobnými třídě cmdlet nebo objektu System.Management.Automation.RuntimeDefinedParameterDictionary . Runtime Windows PowerShell používá vrácený objekt k přidání parametrů do cmdletu Test-Path .

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

Vyzvednutí položky

Pro získání položky musí poskytovatel položek Windows PowerShell přepsat metodu System.Management.Automation.Provider.ItemCmdletProvider.GetItem a podporovat volání z Get-Item tohoto cmdletu. Tato metoda zapisuje položku pomocí metody System.Management.Automation.Provider.CmdletProvider.WriteItemObject .

Zde je implementace metody System.Management.Automation.Provider.ItemCmdletProvider.GetItem pro tohoto poskytovatele. Všimněte si, že tato metoda využívá pomocné metody GetTable a GetRow k získání položek, které jsou buď tabulkami v databázi Access, 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

Na co si pamatovat při implementaci GetItem

Následující podmínky mohou platit pro implementaci System.Management.Automation.Provider.ItemCmdletProvider.GetItem:

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

Někdy cmdlet Get-Item vyžaduje další parametry, které jsou dynamicky specifikovány za běhu. Pro poskytnutí těchto dynamických parametrů musí poskytovatel položek Windows PowerShell implementovat metodu System.Management.Automation.Provider.ItemCmdletProvider.GetItemDynamicParameters . Tato metoda získá dynamické parametry položky na uvedené cestě a vrátí objekt, který má vlastnosti a pole s atributy pro parsování podobnými třídě cmdlet nebo objektu System.Management.Automation.RuntimeDefinedParameterDictionary . Runtime Windows PowerShell používá vrácený objekt k přidání parametrů do cmdletu Get-Item .

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

Nastavení položky

Pro nastavení položky musí poskytovatel položek Windows PowerShell přepsat metodu System.Management.Automation.Provider.ItemCmdletProvider.SetItem a podporovat volání z Set-Item cmdletu. Tato metoda nastavuje hodnotu položky na určené cestě.

Tento poskytovatel neposkytuje přepis pro metodu System.Management.Automation.Provider.ItemCmdletProvider.SetItem . Nicméně následující je výchozí implementace této metody.

Na co si pamatovat při implementaci SetItem

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

Získávání dynamických parametrů pro SetItem

Někdy cmdlet Set-Item vyžaduje další parametry, které jsou dynamicky specifikovány za běhu. Pro poskytnutí těchto dynamických parametrů musí poskytovatel položek Windows PowerShell implementovat metodu System.Management.Automation.Provider.ItemCmdletProvider.SetItemDynamicParameters . Tato metoda získá dynamické parametry položky na uvedené cestě a vrátí objekt, který má vlastnosti a pole s atributy pro parsování podobnými třídě cmdlet nebo objektu System.Management.Automation.RuntimeDefinedParameterDictionary . Runtime Windows PowerShell používá vrácený objekt k přidání parametrů do cmdletu Set-Item .

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

Vyčištění položky

Pro vyčištění položky implementuje poskytovatel položek Windows PowerShell metodu System.Management.Automation.Provider.ItemCmdletProvider.ClearItem pro podporu volání z Clear-Item cmdletu. Tato metoda vymaže datovou položku na určené cestě.

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

Na co si pamatovat při implementaci ClearItem

Následující podmínky se mohou vztahovat na implementaci System.Management.Automation.Provider.ItemCmdletProvider.ClearItem:

Získejte dynamické parametry pro ClearItem

Někdy cmdlet Clear-Item vyžaduje další parametry, které jsou dynamicky specifikovány za běhu. Pro poskytnutí těchto dynamických parametrů musí poskytovatel položek Windows PowerShell implementovat metodu System.Management.Automation.Provider.ItemCmdletProvider.ClearItemDynamicParameters . Tato metoda získá dynamické parametry položky na uvedené cestě a vrátí objekt, který má vlastnosti a pole s atributy pro parsování podobnými třídě cmdlet nebo objektu System.Management.Automation.RuntimeDefinedParameterDictionary . Runtime Windows PowerShell používá vrácený objekt k přidání parametrů do cmdletu Clear-Item .

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

Provádění výchozí akce pro položku

Poskytovatel položek Windows PowerShell může implementovat metodu System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultAction pro podporu volání z Invoke-Item cmdletu, což umožňuje poskytovateli provést výchozí akci pro položku na určené cestě. Například poskytovatel souborového systému může tuto metodu použít k volání ShellExecute pro konkrétní položku.

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

Na co si pamatovat při implementaci InvokeDefaultAction

Následující podmínky se mohou vztahovat na implementaci System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultAction:

Získejte dynamické parametry pro InvokeDefaultAction

Někdy cmdlet Invoke-Item vyžaduje další parametry, které jsou dynamicky specifikovány za běhu. Pro poskytnutí těchto dynamických parametrů musí poskytovatel položek Windows PowerShell implementovat metodu System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultActionDynamicParameters . Tato metoda získá dynamické parametry položky na uvedené cestě a vrátí objekt, který má vlastnosti a pole s atributy pro parsování podobnými třídě cmdlet nebo objektu System.Management.Automation.RuntimeDefinedParameterDictionary . Runtime Windows PowerShell používá vrácený objekt k přidání dynamických parametrů do Invoke-Item cdletu.

Tento poskytovatel položek 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é používají veřejné přepisovací metody definované Windows PowerShellem. Kód těchto pomocných metod a tříd je uveden v sekci Ukázky kódu .

Metoda NormalizePath

Tento poskytovatel položek implementuje pomocnou metodu NormalizePath , aby zajistil konzistentní formát cesty. Specifikovaný formát používá jako oddělovač zpětné lomítko (\)

Metoda PathIsDrive

Tento poskytovatel položek implementuje pomocnou metodu PathIsDrive , která určuje, zda je zadaná cesta skutečně názvem disku.

Metoda ChunkPath

Tento poskytovatel položek implementuje pomocnou metodu ChunkPath , která rozděluje zadanou cestu, aby mohl identifikovat její jednotlivé prvky. Vrací pole složené z prvků cesty.

Metoda GetTable

Tento poskytovatel položek implementuje pomocnou metodu GetTables , která vrací objekt DatabaseTableInfo reprezentující informace o tabulce specifikované v hovoru.

GetRow – metoda

Metoda System.Management.Automation.Provider.ItemCmdletProvider.GetItem tohoto poskytovatele položek nazývá pomocnou metodu GetRows . Tato pomocná metoda získává objekt DatabaseRowInfo , který reprezentuje informace o daném řádku v tabulce.

Třída DatabaseTableInfo

Tento poskytovatel položek definuje třídu DatabaseTableInfo , která představuje sbírku informací v datové tabulce v databázi. Tato třída je podobná třídě System.IO.Directoryinfo .

Poskytovatel ukázkových položek definuje metodu DatabaseTableInfo.GetTables , která vrací kolekci informačních objektů tabulky definujících tabulky v databázi. Tato metoda zahrnuje blok try/catch, který zajišťuje, že jakákoli chyba v databázi se zobrazí jako řádek bez záznamů.

Třída DatabaseRowInfo

Tento poskytovatel položek definuje pomocnou třídu DatabaseRowInfo , která reprezentuje řádek v tabulce databáze. Tato třída je podobná třídě System.IO.FileInfo .

Poskytovatel vzorků definuje metodu DatabaseRowInfo.GetRows pro vrácení kolekce informačních objektů řádků pro zadanou tabulku. Tato metoda zahrnuje blok try/catch pro chycení výjimek. Jakékoliv chyby povedou k tomu, že nebudou uvedeny žádné řádky.

Ukázka kódu

Pro kompletní ukázkový kód viz AccessDbProviderSample03 Code Sample.

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

Při psaní poskytovatele může být nutné přidávat členy k existujícím objektům nebo definovat nové objekty. Po dokončení vytvořte soubor Types, který může Windows PowerShell použít k identifikaci členů objektu, a formátový soubor, který definuje, jak je objekt zobrazen. Pro více informací viz Rozšíření typů objektů a formátování.

Vytvoření poskytovatele Windows PowerShell

Podívejte se, jak registrovat cmdlety, poskytovatele a hostitelské aplikace.

Testování poskytovatele Windows PowerShell

Když je tento poskytovatel položek Windows PowerShell registrován ve Windows PowerShell, můžete testovat pouze základní a diskové funkce tohoto poskytovatele. Pro testování manipulace s položkami musíte také implementovat funkcionalitu kontejneru popsanou v Implementing a Container Windows PowerShell Provider.

Viz také