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ři definování třídy zprostředkovatele může zprostředkovatel kontejneru Windows PowerShell deklarovat schopnosti poskytovatele expandwildcards, filter, include nebo exclude z výčtu System.Management.Automation.Provider.Providercapabilities. 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 schopností. Aby to bylo možné, měla by metoda přistupovat k příslušné vlastnosti, například k vlastnostem System.Management.Automation.Provider.Cmdletprovider.Exclude* a System.Management.Automation.Provider.Cmdletprovider.Include*.
Implementace této metody by měla brát v úvahu jakoukoli formu přístupu k položce, která by mohla zviditelnit položku pro uživatele. Například pokud má uživatel přístup pro zápis k souboru prostřednictvím zprostředkovatele FileSystem (dodaného systémem Windows PowerShell), ale ne oprávnění 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 a zjistit, jestli je možné vytvořit výčet podřízené položky.Při psaní více položek může metoda System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* nějakou dobu trvat. Pomocí metody System.Management.Automation.Provider.Cmdletprovider.Writeitemobject* můžete navrhnout poskytovatele tak, aby položky zapisovat po jednom. Pomocí této techniky zobrazíte položky uživateli ve streamu.
Vaše implementace System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* zodpovídá za zabránění nekonečné rekurze, když jsou cyklická propojení a podobně. Měla by být vyvolána vhodná ukončující výjimka, která takovou podmínku odráží.
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ři definování třídy zprostředkovatele může zprostředkovatel kontejneru Windows PowerShell deklarovat schopnosti poskytovatele expandwildcards, filter, include nebo exclude z výčtu System.Management.Automation.Provider.Providercapabilities. 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 schopností. Aby to bylo možné, měla by metoda přistupovat k příslušné vlastnosti, například k vlastnostem System.Management.Automation.Provider.Cmdletprovider.Exclude* a System.Management.Automation.Provider.Cmdletprovider.Include*.
Poznámka
Výjimka z tohoto pravidla nastane, když
returnAllContainers
je zadán parametr rutiny. V takovém případě by metoda měla načíst libovolný podřízený název kontejneru, i když neodpovídá hodnotám vlastností System.Management.Automation.Provider.Cmdletprovider.Filter*, System.Management.Automation.Provider.Cmdletprovider.Include*nebo System.Management.Automation.Provider.Cmdletprovider.Exclude*.Ve výchozím nastavení by přepsání této metody nemělo načítat názvy objektů, které jsou uživateli obecně skryté, pokud není zadaná vlastnost System.Management.Automation.Provider.Cmdletprovider.Force*. Pokud zadaná cesta označuje kontejner, vlastnost System.Management.Automation.Provider.Cmdletprovider.Force* se nevyžaduje.
Vaše implementace System.Management.Automation.Provider.Containercmdletprovider.Getchildnames* zodpovídá za zabránění nekonečné rekurze, když jsou cyklická propojení a podobně. Měla by být vyvolána vhodná ukončující výjimka, která takovou podmínku odráží.
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ři definování třídy zprostředkovatele může zprostředkovatel kontejneru Windows PowerShell deklarovat schopnosti poskytovatele expandwildcards, filter, include nebo exclude z výčtu System.Management.Automation.Provider.Providercapabilities. 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 schopností. Aby to bylo možné, měla by metoda přistupovat k příslušné vlastnosti, například k vlastnostem System.Management.Automation.Provider.Cmdletprovider.Exclude* a System.Management.Automation.Provider.Cmdletprovider.Include*.
Metoda System.Management.Automation.Provider.Containercmdletprovider.Renameitem* je určená pouze pro úpravy názvu položky, a ne pro operace přesunu. Implementace metody by měla zapsat chybu, pokud parametr obsahuje oddělovače cest, nebo by jinak mohla způsobit, že položka změní
newName
své nadřazené umístění.Ve výchozím nastavení by přepsání této metody nemělo přejmenovávat objekty, pokud není zadaná vlastnost System.Management.Automation.Provider.Cmdletprovider.Force*. Pokud zadaná cesta označuje kontejner, vlastnost System.Management.Automation.Provider.Cmdletprovider.Force* se nevyžaduje.
Vaše implementace metody System. Management. Automation. Provider. Containercmdletprovider. RenameItem * by měla volat metodu System. Management. Automation. Provider. Cmdletprovider. ShouldProcess a před provedením změn v úložišti dat ověřit jeho návratovou hodnotu. Tato metoda slouží k potvrzení provedení operace, když dojde ke změně stavu systému, například k přejmenování souborů. System. Management. Automation. Provider. Cmdletprovider. ShouldProcess odesílá název prostředku, který se má změnit na uživatele, s modulem runtime Windows PowerShell vzít v úvahu jakákoli nastavení příkazového řádku nebo proměnné předvoleb při určování, co by mělo být zobrazeno.
Po volání metody System. Management. Automation. Provider. Cmdletprovider. ShouldProcess
true
by metoda System. Management. Automation. Provider. Containercmdletprovider. RenameItem * měla zavolat metodu System. Management. Automation. Provider. Cmdletprovider. ShouldContinue . Tato metoda pošle uživateli zprávu s potvrzením, aby vysloví, jestli by tato operace měla pokračovat. Poskytovatel by měl volat System. Management. Automation. Provider. Cmdletprovider. ShouldContinue jako další kontrolu pro potenciálně nebezpečné změny systému.
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ě. type
Parametr rutiny obsahuje typ definovaný poskytovatelem pro novou položku. Například poskytovatel systému souborů používá type
parametr s hodnotou "File" nebo "Directory". newItemValue
Parametr 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 *:
Metoda System. Management. Automation. Provider. Containercmdletprovider. zástupného prvku NewItem * by měla provést porovnání bez rozlišování velkých a malých písmen u řetězce předaného v
type
parametru. Měla by také umožňovat nejméně dvojznačné shody. Například pro typy "soubor" a "adresář" se vyžaduje pouze první písmeno, které by bylo možné odstranit. Pokudtype
parametr označuje typ, který zprostředkovatel nemůže vytvořit, metoda System. Management. Automation. Provider. Containercmdletprovider. zástupného prvku NewItem * by měla zapsat hodnotu ArgumentException se zprávou indikující typy, které může poskytovatel vytvořit.Pro
newItemValue
parametr je implementace metody System. Management. Automation. Provider. Containercmdletprovider. zástupného prvku NewItem * doporučena alespoň pro přijímání řetězců. Měl by také přijmout typ objektu, který je načten metodou System. Management. Automation. Provider. Itemcmdletprovider. GetItem * pro stejnou cestu. Metoda System. Management. Automation. Provider. Containercmdletprovider. zástupného prvku NewItem * může použít metodu System. Management. Automation. LanguagePrimitives. ConvertTo * pro převod typů na požadovaný typ.Vaše implementace metody System. Management. Automation. Provider. Containercmdletprovider. zástupného prvku NewItem * by měla volat metodu System. Management. Automation. Provider. Cmdletprovider. ShouldProcess a před provedením změn v úložišti dat ověřit jeho návratovou hodnotu. Po volání metody System. Management. Automation. Provider. Cmdletprovider. ShouldProcess vrátí hodnotu true, metoda System. Management. Automation. Provider. Containercmdletprovider. zástupného prvku NewItem * by měla volat metodu System. Management. Automation. Provider. Cmdletprovider. ShouldContinue jako dodatečnou kontrolu pro potenciálně nebezpečné změny systému.
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ři definování třídy poskytovatele může zprostředkovatel kontejneru Windows PowerShell deklarovat funkce poskytovatele ExpandWildcards, Filter, Include nebo Exclude z výčtu System. Management. Automation. provider. Providercapabilities . V těchto případech vyžaduje implementace metody System. Management. Automation. Provider. Containercmdletprovider. Getchilditems * , aby cesta předaná metodě splňovala požadavky zadaných schopností. K tomu by měla metoda přistupovat k příslušné vlastnosti, například System. Management. Automation. Provider. Cmdletprovider. Exclude * a System. Management. Automation. Provider. Cmdletprovider. include * Properties.
Ve výchozím nastavení by přepsání této metody neměly odebírat objekty, pokud vlastnost System. Management. Automation. Provider. Cmdletprovider. Force * není nastavena na hodnotu true. Pokud zadaná cesta označuje kontejner, vlastnost System. Management. Automation. Provider. Cmdletprovider. Force * není povinná.
Vaše implementace System. Management. Automation. Provider. Containercmdletprovider. RemoveItem * zodpovídá za prevence nekonečné rekurze v případě, že existují cyklické odkazy a podobně jako. Aby odrážela takovou podmínku, měla by být vyvolána vhodná ukončovací výjimka.
Vaše implementace metody System. Management. Automation. Provider. Containercmdletprovider. RemoveItem * by měla volat metodu System. Management. Automation. Provider. Cmdletprovider. ShouldProcess a před provedením změn v úložišti dat ověřit jeho návratovou hodnotu. Po volání metody System. Management. Automation. Provider. Cmdletprovider. ShouldProcess
true
by metoda System. Management. Automation. Provider. Containercmdletprovider. RemoveItem * měla zavolat metodu System. Management. Automation. Provider. Cmdletprovider. ShouldContinue jako dodatečnou kontrolu pro potenciálně nebezpečné změny systému.
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 *:
- Pokud poskytovatel kontejnerů zveřejňuje kořen, který obsahuje zajímavé přípojné body, implementace metody System. Management. Automation. Provider. Containercmdletprovider. Haschilditems * by měla vracet,
true
když je do cesty předán null nebo prázdný řetězec.
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ři definování třídy poskytovatele může zprostředkovatel kontejneru Windows PowerShell deklarovat funkce poskytovatele ExpandWildcards, Filter, Include nebo Exclude z výčtu System. Management. Automation. provider. Providercapabilities . V těchto případech vyžaduje implementace metody System. Management. Automation. Provider. Containercmdletprovider. Getchilditems * , aby cesta předaná metodě splňovala požadavky zadaných schopností. K tomu by měla metoda přistupovat k příslušné vlastnosti, například System. Management. Automation. Provider. Cmdletprovider. Exclude * a System. Management. Automation. Provider. Cmdletprovider. include * Properties.
Ve výchozím nastavení by přepsání této metody nemělo kopírovat objekty přes existující objekty, pokud vlastnost System. Management. Automation. Provider. Cmdletprovider. Force * není nastavena na hodnotu
true
. Například poskytovatel systému souborů nebude kopírovat c:\temp\abc.txt v existujícím souboru c:\abc.txt, pokud vlastnost System. Management. Automation. Provider. Cmdletprovider. Force * není nastavena na hodnotutrue
. Pokud cesta zadaná vcopyPath
parametru existuje a označuje kontejner, vlastnost System. Management. Automation. Provider. Cmdletprovider. Force * se nevyžaduje. V tomto případě by měl System. Management. Automation. Provider. ContainerCmdletProvider. CopyItem zkopírovat položku určenoupath
parametrem do kontejneru označenéhocopyPath
parametrem jako podřízený.Vaše implementace System. Management. Automation. Provider. ContainerCmdletProvider. CopyItem zodpovídá za prevence nekonečné rekurze v případě, že existují cyklické odkazy a podobně jako. Aby odrážela takovou podmínku, měla by být vyvolána vhodná ukončovací výjimka.
Vaše implementace metody System. Management. Automation. Provider. ContainerCmdletProvider. CopyItem by měla volat metodu System. Management. Automation. Provider. Cmdletprovider. ShouldProcess a před provedením změn v úložišti dat ověřit její návratovou hodnotu. Po volání metody System. Management. Automation. Provider. Cmdletprovider. ShouldProcess vrátí hodnotu true, metoda System. Management. Automation. Provider. ContainerCmdletProvider. CopyItem by měla volat metodu System. Management. Automation. Provider. Cmdletprovider. ShouldContinue jako dodatečnou kontrolu pro potenciálně nebezpečné změny systému. Další informace o volání těchto metod naleznete v tématu přejmenování položek.
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.
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 :
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 :
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
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
Nyní pomocí
New-Item
rutiny přidejte řádek do existující tabulky.Path
Parametr 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.Type
Parametr označuje "řádek", chcete-li určit typ položky, která má být přidána. NakonecValue
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"
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
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro