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 navigačního poskytovatele Windows PowerShell, který dokáže navigovat datové úložiště. Tento typ poskytovatele podporuje rekurzivní příkazy, vnořené kontejnery a relativní cesty.
Poznámka:
Zdrojový soubor C# (AccessDBSampleProvider05.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.
Poskytovatel popsaný zde umožňuje uživateli spravovat databázi Access jako disk, takže může přecházet k datovým tabulkám v databázi. Při vytváření vlastního navigačního poskytovatele můžete implementovat metody, které vyžadují cesty kvalifikované pro navigaci, normalizovat relativní cesty, přesouvat položky z datového úložiště, stejně jako metody, které získávají dětská jména, získávají nadřazenou cestu položky a testují, zda je položka kontejnerem.
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.
Definujte poskytovatele Windows PowerShell
Poskytovatel navigace ve Windows PowerShell musí vytvořit třídu .NET, která vychází ze základní třídy System.Management.Automation.Provider.NavigationCmdletProvider . Zde je definice třídy poskytovatele navigace popsaná v této části.
[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : NavigationCmdletProvider
Všimněte si, že u tohoto poskytovatele 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 knize Design Your PS Provider, základní třída System.Management.Automation.Provider.NavigationCmdletProvider pochází z několika dalších tříd, které poskytovaly různé funkce poskytovatelů. Poskytovatel navigace ve Windows PowerShell proto musí definovat veškerou funkcionalitu poskytovanou těmito třídami.
Pro implementaci funkcí pro přidání specifických inicializačních informací pro relaci a pro uvolnění zdrojů, které poskytovatel používá, viz Vytvoření základního PS poskytovatele. Většina poskytovatelů (včetně zde popsaného poskytovatele) však může použít výchozí implementaci této funkce poskytovanou Windows PowerShell.
Pro přístup k datovému úložišti přes Windows PowerShell disk musíte 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.
Abyste se dostali k podpoložkám nebo jejich názvům datového úložiště, stejně jako k metodám vytvářejícím, kopírujícím, přejmenovávajícím a odstraňujícím položkami, musíte implementovat metody poskytované základní třídou System.Management.Automation.Provider.ContainerCmdletProvider . Pro více informací o implementaci těchto metod viz Vytvoření Windows PowerShell Container Provider.
Vytvoření cesty Windows PowerShell
Poskytovatelé navigace Windows PowerShell používají interní cestu Windows PowerShell pro navigaci v položkách datového úložiště. Pro vytvoření interní cesty poskytovatele musí poskytovatel implementovat metodu System.Management.Automation.Provider.NavigationCmdletProvider.MakePath*, která podporuje volání z Combine-Path cmdletu. Tato metoda kombinuje rodičovskou a podřízenou cestu do interní cesty poskytovatele, přičemž se používá poskytovatelově specifický oddělovač cest mezi rodičovskou a podřízenou cestou.
Výchozí implementace bere cesty s "/" nebo "\" jako oddělovačem cest, normalizuje oddělovač cest na "\", kombinuje rodičovskou a poddanou část cesty s oddělovačem mezi nimi a poté vrací řetězec obsahující kombinované cesty.
Tento poskytovatel navigace tuto metodu neimplementuje. Následující kód je však výchozí implementací metody System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* .
Na co si pamatovat při implementaci MakePath
Následující podmínky se mohou vztahovat na vaši implementaci System.Management.Automation.Provider.NavigationCmdletProvider.MakePath*:
Vaše implementace metody System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* by neměla ověřovat cestu jako legální plně kvalifikovanou cestu v jmenném prostoru poskytovatele. Mějte na paměti, že každý parametr může reprezentovat pouze část cesty a kombinované části nemusí generovat plně kvalifikovanou cestu. Například metoda System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* pro poskytovatele souborového systému může v parametru
parentdostat "windows\system32" a v parametruchild"abc.dll". Metoda spojuje tyto hodnoty pomocí oddělovače "\" a vrací "windows\system32\abc.dll", což není plně kvalifikovaná cesta souborového systému.Důležité
Části cesty poskytnuté ve volání System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* mohou obsahovat znaky, které nejsou povoleny v jmenném prostoru poskytovatele. Tyto postavy jsou pravděpodobně používány pro rozšíření divokých karet a implementace této metody by je neměla odstranit.
Obnovení rodičovské cesty
Poskytovatelé navigace Windows PowerShell implementují metodu System.Management.Automation.Provider.NavigationCmdletProvider.GetParentPath* pro získání nadřazenské části uvedené plně nebo částečně poskytovatelsky specifické cesty. Metoda odstraní podřízenou část cesty a vrátí rodičovskou cestu. Parametr root určuje plně kvalifikovanou cestu ke kořeni disku. Tento parametr může být nulový nebo prázdný, pokud není pro operaci načtení použit namontovaný disk. Pokud je zadán kořen, metoda musí vrátit cestu do kontejneru ve stejném stromu jako kořen.
Poskytovatel ukázkové navigace tuto metodu nepřepsává, ale používá výchozí implementaci. Přijímá cesty, které používají jak "/" tak "\" jako oddělovače cest. Nejprve normalizuje cestu tak, aby měla pouze oddělovače "\", poté oddělí rodičovskou cestu na poslední "\" a vrátí rodičovskou cestu.
Pamatujte si, jak implementovat GetParentPath
Vaše implementace metody System.Management.Automation.Provider.NavigationCmdletProvider.GetParentPath* by měla lexikálně rozdělit cestu na oddělovači cest pro jmenný prostor poskytovatele. Například poskytovatel souborového systému používá tuto metodu k hledání posledního "\" a vrací vše nalevo od oddělovače.
Získejte jméno Dětské cesty
Váš poskytovatel navigace implementuje metodu System.Management.Automation.Provider.NavigationCmdletProvider.GetChildName* k získání názvu (listového prvku) podpoložky položky umístěné na označené plné nebo částečné cestě specifické pro poskytovatele.
Poskytovatel ukázkové navigace tuto metodu nepřepsává. Výchozí implementace je uvedena níže. Přijímá cesty, které používají jak "/" tak "\" jako oddělovače cest. Nejprve normalizuje cestu tak, aby měla pouze oddělovače "\", poté oddělí rodičovskou cestu na poslední "\" a vrátí název podceňské části cesty.
Věci, na které je třeba pamatovat při implementaci GetChildName
Vaše implementace metody System.Management.Automation.Provider.NavigationCmdletProvider.GetChildName* by měla lexikálně rozdělit cestu na oddělovači cest. Pokud dodaná cesta neobsahuje žádné oddělovače cest, měla by metoda vrátit cestu nezměněnou.
Důležité
Cesta uvedená ve volání této metody může obsahovat znaky, které jsou v jmenném prostoru poskytovatele nelegální. Tyto znaky se pravděpodobně používají pro rozšíření divokých karet nebo párování regulárních výrazů a implementace této metody by je neměla odstranit.
Určení, zda je položka kontejnerem
Poskytovatel navigace může implementovat metodu System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer* k určení, zda zadaná cesta označuje kontejner. Vrací true, pokud cesta představuje kontejner, a false jinak. Uživatel potřebuje tuto metodu, aby Test-Path mohl použít cmdlet pro zadanou cestu.
Následující kód ukazuje implementaci System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer* v našem ukázkovém navigačním poskytovateli. Metoda ověřuje, že zadaná cesta je správná a zda tabulka existuje, a vrací pravdu, pokud cesta označuje kontejner.
protected override bool IsItemContainer(string path)
{
if (PathIsDrive(path))
{
return true;
}
string[] pathChunks = ChunkPath(path);
string tableName;
int rowNumber;
PathType type = GetNamesFromPath(path, out tableName, out rowNumber);
if (type == PathType.Table)
{
foreach (DatabaseTableInfo ti in GetTables())
{
if (string.Equals(ti.Name, tableName, StringComparison.OrdinalIgnoreCase))
{
return true;
}
} // foreach (DatabaseTableInfo...
} // if (pathChunks...
return false;
} // IsItemContainer
Na co si pamatovat při implementaci IsItemContainer
Třída vašeho poskytovatele navigace .NET může deklarovat schopnosti poskytovatele ExpandWildcards, Filter, Include nebo Exclude z výčtu System.Management.Automation.Provider.ProviderCapabilities . V tomto případě musí implementace System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer* zajistit, že cesta splněná splňuje požadavky. K tomu by metoda měla přistupovat k příslušné vlastnosti, například k vlastnosti System.Management.Automation.Provider.CmdletProvider.Exclude* .
Přesun předmětu
Na podporu Move-Item cmdletu váš poskytovatel navigace implementuje metodu System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* . Tato metoda přesune položku specifikovanou parametrem path do kontejneru na cestě zadané v parametru destination .
Poskytovatel ukázkové navigace nepřepisuje metodu System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* . Následující je výchozí implementace.
Na co si pamatovat při implementaci MoveItem
Třída vašeho poskytovatele navigace .NET může deklarovat schopnosti poskytovatele ExpandWildcards, Filter, Include nebo Exclude z výčtu System.Management.Automation.Provider.ProviderCapabilities . V tomto případě musí implementace System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* zajistit, že cesta splňuje požadavky. K tomu by metoda měla přistupovat k příslušné vlastnosti, například k vlastnosti CmdletProvider.Exclusion .
Ve výchozím nastavení by přepisy této metody neměly přesouvat objekty nad existujícími 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:\bar.txt soubor, pokud vlastnost System.Management.Automation.Provider.CmdletProvider.Force* není nastavena na true. Pokud cesta uvedená v parametru destination existuje a je kontejnerem, vlastnost System.Management.Automation.Provider.CmdletProvider.Force* není vyžadována. V tomto případě by měl System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* přesunout položku označenou parametrem path do kontejneru označeného parametrem destination jako potomka.
Vaše implementace metody System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* 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ři mazá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 uživateli zobrazeno.
Po volání na System.Management.Automation.Provider.CmdletProvider.ShouldProcess vrátí true, by metoda System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* měla volat metodu System.Management.Automation.Provider.CmdletProvider.ShouldContinue . Tato metoda odesílá uživateli zprávu, která umožňuje zpětnou vazbu, zda má být operace pokračována. Váš 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 Move-Item Cmdletu
Někdy cmdlet Move-Item vyžaduje další parametry, které jsou dynamicky poskytovány za běhu. Pro poskytnutí těchto dynamických parametrů musí poskytovatel navigace implementovat metodu System.Management.Automation.Provider.NavigationCmdletProvider.MoveItemDynamicParameters*, aby získal požadované hodnoty parametrů z položky na uvedené cestě a vrátil objekt s vlastnostmi a poli s atributy pro parsování podobnými klasě cmdlet nebo objektu System.Management.Automation.RuntimeDefinedParameterDictionary .
Tento poskytovatel navigace tuto metodu neimplementuje. Následující kód je však výchozí implementací System.Management.Automation.Provider.NavigationCmdletProvider.MoveItemDynamicParameters*.
Normalizace relativní cesty
Váš poskytovatel navigace implementuje metodu System.Management.Automation.Provider.NavigationCmdletProvider.NormalizeRelativePath*, která normalizuje plně kvalifikovanou cestu uvedenou v parametru path jako relativní k cestě specifikované parametrem basePath . Metoda vrací řetězcovou reprezentaci normalizované cesty. Zapisuje chybu, pokud path parametr specifikuje neexistující cestu.
Poskytovatel ukázkové navigace tuto metodu nepřepsává. Následující je výchozí implementace.
Věci, na které je třeba pamatovat při implementaci NormalizeRelativePath
Vaše implementace System.Management.Automation.Provider.NavigationCmdletProvider.NormalizeRelativePath* by měla parametr parsovat path , ale nemusí používat čistě syntaktické parsování. Doporučujeme navrhnout tuto metodu tak, aby cesta byla použita k vyhledávání informací o cestě v datovém úložišti a vytvořila cestu, která odpovídá časovému a standardizovanému syntaxi cesty.
Ukázka kódu
Pro kompletní ukázkový kód viz AccessDbProviderSample05 Code Sample.
Definování typů objektů a formátování
Je možné, aby poskytovatel přidával členy k existujícím objektům nebo definoval nové objekty. Pro více informací vizRozšíření typů objektů a formátování.
Vytvoření poskytovatele Windows PowerShell
Pro více informací viz Jak registrovat cmdlety, poskytovatele a hostitelské aplikace.
Testování poskytovatele Windows PowerShell
Když je váš poskytovatel Windows PowerShell registrován ve Windows PowerShell, můžete jej otestovat spuštěním podporovaných cmdlets na příkazovém řádku, včetně cmdlets dostupných odvozením. Tento příklad otestuje poskytovatele navigace vzorků.
Spusť nový shell a pomocí
Set-Locationcmdletu nastav cestu pro databázi Access.Set-Location mydb:Nyní spusťte
Get-ChildItemcmdlet pro získání seznamu položek databáze, což jsou dostupné databázové tabulky. Pro každou tabulku tento cmdlet také získá počet řádků tabulky.Get-ChildItem | Format-Table RowCount, Name -AutoSizeRowCount Name -------- ---- 180 MSysAccessObjects 0 MSysACEs 1 MSysCmdbars 0 MSysIMEXColumns 0 MSysIMEXSpecs 0 MSysObjects 0 MSysQueries 7 MSysRelationships 8 Categories 91 Customers 9 Employees 2155 Order Details 830 Orders 77 Products 3 Shippers 29 SuppliersPoužijte
Set-Locationznovu cmdlet k nastavení umístění datové tabulky Zaměstnanci.Set-Location EmployeesNyní použijme
Get-Locationcmdlet k získání cesty ke stolu zaměstnanců.Get-LocationPath ---- mydb:\EmployeesTeď použij cmdlet připojený
Get-ChildItemk cmdletuFormat-Table. Tato sada cmdletů získává položky pro datovou tabulku Zaměstnanci, což jsou řádky tabulky. Jsou naformátovány podle specifikaceFormat-Tablecmdletu.Get-ChildItem | Format-Table RowNumber, PSIsContainer, Data -AutoSizeRowNumber PSIsContainer Data --------- -------------- ---- 0 False System.Data.DataRow 1 False System.Data.DataRow 2 False System.Data.DataRow 3 False System.Data.DataRow 4 False System.Data.DataRow 5 False System.Data.DataRow 6 False System.Data.DataRow 7 False System.Data.DataRow 8 False System.Data.DataRowNyní můžete spustit
Get-Itemcmdlet pro načtení položek pro řádek 0 datové tabulky Zaměstnanci.Get-Item 0PSPath : AccessDB::C:\PS\Northwind.mdb\Employees\0 PSParentPath : AccessDB::C:\PS\Northwind.mdb\Employees PSChildName : 0 PSDrive : mydb PSProvider : System.Management.Automation.ProviderInfo PSIsContainer : False Data : System.Data.DataRow RowNumber : 0Použijte
Get-Itemznovu CMDLET k získání údajů o zaměstnancích pro položky v řádku 0.(Get-Item 0).DataEmployeeID : 1 LastName : Davis FirstName : Sara Title : Sales Representative TitleOfCourtesy : Ms. BirthDate : 12/8/1968 12:00:00 AM HireDate : 5/1/1992 12:00:00 AM Address : 4567 Main Street Apt. 2A City : Buffalo Region : NY PostalCode : 98052 Country : USA HomePhone : (206) 555-9857 Extension : 5467 Photo : EmpID1.bmp Notes : Education includes a BA in psychology from Colorado State University. She also completed "The Art of the Cold Call." Nancy is a member of Toastmasters International. ReportsTo : 2
Viz také
Vytváření poskytovatelů Windows PowerShell
Navrhněte svého poskytovatele Windows PowerShell
Rozšíření typů objektů a formátování
Implementace Container Windows PowerShell provider
Jak registrovat cmdlety, poskytovatele a hostitelské aplikace