Sdílet prostřednictvím


Vytvoření Windows PowerShell Container Provider

Toto téma popisuje, jak vytvořit poskytovatele Windows PowerShell, který dokáže pracovat s vícevrstvými datovými úložišti. Pro tento typ datového úložiště obsahuje horní úroveň úložiště kořenové položky a každá následující úroveň se označuje jako uzel podpoložek. Tím, že uživatel může pracovat na těchto poduzlech, může uživatel hierarchicky komunikovat prostřednictvím datového úložiště.

Poskytovatelé, kteří mohou pracovat s víceúrovňovými datovými úložišti, se nazývají Windows PowerShell kontejneroví poskytovatelé. Mějte však na paměti, že poskytovatel kontejnerů Windows PowerShell lze použít pouze tehdy, když je jeden kontejner (žádné vnořené kontejnery) obsahující položky. Pokud jsou zde vnořené kontejnery, musíte implementovat navigačního poskytovatele Windows PowerShell. Pro více informací o implementaci poskytovatele navigace Windows PowerShell viz Vytvoření poskytovatele navigace Windows PowerShell.

Poznámka:

Zdrojový soubor C# (AccessDBSampleProvider04.cs) tohoto poskytovatele si můžete stáhnout pomocí Microsoft Windows Software Development Kit pro 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.

Zde popsaný poskytovatel kontejneru Windows PowerShell definuje databázi jako její jediný kontejner, přičemž tabulky a řádky databáze jsou definovány jako položky kontejneru.

Upozornění

Mějte na paměti, že tento návrh předpokládá databázi s polem s ID jména a že typ pole je LongInteger.

Definování třídy poskytovatele kontejnerů Windows PowerShell

Poskytovatel kontejnerů Windows PowerShell musí definovat třídu .NET, která vychází ze základní třídy System.Management.Automation.Provider.ContainerCmdletProvider . Zde je definice třídy pro poskytovatele kontejnerů Windows PowerShell, popsanou v této sekci.

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

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řidány žádné specifické funkce pro Windows PowerShell.

Definování základní funkcionality

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

Pro implementaci funkcí pro přidání inicializačních informací specifických pro relaci a pro uvolně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.

Pro přístup k datovému úložišti musí poskytovatel implementovat metody základní třídy System.Management.Automation.Provider.DriveCmdletProvider . Pro více informací o implementaci těchto metod viz Vytvoření poskytovatele disku Windows PowerShell.

Pro manipulaci s položkami datového úložiště, jako je získávání, nastavování a vyřizování položek, musí poskytovatel implementovat metody poskytované základní třídou System.Management.Automation.Provider.ItemCmdletProvider . Pro více informací o implementaci těchto metod viz Vytvoření poskytovatele položek Windows PowerShell.

Získávání dětských předmětů

Pro získání podpoložky musí poskytovatel kontejneru Windows PowerShell přepsat metodu System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* a podporovat volání z cdletu Get-ChildItem . Tato metoda získává podpoložky z datového úložiště a zapisuje je do pipeline jako objekty. Pokud je parametr cmdletu zadán, recurse metoda načte všechny potomky bez ohledu na jejich úroveň. Pokud parametr recurse není specifikován, metoda získá pouze jednu úroveň potomků.

Zde je implementace metody System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* pro tohoto poskytovatele. Všimněte si, že tato metoda získává podpoložky ve všech databázových tabulkách, když cesta označuje databázi Access, a pokud cesta označuje datovou tabulku, získává podpoložky z řádků této tabulky.

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

Věci, na které je třeba pamatovat při implementaci GetChildItems

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

Připojení dynamických parametrů k Get-ChildItem Cmdletu

Někdy cmdlet Get-ChildItem , který volá System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems*, vyžaduje další parametry, které jsou dynamicky specifikovány za běhu. Pro poskytnutí těchto dynamických parametrů musí poskytovatel kontejneru Windows PowerShell implementovat metodu System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItemsDynamicParameters* . Tato metoda získává dynamické parametry pro položku na indikované cestě a vrací 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-ChildItem .

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

Získávání názvů dětských položek

Pro získání jmen podřízených položek musí poskytovatel kontejneru Windows PowerShell přepsat metodu System.Management.Automation.Provider.ContainerCmdletProvider.GetChildNames* a podporovat volání z Get-ChildItem cmdletu, když je jeho Name parametr specifikován. Tato metoda získává názvy podpoložek pro zadanou cestu nebo názvy podpoložek pro všechny kontejnery, pokud returnAllContainers je parametr CMDLET zadán. Dětské jméno je listová část cesty. Například dětské jméno cesty C:\windows\system32\abc.dll je "abc.dll". Vedlejší název adresáře C:\windows\system32 je "system32".

Zde je implementace metody System.Management.Automation.Provider.ContainerCmdletProvider.GetChildNames* pro tohoto poskytovatele. Všimněte si, že metoda získává názvy tabulek, pokud zadaná cesta označuje databázi Access (disk), a čísla řádků, pokud cesta označuje tabulku.

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

Na co si pamatovat při implementaci GetChildNames

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

Připojení dynamických parametrů k Get-ChildItem cmdletu (název)

Někdy cmdlet Get-ChildItem (s parametrem Name ) vyžaduje další parametry, které jsou dynamicky specifikovány za běhu. Pro poskytnutí těchto dynamických parametrů musí poskytovatel kontejneru Windows PowerShell implementovat metodu System.Management.Automation.Provider.ContainerCmdletProvider.GetChildNamesDynamicParameters* . 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-ChildItem .

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

Přejmenování položek

Pro přejmenování položky musí poskytovatel kontejnerů Windows PowerShell přepsat metodu System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem* a podporovat volání z Rename-Item tohoto cmdletu. Tato metoda mění název položky na určené cestě na nově zadaný název. Nový název musí být vždy vztahující k nadřazenému předmětu (kontejneru).

Tento poskytovatel nepřepisuje metodu System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem* . Následující je však výchozí implementace.

Na co si pamatovat při implementaci RenameItem

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

Připojení dynamických parametrů k Rename-Item Cmdletu

Někdy cmdlet Rename-Item vyžaduje další parametry, které jsou dynamicky specifikovány za běhu. Pro poskytnutí těchto dynamických parametrů musí poskytovatel kontejnerů Windows PowerShell implementovat metodu System.Management.Automation.Provider.ContainerCmdletProvider.RenameItemDynamicParameters* . Tato metoda získá 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 Rename-Item .

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

Vytváření nových položek

Pro vytvoření nových položek musí poskytovatel kontejnerů implementovat metodu System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* pro podporu volání z New-Item cmdletu. Tato metoda vytváří datový prvek umístěný na určené cestě. Parametr type cmdletu obsahuje typ definovaný poskytovatelem pro novou položku. Například poskytovatel souborového systému používá type parametr s hodnotou "file" nebo "directory". Parametr newItemValue cmdletu určuje hodnotu specifickou pro poskytovatele pro novou položku.

Zde je implementace metody System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* pro tohoto poskytovatele.

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];

Věci, na které si zapamatovat při implementaci NewItem

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

Připojení dynamických parametrů k New-Item Cmdletu

Někdy cmdlet New-Item vyžaduje další parametry, které jsou dynamicky specifikovány za běhu. Pro poskytnutí těchto dynamických parametrů musí poskytovatel kontejneru implementovat metodu System.Management.Automation.Provider.ContainerCmdletProvider.NewItemDynamicParameters* . Tato metoda získá 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 New-Item .

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

Odstraňování položek

Pro odstranění položek musí poskytovatel Windows PowerShell přepsat metodu System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem*, aby podporoval volání z Remove-Item cmdletu. Tato metoda smaže položku z datového úložiště na určené cestě. Pokud recurse je parametr cmdletu Remove-Item nastaven na true, metoda odstraní všechny podpoložky bez ohledu na jejich úroveň. Pokud je parametr nastaven na false, metoda odstraní pouze jednu položku na zadané cestě.

Tento poskytovatel nepodporuje odstraňování položek. Následující kód je však výchozí implementací System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem*.

Věci, na které si zapamatovat při implementaci RemoveItem

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

Připojení dynamických parametrů k Remove-Item Cmdletu

Někdy cmdlet Remove-Item vyžaduje další parametry, které jsou dynamicky specifikovány za běhu. Pro poskytnutí těchto dynamických parametrů musí poskytovatel kontejneru implementovat metodu System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItemDynamicParameters* pro zpracování těchto parametrů. 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 Remove-Item .

Tento poskytovatel kontejnerů tuto metodu neimplementuje. Následující kód je však výchozí implementací System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItemDynamicParameters*.

Dotazování na podřízené položky

Aby se ověřilo, zda se na dané cestě nacházejí podpoložky, musí poskytovatel kontejneru Windows PowerShell přepsat metodu System.Management.Automation.Provider.ContainerCmdletProvider.HasChildItems* . Tato metoda vrací true , pokud má položka potomky, a false jinak. Pro nulovou nebo prázdnou cestu metoda považuje všechny položky v datovém úložišti za potomky a vrací true.

Zde je přepis pro metodu System.Management.Automation.Provider.ContainerCmdletProvider.HasChildItems* . Pokud je pomocí pomocné metody ChunkPath vytvořeno více než dvě části cesty, metoda vrátí false, protože jsou definovány pouze databázový kontejner a kontejner tabulky. Pro více informací o této pomocné metodě viz metoda ChunkPath je popsána v článku Vytváření Windows PowerShell Item Provider.

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

return results;

Na co si pamatovat při implementaci HasChildItems

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

Kopírování položek

Pro zkopírovaní položek musí poskytovatel kontejneru implementovat metodu System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem pro podporu volání z Copy-Item cmdletu. Tato metoda kopíruje datovou položku z místa označeného parametrem path cmdletu do místa označeného parametrem copyPath . Pokud je parametr specifikován, recurse metoda zkopíruje všechny podkontejnery. Pokud parametr není specifikován, metoda zkopíruje pouze jednu úroveň položek.

Tento poskytovatel tuto metodu neimplementuje. Následující kód je však výchozí implementací System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem.

Věci, na které si zapamatovat při implementaci CopyItem

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

Připojení dynamických parametrů k Copy-Item Cmdletu

Někdy cmdlet Copy-Item vyžaduje další parametry, které jsou dynamicky specifikovány za běhu. Pro poskytnutí těchto dynamických parametrů musí poskytovatel kontejnerů Windows PowerShell implementovat metodu System.Management.Automation.Provider.ContainerCmdletProvider.CopyItemDynamicParameters* pro zpracování těchto parametrů. Tato metoda získá 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 Copy-Item .

Tento poskytovatel tuto metodu neimplementuje. Následující kód je však výchozí implementací System.Management.Automation.Provider.ContainerCmdletProvider.CopyItemDynamicParameters*.

Ukázka kódu

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

Vytvoření Windows PowerShell Provider

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

Testování Windows PowerShell Provider

Když je váš poskytovatel Windows PowerShell registrován ve Windows PowerShell, můžete to otestovat spuštěním podporovaných cmdletů na příkazovém řádku. Mějte na paměti, že následující příklad používá fiktivní databázi Access.

  1. Spusť Get-ChildItem cmdlet pro získání seznamu podpoložek z tabulky Customers v databázi Access.

    Get-ChildItem mydb:customers
    

    Následující výstup se objevuje.

    PSPath        : AccessDB::customers
    PSDrive       : mydb
    PSProvider    : System.Management.Automation.ProviderInfo
    PSIsContainer : True
    Data          : System.Data.DataRow
    Name          : Customers
    RowCount      : 91
    Columns       :
    
  2. Spusť Get-ChildItem cmdlet znovu, abys získal data tabulky.

    (Get-ChildItem mydb:customers).Data
    

    Následující výstup se objevuje.

    TABLE_CAT   : C:\PS\northwind
    TABLE_SCHEM :
    TABLE_NAME  : Customers
    TABLE_TYPE  : TABLE
    REMARKS     :
    
  3. Nyní použijte Get-Item cmdlet k načtení položek v řádku 0 v datové tabulce.

    Get-Item mydb:\customers\0
    

    Následující výstup se objevuje.

    PSPath        : AccessDB::customers\0
    PSDrive       : mydb
    PSProvider    : System.Management.Automation.ProviderInfo
    PSIsContainer : False
    Data          : System.Data.DataRow
    RowNumber     : 0
    
  4. Znovu použít Get-Item pro získání dat pro položky v řádku 0.

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

    Následující výstup se objevuje.

    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. Nyní použijte New-Item cmdlet k přidání řádku do existující tabulky. Parametr Path určuje celou cestu k řádku a musí uvádět číslo řádku větší než stávající počet řádků v tabulce. Parametr označuje TypeRow určení typu položky k přidání. Nakonec Value parametr specifikuje seznam sloupcových hodnot pro řádek oddělený čárkou.

    New-Item -Path mydb:\Customers\3 -ItemType "Row" -Value "3,CustomerFirstName,CustomerLastName,CustomerEmailAddress,CustomerTitle,CustomerCompany,CustomerPhone, CustomerAddress,CustomerCity,CustomerState,CustomerZip,CustomerCountry"
    
  6. Ověřte správnost operace s novou položkou následovně.

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

    Následující výstup se objevuje.

    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
    

Viz také

Vytváření poskytovatelů Windows PowerShell

Navrhování vašeho poskytovatele Windows PowerShell

Implementace položky Windows PowerShell Provider

Implementace navigačního Windows PowerShell Providera

Jak registrovat cmdlety, poskytovatele a hostitelské aplikace

Windows PowerShell SDK

Průvodce programátora Windows PowerShell