Sdílet prostřednictvím


Vytvoření zprostředkovatele kontejneru Windows PowerShellu

Toto téma popisuje, jak vytvořit zprostředkovatele Windows PowerShellu, který může pracovat na úložištích dat ve více vrstvách. Pro tento typ úložiště dat obsahuje nejvyšší úroveň úložiště kořenové položky a každá další úroveň se označuje jako uzel podřízených položek. Když uživateli umožníte pracovat na těchto podřízených uzlech, může uživatel hierarchicky pracovat prostřednictvím úložiště dat.

Poskytovatelé, kteří můžou pracovat na víceúrovňových úložištích dat, se označují jako zprostředkovatelé kontejnerů Windows PowerShellu. Mějte ale na paměti, že zprostředkovatel kontejneru Prostředí Windows PowerShell lze použít pouze v případě, že existuje jeden kontejner (žádné vnořené kontejnery) s položkami v něm. Pokud existují vnořené kontejnery, musíte implementovat zprostředkovatele navigace windows PowerShellu. Další informace o implementaci zprostředkovatele navigace prostředí Windows PowerShell naleznete v tématu Vytvoření zprostředkovatele navigace prostředí Windows PowerShell.

Poznámka:

Zdrojový soubor C# (AccessDBSampleProvider04.cs) pro tohoto poskytovatele můžete stáhnout pomocí sady Microsoft Windows Software Development Kit pro windows Vista a .NET Framework 3.0 Runtime Components. Pokyny ke stažení najdete v tématu Postup instalace prostředí Windows PowerShell a stažení sady Windows PowerShell SDK. Stažené zdrojové soubory jsou k dispozici v <powershellových ukázkách> adresáři. Další informace o dalších implementacích zprostředkovatele Prostředí Windows PowerShell naleznete v tématu Návrh zprostředkovatele Prostředí Windows PowerShell.

Zprostředkovatel kontejneru Windows PowerShellu popsaný zde definuje databázi jako jediný kontejner s tabulkami a řádky databáze definované jako položky kontejneru.

Upozornění

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

Definování třídy zprostředkovatele kontejneru Windows PowerShellu

Zprostředkovatel kontejneru Prostředí Windows PowerShell musí definovat třídu .NET, která je odvozena z System.Management.Automation.Provider.ContainerCmdletProvider základní třídy. Tady je definice třídy pro zprostředkovatele kontejneru Windows PowerShellu popsaného v této části.

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

Všimněte si, že v této definici třídy System.Management.Automation.Provider.CmdletProviderAttribute atribut obsahuje dva parametry. První parametr určuje uživatelsky přívětivý název zprostředkovatele, který používá Prostředí Windows PowerShell. Druhý parametr určuje specifické možnosti prostředí Windows PowerShell, které zprostředkovatel během zpracování příkazů zpřístupňuje modulu runtime Prostředí Windows PowerShell. Pro tohoto poskytovatele nejsou přidány žádné funkce prostředí Windows PowerShell.

Definování základních funkcí

Jak je popsáno v Návrh zprostředkovatele Prostředí Windows PowerShell, System.Management.Automation.Provider.ContainerCmdletProvider třída odvozena z několika dalších tříd, které poskytují různé funkce poskytovatele. Zprostředkovatel kontejneru Windows PowerShellu proto musí definovat všechny funkce poskytované těmito třídami.

Pokud chcete implementovat funkce pro přidání informací o inicializaci specifické pro relaci a uvolnění prostředků používaných poskytovatelem, přečtěte si téma Vytvoření základního zprostředkovatele Windows PowerShellu. Většina poskytovatelů (včetně zde popsaného poskytovatele) ale může použít výchozí implementaci této funkce, kterou poskytuje Windows PowerShell.

Pokud chcete získat přístup k úložišti dat, musí poskytovatel implementovat metody System.Management.Automation.Provider.DriveCmdletProvider základní třídy. Další informace o implementaci těchto metod naleznete v tématu Vytvoření zprostředkovatele jednotky Prostředí Windows PowerShell.

Aby bylo možno manipulovat s položkami úložiště dat, jako je získání, nastavení a vymazání položek, musí poskytovatel implementovat metody poskytované System.Management.Automation.Provider.ItemCmdletProvider základní třídy. Další informace o implementaci těchto metod naleznete v tématu Vytvoření zprostředkovatele položek prostředí Windows PowerShell.

Načítání podřízených položek

Pokud chcete načíst podřízenou položku, musí zprostředkovatel kontejneru Windows PowerShellu přepsat System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* metodu pro podporu volání z rutiny Get-ChildItem. Tato metoda načte podřízené položky z úložiště dat a zapíše je do kanálu jako objekty. Pokud je zadán parametr recurse rutiny, metoda načte všechny podřízené položky bez ohledu na to, na jaké úrovni jsou. Pokud není zadaný parametr recurse, metoda načte pouze jednu úroveň podřízených položek.

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

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

Co je potřeba pamatovat na implementaci GetChildItems

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

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

Někdy Get-ChildItem rutina, která volá System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* vyžaduje další parametry, které se zadají dynamicky za běhu. Chcete-li poskytnout tyto dynamické parametry, musí poskytovatel kontejneru Prostředí Windows PowerShell implementovat System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItemsDynamicParameters* metoda. Tato metoda načte dynamické parametry položky na určené 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 objektu. Modul runtime Prostředí Windows PowerShell používá vrácený objekt k přidání parametrů do rutiny Get-ChildItem.

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

Načítání názvů podřízených položek

Aby bylo možné načíst názvy podřízených položek, musí zprostředkovatel kontejneru Windows PowerShellu přepsat System.Management.Automation.Provider.ContainerCmdletProvider.GetChildNames* metodu pro podporu volání z rutiny Get-ChildItem při zadání jeho Name parametru. Tato metoda načte názvy podřízených položek pro zadanou cestu nebo podřízené názvy položek pro všechny kontejnery, pokud je zadán parametr returnAllContainers rutiny. Podřízené jméno je listová část cesty. Například podřízený název cesty C:\windows\system32\abc.dll je "abc.dll". Podřízený název adresáře C:\windows\system32 je "system32".

Zde je implementace System.Management.Automation.Provider.ContainerCmdletProvider.GetChildNames* metoda pro tohoto poskytovatele. Všimněte si, že metoda načte názvy tabulek, pokud zadaná cesta označuje accessovou databázi (jednotku) 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

Co je potřeba pamatovat na implementaci GetChildNames

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

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

Někdy rutina Get-ChildItem (s parametrem Name) vyžaduje další parametry, které se zadají dynamicky za běhu. Pokud chcete poskytnout tyto dynamické parametry, musí poskytovatel kontejneru Windows PowerShellu implementovat System.Management.Automation.Provider.ContainerCmdletProvider.GetChildNamesDynamicParameters* metoda. Tato metoda načte dynamické parametry položky na určené 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 objektu. Modul runtime Prostředí Windows PowerShell používá vrácený objekt k přidání parametrů do rutiny Get-ChildItem.

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

Přejmenování položek

Pokud chcete přejmenovat položku, musí poskytovatel kontejneru Windows PowerShellu přepsat System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem* metoda, která podporuje volání z rutiny Rename-Item. Tato metoda změní název položky na zadané cestě na zadaný název zadaný zadaný název. Nový název musí být vždy relativní vzhledem k nadřazené položce (kontejneru).

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

Co je potřeba pamatovat na implementaci RenameItem

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

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

Někdy rutina Rename-Item vyžaduje další parametry, které se zadají dynamicky za běhu. Pokud chcete poskytnout tyto dynamické parametry, musí poskytovatel kontejneru Prostředí Windows PowerShell implementovat System.Management.Automation.Provider.ContainerCmdletProvider.RenameItemDynamicParameters* metoda. Tato metoda načte parametry položky na určené 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 objektu. Modul runtime Prostředí Windows PowerShell používá vrácený objekt k přidání parametrů do rutiny Rename-Item.

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

Vytváření nových položek

Pokud chcete vytvořit nové položky, musí poskytovatel kontejneru implementovat metodu System.Management.Automation.Provider.ContainerCmdletProvider.NewItem*, která podporuje volání z rutiny New-Item. Tato metoda vytvoří datovou položku umístěnou v zadané cestě. Parametr type rutiny obsahuje typ definovaný zprostředkovatelem pro novou položku. Zprostředkovatel FileSystem například používá parametr type s hodnotou "file" nebo "directory". Parametr newItemValue rutiny určuje hodnotu specifickou pro zprostředkovatele pro novou položku.

Zde je implementace System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* metoda tohoto zprostředkovatele.

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

Co je potřeba pamatovat na implementaci NewItem

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

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

Někdy rutina New-Item vyžaduje další parametry, které se zadají dynamicky za běhu. Pokud chcete poskytnout tyto dynamické parametry, musí poskytovatel kontejneru implementovat System.Management.Automation.Provider.ContainerCmdletProvider.NewItemDynamicParameters* metoda. Tato metoda načte parametry položky na určené 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 objektu. Modul runtime Prostředí Windows PowerShell používá vrácený objekt k přidání parametrů do rutiny New-Item.

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

Odebírání položek

Pokud chcete odebrat položky, musí zprostředkovatel prostředí Windows PowerShell přepsat System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem* metodu pro podporu volání z rutiny Remove-Item. Tato metoda odstraní položku z úložiště dat v zadané cestě. Pokud je parametr recurse rutiny Remove-Item nastaven na true, metoda odebere všechny podřízené položky bez ohledu na jejich úroveň. Pokud je parametr nastaven na false, metoda odebere pouze jednu položku v zadané cestě.

Tento zprostředkovatel nepodporuje odebrání položek. Následující kód je však výchozí implementace System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem*.

Co je potřeba pamatovat na implementaci RemoveItem

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

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

Někdy rutina Remove-Item vyžaduje další parametry, které se zadají dynamicky za běhu. Pokud chcete poskytnout tyto dynamické parametry, musí poskytovatel kontejneru implementovat System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItemDynamicParameters* metodu pro zpracování těchto parametrů. Tato metoda načte dynamické parametry položky na určené 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 objektu. Modul runtime Prostředí Windows PowerShell používá vrácený objekt k přidání parametrů do rutiny Remove-Item.

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

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

Pokud chcete zkontrolovat, jestli v zadané cestě existují podřízené položky, musí poskytovatel kontejneru Windows PowerShellu přepsat System.Management.Automation.Provider.ContainerCmdletProvider.HasChildItems* metoda. Tato metoda vrátí true, pokud má položka podřízené položky, a false jinak. U cesty s hodnotou null nebo prázdnou cestou metoda považuje všechny položky v úložišti dat za podřízené položky a vrátí true.

Zde je přepsání pro System.Management.Automation.Provider.ContainerCmdletProvider.HasChildItems* metoda. Pokud existuje více než dvě části cesty vytvořené metodou pomocné rutiny ChunkPath, metoda vrátí false, protože jsou definovány pouze kontejner databáze a kontejner tabulky. Další informace o této pomocné metodě naleznete v tématu ChunkPath metoda je popsána v Vytvoření zprostředkovatele položek prostředí Windows PowerShell.

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

return results;

Co je potřeba pamatovat na implementaci HasChildItems

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

Kopírování položek

Pokud chcete kopírovat položky, musí poskytovatel kontejneru implementovat metodu System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem pro podporu volání z rutiny Copy-Item. Tato metoda zkopíruje datovou položku z umístění určeného parametrem path rutiny do umístění určeného parametrem copyPath. Pokud je zadán parametr recurse, metoda zkopíruje všechny dílčí kontejnery. Pokud parametr není zadán, metoda zkopíruje pouze jednu úroveň položek.

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

Co je potřeba pamatovat na implementaci copyItem

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

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

Někdy rutina Copy-Item vyžaduje další parametry, které se zadají dynamicky za běhu. Chcete-li poskytnout tyto dynamické parametry, musí poskytovatel kontejneru Prostředí Windows PowerShell implementovat System.Management.Automation.Provider.ContainerCmdletProvider.CopyItemDynamicParameters* metodu pro zpracování těchto parametrů. Tato metoda načte parametry položky na určené 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 objektu. Modul runtime Prostředí Windows PowerShell používá vrácený objekt k přidání parametrů do rutiny Copy-Item.

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

Ukázka kódu

Úplný vzorový kód najdete v ukázkovékódu AccessDbProviderSample04 .

Vytvoření zprostředkovatele Windows PowerShellu

Viz Postup registrace rutin, poskytovatelů a hostitelských aplikací.

Testování zprostředkovatele Windows PowerShellu

Pokud je váš poskytovatel Windows PowerShellu zaregistrovaný ve Windows PowerShellu, můžete ho otestovat spuštěním podporovaných rutin na příkazovém řádku. Mějte na paměti, že následující příklad výstupu používá fiktivní accessovou databázi.

  1. Spuštěním rutiny Get-ChildItem načtěte seznam podřízených položek z tabulky Customers v accessové databázi.

    Get-ChildItem mydb:customers
    

    Zobrazí se následující výstup.

    PSPath        : AccessDB::customers
    PSDrive       : mydb
    PSProvider    : System.Management.Automation.ProviderInfo
    PSIsContainer : True
    Data          : System.Data.DataRow
    Name          : Customers
    RowCount      : 91
    Columns       :
    
  2. Spuštěním rutiny Get-ChildItem znovu načtěte data tabulky.

    (Get-ChildItem mydb:customers).Data
    

    Zobrazí se následující výstup.

    TABLE_CAT   : C:\PS\northwind
    TABLE_SCHEM :
    TABLE_NAME  : Customers
    TABLE_TYPE  : TABLE
    REMARKS     :
    
  3. Teď pomocí rutiny Get-Item načtěte položky na řádku 0 v tabulce dat.

    Get-Item mydb:\customers\0
    

    Zobrazí se následující výstup.

    PSPath        : AccessDB::customers\0
    PSDrive       : mydb
    PSProvider    : System.Management.Automation.ProviderInfo
    PSIsContainer : False
    Data          : System.Data.DataRow
    RowNumber     : 0
    
  4. Znovu použijte Get-Item k načtení dat pro položky v řádku 0.

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

    Zobrazí se následující výstup.

    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. Teď pomocí rutiny New-Item přidejte řádek do existující tabulky. Parametr Path určuje úplnou cestu k řádku a musí označit číslo řádku, které je větší než existující počet řádků v tabulce. Parametr Type označuje, Row určit typ položky, kterou chcete přidat. Nakonec parametr Value určuje seznam hodnot sloupců oddělených čárkami pro řádek.

    New-Item -Path mydb:\Customers\3 -ItemType "Row" -Value "3,CustomerFirstName,CustomerLastName,CustomerEmailAddress,CustomerTitle,CustomerCompany,CustomerPhone, CustomerAddress,CustomerCity,CustomerState,CustomerZip,CustomerCountry"
    
  6. Následujícím způsobem ověřte správnost operace nové položky.

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

    Zobrazí se následující výstup.

    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í zprostředkovatelů Windows PowerShellu

návrhu zprostředkovatele Windows PowerShellu

implementace zprostředkovatele Windows PowerShellu pro položku

implementace zprostředkovatele Windows PowerShellu pro navigaci

registrace rutin, poskytovatelů a hostitelských aplikací

windows PowerShell SDK

programátora windows PowerShellu