Vytvoření zprostředkovatele navigace Windows PowerShellu

toto téma popisuje, jak vytvořit poskytovatele Windows PowerShell navigace, který může přejít do úložiště dat. Tento typ zprostředkovatele podporuje rekurzivní příkazy, vnořené kontejnery a relativní cesty.

Poznámka

zdrojový soubor C# (AccessDBSampleProvider05. cs) pro tohoto zprostředkovatele si můžete stáhnout pomocí sady Microsoft Windows Software Development Kit pro Windows Vista a .NET Framework 3,0 běhových komponent. pokyny ke stažení najdete v tématu jak nainstalovat Windows PowerShell a stáhnout sadu Windows PowerShell SDK. Stažené zdrojové soubory jsou k dispozici v <PowerShell Samples> adresáři. další informace o dalších implementacích poskytovatele Windows PowerShell najdete v tématu navrhování poskytovatele Windows PowerShell.

Poskytovatel, který je zde popsán, umožňuje uživateli zpracovat databázi Access jako jednotku, aby uživatel mohl přejít na tabulky dat v databázi. Při vytváření vlastního poskytovatele navigace můžete implementovat metody, které mohou zpřístupnit jednotky kvalifikované pro navigaci, normalizovat relativní cesty, přesouvat položky úložiště dat a metody, které získávají podřízené názvy, získat nadřazenou cestu položky a otestovat, zda položka je kontejner.

Upozornění

Uvědomte si, že tento návrh předpokládá databázi s polem s ID a typem pole je LongInteger.

definování poskytovatele Windows PowerShell

poskytovatel navigace Windows PowerShell musí vytvořit třídu .net, která je odvozena od základní třídy System. Management. Automation. provider. Navigationcmdletprovider . Tady je definice třídy pro poskytovatele navigace popsané v této části.

[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : NavigationCmdletProvider

Všimněte si, že v tomto zprostředkovateli atribut System. Management. Automation. Provider. Cmdletproviderattribute obsahuje dva parametry. První parametr určuje uživatelsky přívětivý název pro poskytovatele, který je používán Windows PowerShell. druhý parametr určuje Windows PowerShell specifické možnosti, které poskytovatel zpřístupňuje modulu Windows PowerShell runtime během zpracování příkazu. pro tohoto poskytovatele nejsou k dispozici žádné Windows PowerShell konkrétní možnosti, které se přidají.

Definování základních funkcí

Jak je popsáno v tématu design Provider PS, základní třída System. Management. Automation. Provider. Navigationcmdletprovider je odvozena z několika dalších tříd, které poskytují jiné funkce poskytovatele. poskytovatel Windows PowerShell navigace musí proto definovat všechny funkce poskytované těmito třídami.

Chcete-li implementovat funkce pro přidání inicializačních informací specifických pro relaci a uvolnění prostředků používaných zprostředkovatelem, přečtěte si téma Vytvoření základního poskytovatele PS. Většina poskytovatelů (včetně poskytovatele popsaných tady) ale může používat výchozí implementaci této funkce, kterou poskytuje Windows PowerShell.

chcete-li získat přístup k úložišti dat prostřednictvím Windows PowerShell jednotky, je nutné implementovat metody základní třídy System. Management. Automation. Provider. Drivecmdletprovider . další informace o implementaci těchto metod najdete v tématu vytvoření poskytovatele Windows PowerShell jednotky.

Aby bylo možné manipulovat s položkami úložiště dat, jako je například získání, nastavení a mazání položek, poskytovatel musí implementovat metody poskytované základní třídou System. Management. Automation. Provider. Itemcmdletprovider . další informace o implementaci těchto metod naleznete v tématu vytvoření poskytovatele Windows PowerShell položky.

Chcete-li se dostat k podřízeným položkám nebo jejich názvům v úložišti dat a metodám, které vytvářejí, kopírují, přejmenovává a odstraňují položky, je nutné implementovat metody poskytované základní třídou System. Management. Automation. Provider. Containercmdletprovider . další informace o implementaci těchto metod naleznete v tématu vytvoření poskytovatele kontejneru Windows PowerShell.

vytváří se Windows PowerShell cesta.

poskytovatel Windows PowerShell navigace používá pro navigaci v úložišti dat interní Windows PowerShellou cestu zprostředkovatele. Chcete-li vytvořit interní cestu zprostředkovatele, musí zprostředkovatel implementovat metodu System. Management. Automation. Provider. Navigationcmdletprovider. Makepath * , která podporuje volání z rutiny Combine-Path. Tato metoda kombinuje nadřazenou a podřízenou cestu do interní cesty k poskytovateli pomocí oddělovače cest konkrétního poskytovatele mezi nadřazenými a podřízenými cestami.

Výchozí implementace přebírá cesty s "/" nebo " \ " jako oddělovač cest, normalizuje oddělovač cest na " \ ", kombinuje část nadřazené a podřízené cesty k oddělovači mezi nimi a pak vrátí řetězec, který obsahuje kombinované cesty.

Tento zprostředkovatel navigace neimplementuje tuto metodu. Následující kód je však výchozí implementací metody System. Management. Automation. Provider. Navigationcmdletprovider. Makepath * .

Věci, které si zapamatujete o implementaci MakePath

Následující podmínky mohou platit pro implementaci System. Management. Automation. Provider. Navigationcmdletprovider. Makepath *:

Načítání nadřazené cesty

poskytovatelé navigace Windows PowerShell implementují metodu System. Management. Automation. Provider. Navigationcmdletprovider. Getparentpath * , která načte nadřazenou část označené cesty pro úplné nebo částečné zprostředkovatele. Metoda odstraní podřízenou část cesty a vrátí část nadřazené cesty. rootParametr určuje plně kvalifikovanou cestu k kořenovému adresáři jednotky. Tento parametr může mít hodnotu null nebo být prázdný, pokud se připojená jednotka nepoužívá pro operaci načítání. Je-li zadán kořen, metoda musí vracet cestu ke kontejneru ve stejném stromu jako kořenový adresář.

Ukázkový poskytovatel navigace nepřepisuje tuto metodu, ale používá výchozí implementaci. Přijímá cesty, které jako oddělovače cest používají znak "/" i " \ ". Nejprve normalizuje cestu tak, aby měla pouze \ oddělovače, potom rozdělí nadřazenou cestu na poslední \ a a vrátí nadřazenou cestu.

Nezapomeňte o implementaci GetParentPath

Vaše implementace metody System. Management. Automation. Provider. Navigationcmdletprovider. GetParentPath * by měla rozdělit cestu lexikální na oddělovači cesty pro obor názvů poskytovatele. Například poskytovatel systému souborů používá tuto metodu k vyhledání posledního " \ " a vrátí vše vlevo od oddělovače.

Načíst název podřízené cesty

Váš poskytovatel navigace implementuje metodu System. Management. Automation. Provider. Navigationcmdletprovider. GetChild * , aby získala název (prvek list) podřízené položky, která se nachází na zadané úplné nebo částečné cestě specifické pro konkrétního zprostředkovatele.

Ukázkový poskytovatel navigace nepřepisuje tuto metodu. Výchozí implementace je uvedena níže. Přijímá cesty, které jako oddělovače cest používají znak "/" i " \ ". Nejprve normalizuje cestu, aby měla pouze \ oddělovače, potom rozdělí nadřazenou cestu na poslední \ a a vrátí název části podřízené cesty.

Věci, které si zapamatujeme o implementaci getdítěte

Vaše implementace metody System. Management. Automation. Provider. Navigationcmdletprovider. GetChild * by měla rozdělit cestu lexikální na oddělovači cesty. Pokud zadaná cesta neobsahuje žádné oddělovače cest, metoda by měla vrátit cestu beze změny.

Důležité

Cesta poskytnutá v volání této metody může obsahovat znaky, které jsou v oboru názvů poskytovatele neplatné. Tyto znaky jsou pravděpodobně použity pro rozšíření zástupných znaků nebo pro porovnání regulárních výrazů a implementace této metody by je neměla odebírat.

Určení, jestli položka je kontejner

Poskytovatel navigace může implementovat metodu System. Management. Automation. Provider. Navigationcmdletprovider. IsItemContainer * k určení, zda zadaná cesta označuje kontejner. Vrátí hodnotu true, pokud cesta představuje kontejner, a v opačném případě false. Uživatel potřebuje tuto metodu, aby mohl použít Test-Path rutinu pro zadanou cestu.

Následující kód ukazuje implementaci System. Management. Automation. Provider. Navigationcmdletprovider. IsItemContainer * v našem poskytovateli ukázkové navigace. Metoda ověří, zda je zadaná cesta správná a zda tabulka existuje, a vrátí hodnotu true, 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

Věci, které si zapamatujete o implementaci IsItemContainer

Vaše třída .NET poskytovatele navigace může deklarovat funkce 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, aby daná cesta splňovala požadavky. K tomu by měla metoda mít přístup k příslušné vlastnosti, například vlastnost System. Management. Automation. Provider. Cmdletprovider. Exclude * .

Přesunutí položky

V rámci podpory Move-Item rutiny implementuje váš poskytovatel navigace metodu System. Management. Automation. Provider. Navigationcmdletprovider. MoveItem * . Tato metoda přesune položku určenou path parametrem do kontejneru v cestě zadané v destination parametru.

Vzorový poskytovatel navigace nepřepisuje metodu System. Management. Automation. Provider. Navigationcmdletprovider. MoveItem * . Následuje výchozí implementace.

Věci, které si zapamatujete o implementaci MoveItem

Vaše třída .NET poskytovatele navigace může deklarovat funkce poskytovatele ExpandWildcards, Filter, include nebo Exclude z výčtu System. Management. Automation. Provider. ProviderCapabilities . V takovém případě musí implementace System. Management. Automation. Provider. Navigationcmdletprovider. MoveItem * zajistit, aby předaná cesta splňovala požadavky. K tomuto účelu by měla metoda přistupovat k příslušné vlastnosti, například vlastnost CmdletProvider. Exclude .

Ve výchozím nastavení by přepsání této metody neměly přesouvat 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:\bar.txt, pokud vlastnost System. Management. Automation. Provider. Cmdletprovider. Force * není nastavena na hodnotu true . Pokud cesta zadaná v destination parametru existuje a je typu kontejner, vlastnost System. Management. Automation. Provider. Cmdletprovider. Force * není povinná. V tomto případě by měl System. Management. Automation. Provider. Navigationcmdletprovider. MoveItem * přesunout položku označenou path parametrem do kontejneru, který je označen destination parametrem jako podřízený.

Vaše implementace metody System. Management. Automation. Provider. Navigationcmdletprovider. MoveItem * 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 odstraně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čení toho, co by mělo být zobrazeno uživateli.

Po volání metody System. Management. Automation. Provider. Cmdletprovider. ShouldProcess true by metoda System. Management. Automation. Provider. Navigationcmdletprovider. MoveItem * měla zavolat metodu System. Management. Automation. Provider. Cmdletprovider. ShouldContinue . Tato metoda pošle uživateli zprávu, aby mohl odeslat zpětnou vazbu, aby řekla, jestli by měla operace 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ě Move-Item

V některých případech Move-Item rutina vyžaduje další parametry, které jsou k dispozici dynamicky za běhu. Aby bylo možné tyto dynamické parametry poskytnout, musí poskytovatel navigace implementovat metodu System. Management. Automation. Provider. Navigationcmdletprovider. Moveitemdynamicparameters * pro získání požadovaných hodnot parametrů z položky na zadané cestě a vrátí objekt, který obsahuje vlastnosti a pole s atributy analýzy podobným třídě rutiny nebo objektu System. Management. Automation. Runtimedefinedparameterdictionary .

Tento zprostředkovatel navigace neimplementuje tuto metodu. 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 * pro normalizaci plně kvalifikované cesty označené v path parametru jako relativní vzhledem k cestě určené basePath parametrem. Metoda vrátí řetězcovou reprezentaci normalizované cesty. Zapisuje chybu, pokud path parametr určuje neexistující cestu.

Ukázkový poskytovatel navigace nepřepisuje tuto metodu. Následuje výchozí implementace.

Věci, které si zapamatujete o implementaci NormalizeRelativePath

Vaše implementace System. Management. Automation. Provider. Navigationcmdletprovider. Normalizerelativepath * by měla analyzovat path parametr, ale nemusí používat čistě syntaktickou analýzu. Doporučujeme navrhnout tuto metodu, aby používala cestu k vyhledání informací o cestě v úložišti dat, a vytvořit cestu, která se shoduje s syntaxí pro velká a standardizovanou cestu.

Vzorek kódu

Úplný vzorový kód naleznete v tématu AccessDbProviderSample05 Code Sample.

Definování typů objektů a formátování

Zprostředkovatel může přidat členy do existujících objektů nebo definovat nové objekty. Další informace najdete v tématurozšíření typů objektů a formátování.

sestavování poskytovatele Windows PowerShell

Další informace najdete v tématu 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, včetně rutiny, které jsou k dispozici odvozením. Tento příklad provede test ukázkového poskytovatele navigace.

  1. Spusťte nové prostředí a pomocí Set-Location rutiny nastavte cestu k označení databáze Access.

    Set-Location mydb:
    
  2. Nyní spusťte Get-Childitem rutinu, která načte seznam databázových položek, které jsou dostupné tabulky databáze. Pro každou tabulku Tato rutina také načte 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. Set-LocationOpětovným použitím rutiny nastavte umístění tabulky dat Employees.

    Set-Location Employees
    
  4. Pojďme teď Get-Location rutinu použít k načtení cesty k tabulce Employees.

    Get-Location
    
    Path
    ----
    mydb:\Employees
    
  5. Teď použijte Get-Childitem rutinu potrubou do Format-Table rutiny. Tato sada rutin načte položky pro tabulku dat Employees, což jsou řádky tabulky. Jsou formátovány tak, jak jsou určeny Format-Table rutinou.

    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 rutinu, která načte položky pro řádek 0 tabulky dat Employees.

    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. Pomocí Get-Item rutiny znovu načtěte data zaměstnanců 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í zprostředkovatelů Windows PowerShell

návrh poskytovatele Windows PowerShell

Rozšíření typů objektů a formátování

implementace poskytovatele Windows PowerShell kontejnerů

Jak registrovat rutiny, zprostředkovatele a hostitelské aplikace

Příručka programátora Windows PowerShellu

Sada SDK Windows PowerShellu