Sdílet prostřednictvím


Vytvoření poskytovatele navigace ve Windows PowerShell

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*:

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ů.

  1. Spusť nový shell a pomocí Set-Location cmdletu nastav cestu pro databázi Access.

    Set-Location mydb:
    
  2. Nyní spusťte Get-ChildItem cmdlet 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 -AutoSize
    
    RowCount   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   Suppliers
    
  3. Použijte Set-Location znovu cmdlet k nastavení umístění datové tabulky Zaměstnanci.

    Set-Location Employees
    
  4. Nyní použijme Get-Location cmdlet k získání cesty ke stolu zaměstnanců.

    Get-Location
    
    Path
    ----
    mydb:\Employees
    
  5. Teď použij cmdlet připojený Get-ChildItem k cmdletu Format-Table . Tato sada cmdletů získává položky pro datovou tabulku Zaměstnanci, což jsou řádky tabulky. Jsou naformátovány podle specifikace Format-Table cmdletu.

    Get-ChildItem | Format-Table RowNumber, PSIsContainer, Data -AutoSize
    
    RowNumber   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.DataRow
    
  6. Nyní můžete spustit Get-Item cmdlet pro načtení položek pro řádek 0 datové tabulky Zaměstnanci.

    Get-Item 0
    
    PSPath        : 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      : 0
    
  7. Použijte Get-Item znovu CMDLET k získání údajů o zaměstnancích pro položky v řádku 0.

    (Get-Item 0).Data
    
    EmployeeID      : 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

Průvodce programátora Windows PowerShell

Windows PowerShell SDK