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 poskytovatele Windows PowerShell, který dokáže pracovat s vícevrstvými datovými úložišti. Pro tento typ datového úložiště obsahuje horní úroveň úložiště kořenové položky a každá následující úroveň se označuje jako uzel podpoložek. Tím, že uživatel může pracovat na těchto poduzlech, může uživatel hierarchicky komunikovat prostřednictvím datového úložiště.
Poskytovatelé, kteří mohou pracovat s víceúrovňovými datovými úložišti, se nazývají Windows PowerShell kontejneroví poskytovatelé. Mějte však na paměti, že poskytovatel kontejnerů Windows PowerShell lze použít pouze tehdy, když je jeden kontejner (žádné vnořené kontejnery) obsahující položky. Pokud jsou zde vnořené kontejnery, musíte implementovat navigačního poskytovatele Windows PowerShell. Pro více informací o implementaci poskytovatele navigace Windows PowerShell viz Vytvoření poskytovatele navigace Windows PowerShell.
Poznámka:
Zdrojový soubor C# (AccessDBSampleProvider04.cs) tohoto poskytovatele si můžete stáhnout pomocí Microsoft Windows Software Development Kit pro Windows Vista a .NET Framework 3.0 Runtime Components. Pro návod ke stažení viz Jak nainstalovat Windows PowerShell a Stáhněte si Windows PowerShell SDK. Stažené zdrojové soubory jsou dostupné v adresáři <PowerShell Samples> . Pro více informací o dalších implementacích poskytovatelů Windows PowerShell viz Návrh vašeho poskytovatele Windows PowerShell.
Zde popsaný poskytovatel kontejneru Windows PowerShell definuje databázi jako její jediný kontejner, přičemž tabulky a řádky databáze jsou definovány jako položky kontejneru.
Upozornění
Mějte na paměti, že tento návrh předpokládá databázi s polem s ID jména a že typ pole je LongInteger.
Definování třídy poskytovatele kontejnerů Windows PowerShell
Poskytovatel kontejnerů Windows PowerShell musí definovat třídu .NET, která vychází ze základní třídy System.Management.Automation.Provider.ContainerCmdletProvider . Zde je definice třídy pro poskytovatele kontejnerů Windows PowerShell, popsanou v této sekci.
[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : ContainerCmdletProvider
Všimněte si, že v této definici třídy atribut System.Management.Automation.Provider.CmdletProviderAttribute obsahuje dva parametry. První parametr určuje uživatelsky přívětivé jméno poskytovatele, které používá Windows PowerShell. Druhý parametr specifikuje specifické schopnosti Windows PowerShell, které poskytovatel zpřístupňuje běhu Windows PowerShell během zpracování příkazů. Pro tohoto poskytovatele nejsou přidány žádné specifické funkce pro Windows PowerShell.
Definování základní funkcionality
Jak je popsáno v Designing Your Windows PowerShell Provider, třída System.Management.Automation.Provider.ContainerCmdletProvider vychází z několika dalších tříd, které nabízely různé funkce poskytovatele. Poskytovatel kontejnerů Windows PowerShell proto musí definovat veškerou funkcionalitu poskytovanou těmito třídami.
Pro implementaci funkcí pro přidání inicializačních informací specifických pro relaci a pro uvolnění zdrojů používaných poskytovatelem viz Vytvoření základního poskytovatele Windows PowerShell. Většina poskytovatelů (včetně zde popsaného poskytovatele) však může použít výchozí implementaci této funkce, kterou poskytuje Windows PowerShell.
Pro přístup k datovému úložišti musí poskytovatel implementovat metody základní třídy System.Management.Automation.Provider.DriveCmdletProvider . Pro více informací o implementaci těchto metod viz Vytvoření poskytovatele disku Windows PowerShell.
Pro manipulaci s položkami datového úložiště, jako je získávání, nastavování a vyřizování položek, musí poskytovatel implementovat metody poskytované základní třídou System.Management.Automation.Provider.ItemCmdletProvider . Pro více informací o implementaci těchto metod viz Vytvoření poskytovatele položek Windows PowerShell.
Získávání dětských předmětů
Pro získání podpoložky musí poskytovatel kontejneru Windows PowerShell přepsat metodu System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* a podporovat volání z cdletu Get-ChildItem . Tato metoda získává podpoložky z datového úložiště a zapisuje je do pipeline jako objekty. Pokud je parametr cmdletu zadán, recurse metoda načte všechny potomky bez ohledu na jejich úroveň. Pokud parametr recurse není specifikován, metoda získá pouze jednu úroveň potomků.
Zde je implementace metody System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* pro tohoto poskytovatele. Všimněte si, že tato metoda získává podpoložky ve všech databázových tabulkách, když cesta označuje databázi Access, a pokud cesta označuje datovou tabulku, získává podpoložky z řádků této tabulky.
protected override void GetChildItems(string path, bool recurse)
{
// If path represented is a drive then the children in the path are
// tables. Hence all tables in the drive represented will have to be
// returned
if (PathIsDrive(path))
{
foreach (DatabaseTableInfo table in GetTables())
{
WriteItemObject(table, path, true);
// if the specified item exists and recurse has been set then
// all child items within it have to be obtained as well
if (ItemExists(path) && recurse)
{
GetChildItems(path + pathSeparator + table.Name, recurse);
}
} // foreach (DatabaseTableInfo...
} // if (PathIsDrive...
else
{
// Get the table name, row number and type of path from the
// path specified
string tableName;
int rowNumber;
PathType type = GetNamesFromPath(path, out tableName, out rowNumber);
if (type == PathType.Table)
{
// Obtain all the rows within the table
foreach (DatabaseRowInfo row in GetRows(tableName))
{
WriteItemObject(row, path + pathSeparator + row.RowNumber,
false);
} // foreach (DatabaseRowInfo...
}
else if (type == PathType.Row)
{
// In this case the user has directly specified a row, hence
// just give that particular row
DatabaseRowInfo row = GetRow(tableName, rowNumber);
WriteItemObject(row, path + pathSeparator + row.RowNumber,
false);
}
else
{
// In this case, the path specified is not valid
ThrowTerminatingInvalidPathException(path);
}
} // else
} // GetChildItems
Věci, na které je třeba pamatovat při implementaci GetChildItems
Následující podmínky se mohou vztahovat na vaši implementaci System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems*:
Při definování třídy poskytovatele může poskytovatel kontejnerů 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, že cesta předaná metodě splňuje požadavky specifikovaných schopností. K tomu by metoda měla přistupovat k příslušným vlastnostem, například k vlastnostim System.Management.Automation.Provider.CmdletProvider.Exclude* a System.Management.Automation.Provider.CmdletProvider.Include* .
Implementace této metody by měla zohlednit jakoukoli formu přístupu k položce, která by ji mohla učinit uživatelem viditelnou. Například pokud má uživatel zápisový přístup k souboru přes poskytovatele souborového systému (poskytovaného Windows PowerShell), ale nemá přístup ke čtení, soubor stále existuje a System.Management.Automation.Provider.ItemCmdletProvider.ItemExists* vrátí .
trueVaše implementace může vyžadovat kontrolu nadřazeného prvku, zda lze podřadit podřad.Při psaní více položek může metoda System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* trvat nějaký čas. Můžete navrhnout svého poskytovatele tak, aby položky psal metodou System.Management.Automation.Provider.CmdletProvider.WriteItemObject* jednu po druhé. Použitím této techniky se předměty zobrazí uživateli ve streamu.
Vaše implementace System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* je zodpovědná za prevenci nekonečné rekurze při kruhových vazbách a podobně. Měla by být vytvořena vhodná výjimka pro ukončení, která by takovou podmínku odrážela.
Připojení dynamických parametrů k Get-ChildItem Cmdletu
Někdy cmdlet Get-ChildItem , který volá System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems*, vyžaduje další parametry, které jsou dynamicky specifikovány za běhu. Pro poskytnutí těchto dynamických parametrů musí poskytovatel kontejneru Windows PowerShell implementovat metodu System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItemsDynamicParameters* . Tato metoda získává dynamické parametry pro položku na indikované cestě a vrací objekt, který má vlastnosti a pole s atributy pro parsování podobnými třídě cmdlet nebo objektu System.Management.Automation.RuntimeDefinedParameterDictionary . Runtime Windows PowerShell používá vrácený objekt k přidání parametrů do cmdletu Get-ChildItem .
Tento poskytovatel kontejnerů Windows PowerShell tuto metodu neimplementuje. Následující kód je však výchozí implementací této metody.
Získávání názvů dětských položek
Pro získání jmen podřízených položek musí poskytovatel kontejneru Windows PowerShell přepsat metodu System.Management.Automation.Provider.ContainerCmdletProvider.GetChildNames* a podporovat volání z Get-ChildItem cmdletu, když je jeho Name parametr specifikován. Tato metoda získává názvy podpoložek pro zadanou cestu nebo názvy podpoložek pro všechny kontejnery, pokud returnAllContainers je parametr CMDLET zadán. Dětské jméno je listová část cesty. Například dětské jméno cesty C:\windows\system32\abc.dll je "abc.dll". Vedlejší název adresáře C:\windows\system32 je "system32".
Zde je implementace metody System.Management.Automation.Provider.ContainerCmdletProvider.GetChildNames* pro tohoto poskytovatele. Všimněte si, že metoda získává názvy tabulek, pokud zadaná cesta označuje databázi Access (disk), a čísla řádků, pokud cesta označuje tabulku.
protected override void GetChildNames(string path,
ReturnContainers returnContainers)
{
// If the path represented is a drive, then the child items are
// tables. get the names of all the tables in the drive.
if (PathIsDrive(path))
{
foreach (DatabaseTableInfo table in GetTables())
{
WriteItemObject(table.Name, path, true);
} // foreach (DatabaseTableInfo...
} // if (PathIsDrive...
else
{
// Get type, table name and row number from path specified
string tableName;
int rowNumber;
PathType type = GetNamesFromPath(path, out tableName, out rowNumber);
if (type == PathType.Table)
{
// Get all the rows in the table and then write out the
// row numbers.
foreach (DatabaseRowInfo row in GetRows(tableName))
{
WriteItemObject(row.RowNumber, path, false);
} // foreach (DatabaseRowInfo...
}
else if (type == PathType.Row)
{
// In this case the user has directly specified a row, hence
// just give that particular row
DatabaseRowInfo row = GetRow(tableName, rowNumber);
WriteItemObject(row.RowNumber, path, false);
}
else
{
ThrowTerminatingInvalidPathException(path);
}
} // else
} // GetChildNames
Na co si pamatovat při implementaci GetChildNames
Následující podmínky se mohou vztahovat na vaši implementaci System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems*:
Při definování třídy poskytovatele může poskytovatel kontejnerů 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, že cesta předaná metodě splňuje požadavky specifikovaných schopností. K tomu by metoda měla přistupovat k příslušným vlastnostem, například k vlastnostim System.Management.Automation.Provider.CmdletProvider.Exclude* a System.Management.Automation.Provider.CmdletProvider.Include* .
Poznámka:
Výjimkou z tohoto pravidla je, když je parametr v cdletu specifikován.
returnAllContainersV tomto případě by metoda měla získat libovolné podjméno 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řepisy této metody neměly získávat názvy objektů, které jsou obecně skryté před uživatelem, pokud není specifikována vlastnost System.Management.Automation.Provider.CmdletProvider.Force* . Pokud zadaná cesta označuje kontejner, vlastnost System.Management.Automation.Provider.CmdletProvider.Force* není vyžadována.
Vaše implementace System.Management.Automation.Provider.ContainerCmdletProvider.GetChildNames* je zodpovědná za zabránění nekonečné rekurze, když jsou kruhové vazby a podobně. Měla by být vytvořena vhodná výjimka pro ukončení, která by takovou podmínku odrážela.
Připojení dynamických parametrů k Get-ChildItem cmdletu (název)
Někdy cmdlet Get-ChildItem (s parametrem Name ) vyžaduje další parametry, které jsou dynamicky specifikovány za běhu. Pro poskytnutí těchto dynamických parametrů musí poskytovatel kontejneru Windows PowerShell implementovat metodu System.Management.Automation.Provider.ContainerCmdletProvider.GetChildNamesDynamicParameters* . Tato metoda získá dynamické parametry položky na uvedené cestě a vrátí objekt, který má vlastnosti a pole s atributy pro parsování podobnými třídě cmdlet nebo objektu System.Management.Automation.RuntimeDefinedParameterDictionary . Runtime Windows PowerShell používá vrácený objekt k přidání parametrů do cmdletu Get-ChildItem .
Tento poskytovatel tuto metodu neimplementuje. Následující kód je však výchozí implementací této metody.
Přejmenování položek
Pro přejmenování položky musí poskytovatel kontejnerů Windows PowerShell přepsat metodu System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem* a podporovat volání z Rename-Item tohoto cmdletu. Tato metoda mění název položky na určené cestě na nově zadaný název. Nový název musí být vždy vztahující k nadřazenému předmětu (kontejneru).
Tento poskytovatel nepřepisuje metodu System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem* . Následující je však výchozí implementace.
Na co si pamatovat při implementaci RenameItem
Následující podmínky se mohou vztahovat na vaši implementaci System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem*:
Při definování třídy poskytovatele může poskytovatel kontejnerů 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, že cesta předaná metodě splňuje požadavky specifikovaných schopností. K tomu by metoda měla přistupovat k příslušným vlastnostem, například k vlastnostim System.Management.Automation.Provider.CmdletProvider.Exclude* a System.Management.Automation.Provider.CmdletProvider.Include* .
Metoda System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem* je určena pouze pro úpravu názvu položky a nikoli pro operace přesunu. Vaše implementace metody by měla zapsat chybu, pokud
newNameparametr obsahuje oddělovače cest, nebo by jinak mohl způsobit změnu nadřazené pozice položky.Ve výchozím nastavení by přepisy této metody neměly přejmenovávat objekty, pokud není specifikována vlastnost System.Management.Automation.Provider.CmdletProvider.Force* . Pokud zadaná cesta označuje kontejner, vlastnost System.Management.Automation.Provider.CmdletProvider.Force* není vyžadována.
Vaše implementace metody System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem* by měla volat System.Management.Automation.Provider.CmdletProvider.ShouldProcess a zkontrolovat její návratovou hodnotu před jakýmikoli změnami v datovém úložišti. Tato metoda se používá k potvrzení provedení operace při změně stavu systému, například přejmenování souborů. System.Management.Automation.Provider.CmdletProvider.ShouldProcess odesílá uživateli název zdroje, který má být změněn, přičemž runtime Windows PowerShell zohledňuje všechna nastavení příkazové řádky nebo preference proměnné při určování, co má být zobrazeno.
Po volání na System.Management.Automation.Provider.CmdletProvider.ShouldProcess vrátí
true, by měla metoda System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem* zavolat metodu System.Management.Automation.Provider.CmdletProvider.ShouldContinue . Tato metoda odešle uživateli potvrzovací zprávu, která umožňuje další zpětnou vazbu, zda má být operace pokračována. Poskytovatel by měl zavolat System.Management.Automation.Provider.CmdletProvider.ShouldContinue jako další kontrolu pro potenciálně nebezpečné systémové úpravy.
Připojení dynamických parametrů k Rename-Item Cmdletu
Někdy cmdlet Rename-Item vyžaduje další parametry, které jsou dynamicky specifikovány za běhu. Pro poskytnutí těchto dynamických parametrů musí poskytovatel kontejnerů Windows PowerShell implementovat metodu System.Management.Automation.Provider.ContainerCmdletProvider.RenameItemDynamicParameters* . Tato metoda získá parametry položky na uvedené cestě a vrátí objekt, který má vlastnosti a pole s atributy pro parsování podobnými třídě cmdlet nebo objektu System.Management.Automation.RuntimeDefinedParameterDictionary . Runtime Windows PowerShell používá vrácený objekt k přidání parametrů do cmdletu Rename-Item .
Tento poskytovatel kontejnerů tuto metodu neimplementuje. Následující kód je však výchozí implementací této metody.
Vytváření nových položek
Pro vytvoření nových položek musí poskytovatel kontejnerů implementovat metodu System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* pro podporu volání z New-Item cmdletu. Tato metoda vytváří datový prvek umístěný na určené cestě. Parametr type cmdletu obsahuje typ definovaný poskytovatelem pro novou položku. Například poskytovatel souborového systému používá type parametr s hodnotou "file" nebo "directory". Parametr newItemValue cmdletu určuje hodnotu specifickou pro poskytovatele pro novou položku.
Zde je implementace metody System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* pro tohoto poskytovatele.
protected override void NewItem( string path, string type, object newItemValue )
{
// Create the new item here after
// performing necessary validations
//
// WriteItemObject(newItemValue, path, false);
// Example
//
// if (ShouldProcess(path, "new item"))
// {
// // Create a new item and then call WriteObject
// WriteObject(newItemValue, path, false);
// }
} // NewItem
{
case 1:
{
string name = pathChunks[0];
if (TableNameIsValid(name))
{
tableName = name;
retVal = PathType.Table;
}
}
break;
case 2:
{
string name = pathChunks[0];
Věci, na které si zapamatovat při implementaci NewItem
Následující podmínky se mohou vztahovat na vaši implementaci System.Management.Automation.Provider.ContainerCmdletProvider.NewItem*:
Metoda System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* by měla provést porovnání řetězce v parametru
typebez rozlišování podle velkých písmen. Mělo by to také umožnit nejméně nejednoznačných shod. Například pro typy "file" a "directory" je k rozcestení potřeba pouze první písmeno. Pokud parametr označujetypetyp, který váš poskytovatel nemůže vytvořit, metoda System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* by měla napsat ArgumentException se zprávou uvádějící typy, které může poskytovatel vytvořit.Pro parametr
newItemValuese doporučuje implementace metody System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* s minimálním přijímáním řetězců. Měl by také přijímat typ objektu, který je získán metodou System.Management.Automation.Provider.ItemCmdletProvider.GetItem* pro stejnou cestu. Metoda System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* může použít metodu System.Management.Automation.LanguagePrimitives.ConvertTo* k převodu typů 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 zkontrolovat její návratovou hodnotu před jakýmikoli změnami v datovém úložišti. Po vrácení volání na System.Management.Automation.Provider.CmdletProvider.ShouldProcess by mělo být vráceno jako true, by metoda System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* měla volat metodu System.Management.Automation.Provider.CmdletProvider.ShouldContinue jako další kontrolu pro potenciálně nebezpečné systémové úpravy.
Připojení dynamických parametrů k New-Item Cmdletu
Někdy cmdlet New-Item vyžaduje další parametry, které jsou dynamicky specifikovány za běhu. Pro poskytnutí těchto dynamických parametrů musí poskytovatel kontejneru implementovat metodu System.Management.Automation.Provider.ContainerCmdletProvider.NewItemDynamicParameters* . Tato metoda získá parametry položky na uvedené cestě a vrátí objekt, který má vlastnosti a pole s atributy pro parsování podobnými třídě cmdlet nebo objektu System.Management.Automation.RuntimeDefinedParameterDictionary . Runtime Windows PowerShell používá vrácený objekt k přidání parametrů do cmdletu New-Item .
Tento poskytovatel tuto metodu neimplementuje. Následující kód je však výchozí implementací této metody.
Odstraňování položek
Pro odstranění položek musí poskytovatel Windows PowerShell přepsat metodu System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem*, aby podporoval volání z Remove-Item cmdletu. Tato metoda smaže položku z datového úložiště na určené cestě. Pokud recurse je parametr cmdletu Remove-Item nastaven na true, metoda odstraní všechny podpoložky bez ohledu na jejich úroveň. Pokud je parametr nastaven na false, metoda odstraní pouze jednu položku na zadané cestě.
Tento poskytovatel nepodporuje odstraňování položek. Následující kód je však výchozí implementací System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem*.
Věci, na které si zapamatovat při implementaci RemoveItem
Následující podmínky se mohou vztahovat na vaši implementaci System.Management.Automation.Provider.ContainerCmdletProvider.NewItem*:
Při definování třídy poskytovatele může poskytovatel kontejnerů 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, že cesta předaná metodě splňuje požadavky specifikovaných schopností. K tomu by metoda měla přistupovat k příslušným vlastnostem, například k vlastnostim System.Management.Automation.Provider.CmdletProvider.Exclude* a System.Management.Automation.Provider.CmdletProvider.Include* .
Ve výchozím nastavení by přepisy této metody neměly objekty odstraňovat, pokud vlastnost System.Management.Automation.Provider.CmdletProvider.Force* není nastavena na true. Pokud zadaná cesta označuje kontejner, vlastnost System.Management.Automation.Provider.CmdletProvider.Force* není vyžadována.
Vaše implementace System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem* je zodpovědná za prevenci nekonečné rekurze při kruhových vazbách a podobně. Měla by být vytvořena vhodná výjimka pro ukončení, která by takovou podmínku odrážela.
Vaše implementace metody System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem* by měla volat System.Management.Automation.Provider.CmdletProvider.ShouldProcess a zkontrolovat její návratovou hodnotu před jakýmikoli změnami v datovém úložišti. Po vrácení
truevolání System.Management.Automation.Provider.CmdletProvider.ShouldProcess by měla metoda System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem* volat metodu System.Management.Automation.Provider.CmdletProvider.ShouldContinue jako další kontrolu pro potenciálně nebezpečné změny systému.
Připojení dynamických parametrů k Remove-Item Cmdletu
Někdy cmdlet Remove-Item vyžaduje další parametry, které jsou dynamicky specifikovány za běhu. Pro poskytnutí těchto dynamických parametrů musí poskytovatel kontejneru implementovat metodu System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItemDynamicParameters* pro zpracování těchto parametrů. Tato metoda získá dynamické parametry položky na uvedené cestě a vrátí objekt, který má vlastnosti a pole s atributy pro parsování podobnými třídě cmdlet nebo objektu System.Management.Automation.RuntimeDefinedParameterDictionary . Runtime Windows PowerShell používá vrácený objekt k přidání parametrů do cmdletu Remove-Item .
Tento poskytovatel kontejnerů tuto metodu neimplementuje. Následující kód je však výchozí implementací System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItemDynamicParameters*.
Dotazování na podřízené položky
Aby se ověřilo, zda se na dané cestě nacházejí podpoložky, musí poskytovatel kontejneru Windows PowerShell přepsat metodu System.Management.Automation.Provider.ContainerCmdletProvider.HasChildItems* . Tato metoda vrací true , pokud má položka potomky, a false jinak. Pro nulovou nebo prázdnou cestu metoda považuje všechny položky v datovém úložišti za potomky a vrací true.
Zde je přepis pro metodu System.Management.Automation.Provider.ContainerCmdletProvider.HasChildItems* . Pokud je pomocí pomocné metody ChunkPath vytvořeno více než dvě části cesty, metoda vrátí false, protože jsou definovány pouze databázový kontejner a kontejner tabulky. Pro více informací o této pomocné metodě viz metoda ChunkPath je popsána v článku Vytváření Windows PowerShell Item Provider.
protected override bool HasChildItems( string path )
{
return false;
} // HasChildItems
ErrorCategory.InvalidOperation, tableName));
}
return results;
Na co si pamatovat při implementaci HasChildItems
Následující podmínky se mohou vztahovat na vaši implementaci System.Management.Automation.Provider.ContainerCmdletProvider.HasChildItems*:
- Pokud poskytovatel kontejneru zpřístupní kořen obsahující zajímavé montážní body, implementace metody System.Management.Automation.Provider.ContainerCmdletProvider.HasChildItems* by měla vrátit při
truepředání nulového nebo prázdného řetězce pro cestu.
Kopírování položek
Pro zkopírovaní položek musí poskytovatel kontejneru implementovat metodu System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem pro podporu volání z Copy-Item cmdletu. Tato metoda kopíruje datovou položku z místa označeného parametrem path cmdletu do místa označeného parametrem copyPath . Pokud je parametr specifikován, recurse metoda zkopíruje všechny podkontejnery. Pokud parametr není specifikován, metoda zkopíruje pouze jednu úroveň položek.
Tento poskytovatel tuto metodu neimplementuje. Následující kód je však výchozí implementací System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem.
Věci, na které si zapamatovat při implementaci CopyItem
Následující podmínky se mohou vztahovat na vaši implementaci System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem:
Při definování třídy poskytovatele může poskytovatel kontejnerů 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, že cesta předaná metodě splňuje požadavky specifikovaných schopností. K tomu by metoda měla přistupovat k příslušným vlastnostem, například k vlastnostim System.Management.Automation.Provider.CmdletProvider.Exclude* a System.Management.Automation.Provider.CmdletProvider.Include* .
Ve výchozím nastavení by přepisy této metody neměly kopírovat objekty přes existující objekty, pokud vlastnost System.Management.Automation.Provider.CmdletProvider.Force* není nastavena na
true. Například poskytovatel souborového systému nepřekopíruje C:\temp\abc.txt přes existující C:\abc.txt soubor, pokud vlastnost System.Management.Automation.Provider.CmdletProvider.Force* není nastavena natrue. Pokud existuje cesta uvedená v parametrucopyPatha označuje kontejner, vlastnost System.Management.Automation.Provider.CmdletProvider.Force* není vyžadována. V tomto případě by System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem měl zkopírovat položku označenou parametrempathdo kontejneru označeného parametremcopyPathjako potomka.Vaše implementace System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem je zodpovědná za prevenci nekonečné rekurze při kruhových vazbách a podobně. Měla by být vytvořena vhodná výjimka pro ukončení, která by takovou podmínku odrážela.
Vaše implementace metody System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem by měla volat System.Management.Automation.Provider.CmdletProvider.ShouldProcess a zkontrolovat její návratovou hodnotu před jakýmikoli změnami v datovém úložišti. Po vrácení volání na System.Management.Automation.Provider.CmdletProvider.ShouldProcess by mělo být vráceno jako true, by metoda System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem měla volat metodu System.Management.Automation.Provider.CmdletProvider.ShouldContinue jako další kontrolu pro potenciálně nebezpečné systémové úpravy. Pro více informací o volání těchto metod viz Přejmenovat položky.
Připojení dynamických parametrů k Copy-Item Cmdletu
Někdy cmdlet Copy-Item vyžaduje další parametry, které jsou dynamicky specifikovány za běhu. Pro poskytnutí těchto dynamických parametrů musí poskytovatel kontejnerů Windows PowerShell implementovat metodu System.Management.Automation.Provider.ContainerCmdletProvider.CopyItemDynamicParameters* pro zpracování těchto parametrů. Tato metoda získá parametry položky na uvedené cestě a vrátí objekt, který má vlastnosti a pole s atributy pro parsování podobnými třídě cmdlet nebo objektu System.Management.Automation.RuntimeDefinedParameterDictionary . Runtime Windows PowerShell používá vrácený objekt k přidání parametrů do cmdletu Copy-Item .
Tento poskytovatel tuto metodu neimplementuje. Následující kód je však výchozí implementací System.Management.Automation.Provider.ContainerCmdletProvider.CopyItemDynamicParameters*.
Ukázka kódu
Pro kompletní ukázkový kód viz AccessDbProviderSample04 Code Sample.
Vytvoření Windows PowerShell Provider
Podívejte se, jak registrovat cmdlety, poskytovatele a hostitelské aplikace.
Testování Windows PowerShell Provider
Když je váš poskytovatel Windows PowerShell registrován ve Windows PowerShell, můžete to otestovat spuštěním podporovaných cmdletů na příkazovém řádku. Mějte na paměti, že následující příklad používá fiktivní databázi Access.
Spusť
Get-ChildItemcmdlet pro získání seznamu podpoložek z tabulky Customers v databázi Access.Get-ChildItem mydb:customersNásledující výstup se objevuje.
PSPath : AccessDB::customers PSDrive : mydb PSProvider : System.Management.Automation.ProviderInfo PSIsContainer : True Data : System.Data.DataRow Name : Customers RowCount : 91 Columns :Spusť
Get-ChildItemcmdlet znovu, abys získal data tabulky.(Get-ChildItem mydb:customers).DataNásledující výstup se objevuje.
TABLE_CAT : C:\PS\northwind TABLE_SCHEM : TABLE_NAME : Customers TABLE_TYPE : TABLE REMARKS :Nyní použijte
Get-Itemcmdlet k načtení položek v řádku 0 v datové tabulce.Get-Item mydb:\customers\0Následující výstup se objevuje.
PSPath : AccessDB::customers\0 PSDrive : mydb PSProvider : System.Management.Automation.ProviderInfo PSIsContainer : False Data : System.Data.DataRow RowNumber : 0Znovu použít
Get-Itempro získání dat pro položky v řádku 0.(Get-Item mydb:\customers\0).DataNásledující výstup se objevuje.
CustomerID : 1234 CompanyName : Fabrikam ContactName : Eric Gruber ContactTitle : President Address : 4567 Main Street City : Buffalo Region : NY PostalCode : 98052 Country : USA Phone : (425) 555-0100 Fax : (425) 555-0101Nyní použijte
New-Itemcmdlet k přidání řádku do existující tabulky. ParametrPathurčuje celou cestu k řádku a musí uvádět číslo řádku větší než stávající počet řádků v tabulce. Parametr označujeTypeRowurčení typu položky k přidání. NakonecValueparametr specifikuje seznam sloupcových hodnot pro řádek oddělený čárkou.New-Item -Path mydb:\Customers\3 -ItemType "Row" -Value "3,CustomerFirstName,CustomerLastName,CustomerEmailAddress,CustomerTitle,CustomerCompany,CustomerPhone, CustomerAddress,CustomerCity,CustomerState,CustomerZip,CustomerCountry"Ověřte správnost operace s novou položkou následovně.
PS mydb:\> cd Customers PS mydb:\Customers> (Get-Item 3).DataNásledující výstup se objevuje.
ID : 3 FirstName : Eric LastName : Gruber Email : ericgruber@fabrikam.com Title : President Company : Fabrikam WorkPhone : (425) 555-0100 Address : 4567 Main Street City : Buffalo State : NY Zip : 98052 Country : USA
Viz také
Vytváření poskytovatelů Windows PowerShell
Navrhování vašeho poskytovatele Windows PowerShell
Implementace položky Windows PowerShell Provider
Implementace navigačního Windows PowerShell Providera
Jak registrovat cmdlety, poskytovatele a hostitelské aplikace