Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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ři definování třídy zprostředkovatele může poskytovatel kontejneru Windows PowerShell deklarovat možnosti zprostředkovatele ExpandWildcards, Filter, Include nebo Exclude z System.Management.Automation.Provider.ProviderCapabilities výčtu. V těchto případech musí implementace metody System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* zajistit, aby cesta předaná metodě splňovala požadavky zadaných funkcí. K tomu by metoda měla přistupovat k příslušné vlastnosti, například System.Management.Automation.Provider.CmdletProvider.Exclude* a System.Management.Automation.Provider.CmdletProvider.Include* vlastnosti.
Implementace této metody by měla vzít v úvahu jakoukoli formu přístupu k položce, která by mohla zpřístupnit položku uživateli. Pokud má uživatel například přístup k zápisu k souboru prostřednictvím zprostředkovatele FileSystem (dodaný prostředím Windows PowerShell), ale nemá přístup ke čtení, soubor stále existuje a System.Management.Automation.Provider.ItemCmdletProvider.ItemExists* vrátí
true
. Vaše implementace může vyžadovat kontrolu nadřazené položky, aby se zjistilo, jestli je možné vytvořit výčet podřízené položky.Při psaní více položek může System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* metoda nějakou dobu trvat. Zprostředkovatele můžete navrhnout tak, aby zapisuje položky pomocí metody System.Management.Automation.Provider.CmdletProvider.WriteItemObject* po jednom. Pomocí této techniky zobrazíte položky uživateli ve streamu.
Vaše implementace System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* je zodpovědná za zabránění nekonečné rekurze, pokud existují cyklické vazby a podobně. Aby se taková podmínka projevila, měla by být vyvolán příslušná ukončovací výjimka.
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ři definování třídy zprostředkovatele může poskytovatel kontejneru Windows PowerShell deklarovat možnosti zprostředkovatele ExpandWildcards, Filter, Include nebo Exclude z System.Management.Automation.Provider.ProviderCapabilities výčtu. V těchto případech musí implementace metody System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* zajistit, aby cesta předaná metodě splňovala požadavky zadaných funkcí. K tomu by metoda měla přistupovat k příslušné vlastnosti, například System.Management.Automation.Provider.CmdletProvider.Exclude* a System.Management.Automation.Provider.CmdletProvider.Include* vlastnosti.
Poznámka:
K výjimce tohoto pravidla dochází, když je zadán parametr
returnAllContainers
rutiny. V tomto případě by metoda měla načíst libovolný podřízený název kontejneru, i když neodpovídá hodnotám System.Management.Automation.Provider.CmdletProvider.Filter*, System.Management.Automation.Provider.CmdletProvider.Include*nebo System.Management.Automation.Provider.CmdletProvider.Exclude* vlastnosti.Ve výchozím nastavení by přepsání této metody nemělo načítat názvy objektů, které jsou obecně skryty od uživatele, pokud není zadána vlastnost System.Management.Automation.Provider.CmdletProvider.Force*. Pokud zadaná cesta označuje kontejner, System.Management.Automation.Provider.CmdletProvider.Force* vlastnost není nutná.
Vaše implementace System.Management.Automation.Provider.ContainerCmdletProvider.GetChildNames* je zodpovědná za zabránění nekonečné rekurze, pokud existují cyklické vazby a podobně. Aby se taková podmínka projevila, měla by být vyvolán příslušná ukončovací výjimka.
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ři definování třídy zprostředkovatele může poskytovatel kontejneru Windows PowerShell deklarovat možnosti zprostředkovatele ExpandWildcards, Filter, Include nebo Exclude z System.Management.Automation.Provider.ProviderCapabilities výčtu. V těchto případech musí implementace metody System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* zajistit, aby cesta předaná metodě splňovala požadavky zadaných funkcí. K tomu by metoda měla přistupovat k příslušné vlastnosti, například System.Management.Automation.Provider.CmdletProvider.Exclude* a System.Management.Automation.Provider.CmdletProvider.Include* vlastnosti.
Metoda System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem* je určena k úpravě názvu pouze položky, a ne pro operace přesunutí. Implementace metody by měla napsat chybu, pokud
newName
parametr obsahuje oddělovače cest, nebo by jinak mohla způsobit, že položka změní nadřazené umístění.Ve výchozím nastavení by přepsání této metody nemělo přejmenovat objekty, pokud není zadána vlastnost System.Management.Automation.Provider.CmdletProvider.Force*. Pokud zadaná cesta označuje kontejner, System.Management.Automation.Provider.CmdletProvider.Force* vlastnost není nutná.
Implementace metody System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem* by měla volat metodu System.Management.Automation.Provider.CmdletProvider.ShouldProcess a před provedením jakýchkoli změn v úložišti dat zkontrolovat jeho návratovou hodnotu. Tato metoda slouží k potvrzení provádění operace při změně stavu systému, například přejmenování souborů. System.Management.Automation.Provider.CmdletProvider.ShouldProcess odešle uživateli název prostředku, který se má změnit, s modulem runtime Windows PowerShellu s ohledem na nastavení příkazového řádku nebo proměnné předvoleb při určování toho, co se má zobrazit.
Po volání System.Management.Automation.Provider.CmdletProvider.ShouldProcess vrátí
true
, System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem* metoda by měla volat System.Management.Automation.Provider.CmdletProvider.ShouldContinue metoda. Tato metoda odešle uživateli zprávu s potvrzením, která uživateli umožní další zpětnou vazbu, která řekne, jestli má operace pokračovat. Poskytovatel by měl volat System.Management.Automation.Provider.CmdletProvider.ShouldContinue jako další kontrolu potenciálně nebezpečných úprav systému.
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*:
Metoda System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* by měla provádět porovnání řetězce předávaného v parametru
type
nerozlišující malá a velká písmena. Měla by také umožňovat nejednoznačné shody. Například pro typy "file" a "directory" se k nejednoznačnosti vyžaduje pouze první písmeno. Pokudtype
parametr indikuje typ, který váš poskytovatel nemůže vytvořit, System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* metoda by měla napsat ArgumentException se zprávou označující typy, které může poskytovatel vytvořit.Pro
newItemValue
parametr se doporučuje implementace metody System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* minimálně přijímat řetězce. Měl by také přijmout typ objektu, který je načten System.Management.Automation.Provider.ItemCmdletProvider.GetItem* metoda pro stejnou cestu. Metoda System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* může použít metodu System.Management.Automation.LanguagePrimitives.ConvertTo* metodu převést typy na požadovaný typ.Vaše implementace metody System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* by měla volat System.Management.Automation.Provider.CmdletProvider.ShouldProcess a před provedením jakýchkoli změn v úložišti dat zkontrolovat jeho návratovou hodnotu. Po volání System.Management.Automation.Provider.CmdletProvider.ShouldProcess vrátí hodnotu true, System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* metoda by měla volat System.Management.Automation.Provider.CmdletProvider.ShouldContinue metoda jako další kontrola potenciálně nebezpečných úprav systému.
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ři definování třídy zprostředkovatele může poskytovatel kontejneru Windows PowerShell deklarovat možnosti zprostředkovatele ExpandWildcards, Filter, Include nebo Exclude z System.Management.Automation.Provider.ProviderCapabilities výčtu. V těchto případech musí implementace metody System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* zajistit, aby cesta předaná metodě splňovala požadavky zadaných funkcí. K tomu by metoda měla přistupovat k příslušné vlastnosti, například System.Management.Automation.Provider.CmdletProvider.Exclude* a System.Management.Automation.Provider.CmdletProvider.Include* vlastnosti.
Ve výchozím nastavení by přepsání této metody nemělo odebírat objekty, pokud je vlastnost System.Management.Automation.Provider.CmdletProvider.Force* nastavena na hodnotu true. Pokud zadaná cesta označuje kontejner, System.Management.Automation.Provider.CmdletProvider.Force* vlastnost není nutná.
Vaše implementace System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem* je zodpovědná za zabránění nekonečné rekurze, pokud existují cyklické vazby a podobně. Aby se taková podmínka projevila, měla by být vyvolán příslušná ukončovací výjimka.
Vaše implementace metody System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem* by měla volat metoduSystem.Management.Automation.Provider.CmdletProvider.ShouldProcess a před provedením jakýchkoli změn v úložišti dat zkontrolovat jeho návratovou hodnotu. Po volání System.Management.Automation.Provider.CmdletProvider.ShouldProcess vrátí
true
, System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem* metoda by měla volat System.Management.Automation.Provider.RutinProvider.ShouldContinue metoda jako další kontrola potenciálně nebezpečných úprav systému.
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*:
- Pokud zprostředkovatel kontejneru zveřejňuje kořen, který obsahuje zajímavé přípojné body, implementace System.Management.Automation.Provider.ContainerCmdletProvider.HasChildItems* metoda by měla vrátit
true
při předání null nebo prázdného řetězce pro cestu.
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ři definování třídy zprostředkovatele může poskytovatel kontejneru Windows PowerShell deklarovat možnosti zprostředkovatele ExpandWildcards, Filter, Include nebo Exclude z System.Management.Automation.Provider.ProviderCapabilities výčtu. V těchto případech musí implementace metody System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* zajistit, aby cesta předaná metodě splňovala požadavky zadaných funkcí. K tomu by metoda měla přistupovat k příslušné vlastnosti, například System.Management.Automation.Provider.CmdletProvider.Exclude* a System.Management.Automation.Provider.CmdletProvider.Include* vlastnosti.
Ve výchozím nastavení by přepsání této metody nemělo kopírovat objekty nad existujícími objekty, pokud System.Management.Automation.Provider.CmdletProvider.Force* vlastnost je nastavena na
true
. Zprostředkovatel fileSystem například nebude kopírovat C:\temp\abc.txt přes existující C:\abc.txt soubor, pokud System.Management.Automation.Provider.CmdletProvider.Force* vlastnost je nastavena natrue
. Pokud cesta zadaná v parametrucopyPath
existuje a indikuje kontejner, není vyžadována vlastnost System.Management.Automation.Provider.CmdletProvider.Force*. V tomto případě System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem by měla zkopírovat položku označenou parametrempath
do kontejneru označeného parametremcopyPath
jako podřízený.Vaše implementace System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem je zodpovědná za zabránění nekonečné rekurze, pokud existují cyklické vazby a podobně. Aby se taková podmínka projevila, měla by být vyvolán příslušná ukončovací výjimka.
Implementace metody System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem by měla volat metodu System.Management.Automation.Provider.CmdletProvider.ShouldProcess a před provedením jakýchkoli změn v úložišti dat zkontrolovat jeho návratovou hodnotu. Po volání System.Management.Automation.Provider.CmdletProvider.ShouldProcess vrátí hodnotu true, System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem metoda by měla volat metodu System.Management.Automation.Provider.RutinProvider.ShouldContinue jako další kontrolu potenciálně nebezpečných úprav systému. Další informace o volání těchto metod naleznete v tématu Přejmenovat položky.
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.
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 :
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 :
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
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
Teď pomocí rutiny
New-Item
přidejte řádek do existující tabulky. ParametrPath
určuje úplnou cestu k řádku a musí označit číslo řádku, které je větší než existující počet řádků v tabulce. ParametrType
označuje,Row
určit typ položky, kterou chcete přidat. Nakonec parametrValue
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"
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