Vytvoření zprostředkovatele kontejneru Windows PowerShellu

Toto téma popisuje, jak vytvořit zprostředkovatele Windows PowerShell, který může pracovat s vícevrstvá úložiště dat. 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živatel může pracovat na těchto podřízených uzlech, může hierarchicky pracovat prostřednictvím úložiště dat.

Zprostředkovatelé, kteří mohou pracovat s více úrovněmi úložišť dat, se označují Windows PowerShell kontejnerů. Uvědomte si ale, že Windows PowerShell kontejneru lze použít pouze v případě, že je v kontejneru jeden kontejner (žádné vnořené kontejnery) s položkami. Pokud existují vnořené kontejnery, musíte implementovat poskytovatele Windows PowerShell navigace. Další informace o implementaci poskytovatele Windows PowerShell navigace najdete v tématu Vytvoření zprostředkovatele Windows PowerShell Navigation Provider.

Poznámka

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

Poskytovatel Windows PowerShell, který je zde popsaný, definuje databázi jako svůj jediný kontejner s tabulkami a řádky databáze definovanými jako položky kontejneru.

Upozornění

Uvědomte si, ž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 Windows PowerShell kontejneru

Poskytovatel Windows PowerShell kontejneru musí definovat třídu .NET odvozenou ze základní třídy System.Management.Automation.Provider.Containercmdletprovider. Tady je definice třídy pro zprostředkovatele Windows PowerShell kontejneru popsaná v této části.

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

Všimněte si, že v této definici třídy obsahuje atribut System.Management.Automation.Provider.Cmdletproviderattribute dva parametry. První parametr určuje popisný název zprostředkovatele, který používá Windows PowerShell. Druhý parametr určuje konkrétní Windows PowerShell, které zprostředkovatel při zpracování Windows PowerShell modulu runtime. Pro tohoto poskytovatele nejsou k dispozici Windows PowerShell specifické možnosti.

Definování základních funkcí

Jak je popsáno v části Návrh Windows PowerShell Provider, třída System.Management.Automation.Provider.Containercmdletprovider je odvozená z několika dalších tříd, které poskytovaly různé funkce zprostředkovatele. Poskytovatel Windows PowerShell kontejneru proto musí definovat všechny funkce poskytované těmito třídami.

Pokud chcete implementovat funkci pro přidání informací o inicializaci specifické pro relaci a uvolnění prostředků používaných poskytovatelem, podívejte se na vytvoření základního poskytovatele Windows PowerShell. 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.

Pro získání přístupu k úložiště dat musí zprostředkovatel implementovat metody základní třídy System.Management.Automation.Provider.Drivecmdletprovider. Další informace o implementaci těchto metod najdete v tématu Creating an Windows PowerShell Drive Provider.

Pro manipulaci s položkami úložiště dat, jako je získání, nastavení a vymazání položek, musí poskytovatel implementovat metody poskytované základní třídou System.Management.Automation.Provider.Itemcmdletprovider. Další informace o implementaci těchto metod naleznete v tématu Creating an Windows PowerShell Item Provider.

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

Aby bylo možné načíst podřízenou položku, musí zprostředkovatel kontejneru Windows PowerShell přepsat metodu System.Management.Automation.Provider.Containercmdletprovider.Getchilditems*, aby podporoval 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 rutiny , metoda načte všechny děti bez ohledu na to, na recurse jaké úrovni jsou. Pokud parametr recurse není zadaný, metoda načte pouze jednu úroveň dětí.

Tady je implementace metody System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* pro tohoto zprostředkovatele. 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 databázi Accessu, 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 třeba si zapamatovat o implementaci GetChildItems

Na vaši implementaci System.Management.Automation.Provider.Containercmdletprovider.Getchilditems*se mohou vztahovat následující podmínky:

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

Někdy Get-ChildItem rutina, která volá System.Management.Automation.Provider.Containercmdletprovider.Getchilditems*, vyžaduje další parametry, které se za běhu za běhu zadá. Aby poskytovatel kontejneru Windows PowerShell tyto dynamické parametry poskytl, musí implementovat metodu System.Management.Automation.Provider.Containercmdletprovider.Getchilditemsdynamicparameters*. Tato metoda načte dynamické parametry pro položku na uvedené cestě a vrátí objekt, který má vlastnosti a pole s parsovacími atributy podobnými třídě rutiny nebo objektu System.Management.Automation.Runtimedefinedparameterdictionary. Modul Windows PowerShell runtime používá vrácený objekt k přidání parametrů do rutiny Get-ChildItem .

Tento Windows PowerShell kontejneru 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 PowerShell přepsat metodu System.Management.Automation.Provider.Containercmdletprovider.Getchildnames*, aby podporoval volání z rutiny při zadaném Get-ChildItem Name parametru. Tato metoda načte názvy podřízených položek pro zadanou cestu nebo názvy podřízených položek pro všechny kontejnery, pokud je zadán returnAllContainers parametr rutiny . Podřízený název je část cesty typu list. Například podřízený název pro cestu, c:\windows\system32\abc.dll je "abc.dll". Podřízený název adresáře c:\windows\system32 je "system32".

Tady je implementace metody System.Management.Automation.Provider.Containercmdletprovider.Getchildnames* pro tohoto zprostředkovatele. Všimněte si, že metoda načte názvy tabulek, pokud zadaná cesta označuje přístupovou 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 třeba si zapamatovat o implementaci getChildNames

Na vaši implementaci System.Management.Automation.Provider.Containercmdletprovider.Getchilditems*se mohou vztahovat následující podmínky:

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

Někdy Get-ChildItem rutina (s Name parametrem ) vyžaduje další parametry, které se za běhu za běhu zadá. Aby poskytovatel kontejneru Windows PowerShell tyto dynamické parametry poskytl, musí implementovat metodu System.Management.Automation.Provider.Containercmdletprovider.Getchildnamesdynamicparameters*. Tato metoda načte dynamické parametry položky na uvedené cestě a vrátí objekt, který má vlastnosti a pole s parsovacími atributy podobnými třídě rutiny nebo objektu System.Management.Automation.Runtimedefinedparameterdictionary. Modul Windows PowerShell runtime 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, Windows PowerShell kontejneru musí přepsat metodu System.Management.Automation.Provider.Containercmdletprovider.Renameitem*, aby podporoval volání z Rename-Item rutiny . Tato metoda změní název položky v zadané cestě na zadaný nový název. Nový název musí být vždy relativní vzhledem k nadřazené položce (kontejneru).

Tento zprostředkovatel nepřepisuje metodu System.Management.Automation.Provider.Containercmdletprovider.Renameitem*. Následující kód je však výchozí implementace.

Co je třeba si zapamatovat o implementaci RenameItem

Na vaši implementaci System.Management.Automation.Provider.Containercmdletprovider.Renameitem*se mohou vztahovat následující podmínky:

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

V některých případech Rename-Item rutina vyžaduje další parametry, které jsou zadány dynamicky za běhu. chcete-li poskytnout tyto dynamické parametry, Windows PowerShell zprostředkovatel kontejneru musí implementovat metodu System. Management. Automation. provider. Containercmdletprovider. Renameitemdynamicparameters * . Tato metoda načte parametry položky na zadané cestě a vrátí objekt, který má vlastnosti a pole s atributy analýzy podobným třídě rutiny nebo objektu System. Management. Automation. Runtimedefinedparameterdictionary . modul runtime Windows PowerShell používá vrácený objekt k přidání parametrů do Rename-Item rutiny.

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

Vytváření nových položek

Chcete-li vytvořit nové položky, zprostředkovatel kontejneru musí implementovat metodu System. Management. Automation. Provider. Containercmdletprovider. zástupného prvku NewItem * , která podporuje volání z New-Item rutiny. Tato metoda vytvoří datovou položku umístěnou v zadané cestě. typeParametr rutiny obsahuje typ definovaný poskytovatelem pro novou položku. Například poskytovatel systému souborů používá type parametr s hodnotou "File" nebo "Directory". newItemValueParametr rutiny určuje pro novou položku hodnotu specifickou pro konkrétního zprostředkovatele.

Zde je implementace metody System. Management. Automation. Provider. Containercmdletprovider. zástupného prvku 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, které si zapamatujete o implementaci zástupného prvku NewItem

Následující podmínky mohou platit pro implementaci System. Management. Automation. Provider. Containercmdletprovider. zástupného prvku NewItem *:

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

V některých případech New-Item rutina vyžaduje další parametry, které jsou zadány dynamicky za běhu. Aby mohl poskytovatel kontejneru poskytnout tyto dynamické parametry, musí implementovat metodu System. Management. Automation. Provider. Containercmdletprovider. Newitemdynamicparameters * . Tato metoda načte parametry položky na zadané cestě a vrátí objekt, který má vlastnosti a pole s atributy analýzy podobným třídě rutiny nebo objektu System. Management. Automation. Runtimedefinedparameterdictionary . modul runtime Windows PowerShell používá vrácený objekt k přidání parametrů do New-Item rutiny.

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

Odebírání položek

chcete-li odebrat položky, musí poskytovatel Windows PowerShell přepsat metodu System. Management. Automation. provider. Containercmdletprovider. Removeitem * , aby podporovala volání z Remove-Item rutiny. Tato metoda odstraní položku z úložiště dat v zadané cestě. Pokud recurse Remove-Item je parametr rutiny nastaven na true , metoda odstraní všechny podřízené položky bez ohledu na jejich úroveň. Pokud je parametr nastaven na hodnotu false , metoda odstraní 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í implementací System. Management. Automation. Provider. Containercmdletprovider. RemoveItem *.

Věci, které si zapamatujete o implementaci RemoveItem

Následující podmínky mohou platit pro implementaci System. Management. Automation. Provider. Containercmdletprovider. zástupného prvku NewItem *:

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

V některých případech Remove-Item rutina vyžaduje další parametry, které jsou zadány dynamicky za běhu. Pro zajištění těchto dynamických parametrů musí zprostředkovatel kontejneru implementovat metodu System. Management. Automation. Provider. Containercmdletprovider. Removeitemdynamicparameters * pro zpracování těchto parametrů. Tato metoda načte dynamické parametry pro položku na zadané cestě a vrátí objekt, který má vlastnosti a pole s atributy analýzy podobným třídě rutiny nebo objektu System. Management. Automation. Runtimedefinedparameterdictionary . modul runtime Windows PowerShell používá vrácený objekt k přidání parametrů do Remove-Item rutiny.

Tento zprostředkovatel kontejneru neimplementuje tuto metodu. Následující kód je však výchozí implementací System. Management. Automation. Provider. Containercmdletprovider. Removeitemdynamicparameters *.

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

chcete-li zjistit, zda podřízené položky existují v zadané cestě, zprostředkovatel kontejneru Windows PowerShell musí přepsat metodu System. Management. Automation. provider. Containercmdletprovider. Haschilditems * . Tato metoda vrátí true , zda má položka podřízené položky, a false v opačném případě. Pro hodnotu null nebo prázdnou cestu metoda považuje všechny položky v úložišti dat za podřízené a vrátí true .

Toto je přepsání metody System. Management. Automation. Provider. Containercmdletprovider. Haschilditems * . Pokud je k dispozici více než dvě části cesty vytvořené pomocnou metodou ChunkPath, metoda vrátí false , protože je definován pouze kontejner databáze a kontejner tabulky. další informace o této pomocné metodě naleznete v tématu vytvoření poskytovatele Windows PowerShell položky.

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

return results;

Věci, které si zapamatujete o implementaci HasChildItems

Následující podmínky mohou platit pro implementaci System. Management. Automation. Provider. Containercmdletprovider. Haschilditems *:

Kopírování položek

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

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

Věci, které si zapamatujete o implementaci CopyItem

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

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

V některých případech Copy-Item rutina vyžaduje další parametry, které jsou zadány dynamicky za běhu. aby bylo možné tyto dynamické parametry poskytnout, musí zprostředkovatel kontejneru Windows PowerShell implementovat metodu System. Management. Automation. provider. Containercmdletprovider. Copyitemdynamicparameters * pro zpracování těchto parametrů. Tato metoda načte parametry položky na zadané cestě a vrátí objekt, který má vlastnosti a pole s atributy analýzy podobným třídě rutiny nebo objektu System. Management. Automation. Runtimedefinedparameterdictionary . modul runtime Windows PowerShell používá vrácený objekt k přidání parametrů do Copy-Item rutiny.

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

Vzorek kódu

Úplný vzorový kód naleznete v tématu AccessDbProviderSample04 Code Sample.

sestavování poskytovatele Windows PowerShell

Podívejte se , jak registrovat rutiny, zprostředkovatele a hostitelské aplikace.

testování poskytovatele Windows PowerShell

když je poskytovatel Windows PowerShell zaregistrovaný v Windows PowerShell, můžete ho otestovat spuštěním podporovaných rutin na příkazovém řádku. Upozorňujeme, že následující příklad výstupu používá fiktivní databázi Accessu.

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

    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. Spusťte Get-ChildItem rutinu znovu, aby se načetla 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. Nyní pomocí Get-Item rutiny 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 na řá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. Nyní pomocí New-Item rutiny přidejte řádek do existující tabulky. PathParametr určuje úplnou cestu k řádku a musí označovat číslo řádku, které je větší než stávající počet řádků v tabulce. TypeParametr označuje "řádek", chcete-li určit typ položky, která má být přidána. Nakonec Value parametr určuje seznam hodnot sloupce pro řádek oddělených čárkami.

    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 nové položky následujícím způsobem.

    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 PowerShell

Navrhování zprostředkovatele Windows PowerShellu

implementace poskytovatele Windows PowerShell položky

implementace poskytovatele Windows PowerShell navigace

Jak registrovat rutiny, zprostředkovatele a hostitelské aplikace

Sada SDK Windows PowerShellu

Příručka programátora Windows PowerShellu