Windows PowerShelles navigációszolgáltató létrehozása

Ez a témakör azt ismerteti, hogyan hozhat létre Windows PowerShell az adattárban navigálni képes navigációs szolgáltatót. Ez a szolgáltatótípus támogatja a rekurzív parancsokat, a beágyazott tárolókat és a relatív útvonalakat.

Megjegyzés

Ehhez a szolgáltatóhoz letöltheti a C#-forrásfájlt (AccessDBSampleProvider05.cs) a Microsoft Windows Vista és .NET-keretrendszer 3.0 Runtime Components for Windows Microsoft Windows Software Development Kit használatával. A letöltési utasításokért lásd: How to Install Windows PowerShell and Download the Windows PowerShell SDK. A letöltött forrásfájlok a könyvtárban <PowerShell Samples> érhetők el. További információ a szolgáltató egyéb Windows PowerShell implementációiról: Designing Your Windows PowerShell Provider(Saját szolgáltató tervezése).

Az itt leírt szolgáltató lehetővé teszi, hogy a felhasználó meghajtóként kezeljen egy Access-adatbázist, így a felhasználó az adatbázisban lévő adattáblákhoz navigálhat. Saját navigációs szolgáltató létrehozásakor olyan metódusokat valósíthat meg, amelyek a navigációhoz szükséges meghajtóval minősített elérési utakat, a relatív útvonalak normalizálását, az adattár elemeinek áthelyezését, valamint a gyermekneveket lekért metódusokat, az elemek szülőútvonalának lekért létrehozását és annak tesztelését teszik lehetővé, hogy az elem tároló-e.

Figyelemfelhívás

Vegye figyelembe, hogy ez a kialakítás egy olyan adatbázist feltételez, amely rendelkezik névazonosítóval, és hogy a mező típusa LongInteger.

A Windows PowerShell meghatározása

Egy Windows PowerShell navigációs szolgáltatónak létre kell hoznia egy .NET-osztályt, amely a System.Management.Automation.Provider.Navigationcmdletprovider alaposztályból származik. Itt található az ebben a szakaszban leírt navigációs szolgáltató osztálydefiníciója.

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

Vegye figyelembe, hogy ebben a szolgáltatóban a System.Management.Automation.Provider.Cmdletproviderattribute attribútum két paramétert tartalmaz. Az első paraméter egy felhasználóbarát nevet ad meg a szolgáltatónak, amelyet a Windows PowerShell. A második paraméter határozza meg Windows PowerShell, hogy a szolgáltató mely konkrét képességeket teszi elérhetővé a Windows PowerShell futtatás során a parancs feldolgozása során. Ehhez a szolgáltatóhoz nincsenek Windows PowerShell funkciók, amelyek hozzáadva.

Alapfunkciók meghatározása

A Design Your PS Provider (PS-szolgáltatótervezése) oldalon leírtak szerint a System.Management.Automation.Provider.Navigationcmdletprovider alaposztály számos más osztályból származik, amelyek különböző szolgáltatói funkciókat biztosítottak. Egy Windows PowerShell navigációs szolgáltatónak ezért meg kell határoznia az adott osztályok által biztosított összes funkciót.

A munkamenet-specifikus inicializálási információk hozzáadását és a szolgáltató által használt erőforrások felszabadítását biztosító funkciók megvalósításához lásd: Alapszintű PS-szolgáltató létrehozása. A legtöbb szolgáltató (beleértve az itt leírt szolgáltatót is) használhatja a szolgáltatás által biztosított alapértelmezett Windows PowerShell.

Ahhoz, hogy egy Windows PowerShell-meghajtón keresztül hozzáférjen az adattárhoz, implementálja a System.Management.Automation.Provider.Drivecmdletprovider alaposztály metódusát. További információ a metódusok megvalósításáról: Új meghajtószolgáltató Windows PowerShell létrehozása.

Az adattár elemeinek (például az elemek lekért, beállításának és törlésének) kezeléséhez a szolgáltatónak implementálhatja a System.Management.Automation.Provider.Itemcmdletprovider alaposztály által biztosított metódusokat. A metódusok megvalósításával kapcsolatos további információkért lásd: Creating an Windows PowerShell Item Provider (Új elemszolgáltató létrehozása).

Az adattár gyermek elemeinek vagy nevének, valamint az elemek létrehozására, másolására, átnevezésre és eltávolítására szolgáló metódusok a System.Management.Automation.Provider.Containercmdletprovider alaposztály által biztosított metódusokat kell megvalósítania. A metódusok megvalósításával kapcsolatos további információkért lásd: Creating a Windows PowerShell Container Provider(Tárolószolgáltató létrehozása).

Elérési út Windows PowerShell létrehozása

Windows PowerShell navigációszolgáltató egy belső szolgáltatói útvonalat Windows PowerShell az adattár elemeinek navigálására. Belső szolgáltatói útvonal létrehozásához a szolgáltatónak implementálja a System.Management.Automation.Provider.Navigationcmdletprovider.Makepath* metódust, amely támogatja a Combine-Path parancsmag hívásait. Ez a metódus a szülő- és gyermekútvonalat egy szolgáltató belső elérési útján egyesíti, a szülő- és gyermekútvonalak közötti szolgáltatóspecifikus elérési útelválasztóval.

Az alapértelmezett implementáció a "/" vagy " elérésiút-elválasztóval megadott elérési utakat használja, az "" karakterre normalizálja az elérésiút-elválasztót, egyesíti a szülő- és gyermekútvonal részeit az elválasztóval, majd visszaad egy sztringet, amely az egyesített elérési utakat \ \ tartalmazza.

Ez a navigációs szolgáltató nem implementálja ezt a módszert. A következő kód azonban a System.Management.Automation.Provider.Navigationcmdletprovider.Makepath* metódus alapértelmezett implementációja.

A MakePath megvalósításával kapcsolatos dolgok

Az alábbi feltételek vonatkozhatnak a System.Management.Automation.Provider.Navigationcmdletprovider.Makepath* implementációra:

  • A System.Management.Automation.Provider.Navigationcmdletprovider.Makepath* metódus megvalósítása nem érvényesítheti az útvonalat jogi teljesen minősített elérési útként a szolgáltatói névtérben. Vegye figyelembe, hogy minden paraméter csak egy elérési út egy részét jelentheti, és előfordulhat, hogy az egyesített részek nem hoznak létre teljes elérési utat. Előfordulhat például, hogy a fájlrendszer-szolgáltató System.Management.Automation.Provider.Navigationcmdletprovider.Makepath* metódusa a "windows\system32" paraméterben, a paraméterben pedig parent a "abc.dll" üzenetet child kapja. A metódus ezeket az értékeket a " " elválasztóval illeszti össze, és "windows\system32\abc.dll" értéket ad vissza, amely nem egy teljes \ fájlrendszer-elérési út.

    Fontos

    A System.Management.Automation.Provider.Navigationcmdletprovider.Makepath* hívásában megadott elérésiút-részek olyan karaktereket tartalmazhatnak, amelyek nem engedélyezettek a szolgáltató névterében. Ezek a karakterek valószínűleg helyettesítő karakteres bővítéshez használatosak, és a metódus implementációja nem távolítja el őket.

A szülőútvonal beolvasása

Windows PowerShell a System.Management.Automation.Provider.Navigationcmdletprovider.Getparentpath* metódust implementálja a jelzett teljes vagy részleges szolgáltatóspecifikus útvonal szülőrészének lekéréséhez. A metódus eltávolítja az elérési út gyermek részét, és visszaadja a szülőútvonal részt. A paraméter a meghajtó gyökerének teljes elérési útját root adja meg. Ez a paraméter lehet null vagy üres, ha a lekérési művelethez nincs használatban csatlakoztatott meghajtó. Ha gyökér van megadva, a metódusnak egy elérési utat kell visszaadni egy olyan tárolóhoz, amely ugyanabban a fában található, mint a gyökér.

A navigációs mintaszolgáltató nem bírálja felül ezt a módszert, hanem az alapértelmezett implementációt használja. Olyan elérési utakat fogad el, amelyek az "/" és a \ " elérésiút-elválasztóként is használhatók. Először normalizálja az útvonalat, hogy csak " " elválasztóval legyen elválasztva, majd az utolsó " karakternél elválasztja a szülőútvonalat, és visszaadja \ \ a szülőútvonalat.

Ne feledje, hogyan lehet a GetParentPath-t megvalósítása során

A System.Management.Automation.Provider.Navigationcmdletprovider.Getparentpath* metódus implementációjának lexikálisan fel kell osztania az elérési utat a szolgáltatói névtér elérésiút-elválasztóján. A fájlrendszerszolgáltató például ezt a metódust használja az utolsó " " kereséshez, és mindent visszaad az \ elválasztótól balra.

A gyermekútvonal nevének lekérése

A navigációs szolgáltató a System.Management.Automation.Provider.Navigationcmdletprovider.Get childname* metódust implementálja az elem gyermekének nevének (levélelemnek) a jelzett teljes vagy részleges szolgáltatóspecifikus elérési úton való lekéréséhez.

A navigációs mintaszolgáltató nem bírálja felül ezt a módszert. Az alapértelmezett megvalósítás alább látható. Olyan elérési utakat fogad el, amelyek az "/" és a \ " elérésiút-elválasztóként is használhatók. Először normalizálja az elérési utat, hogy csak " " elválasztóval lássunk, majd a szülőútvonalat az utolsó " karakternél elválasztjuk, és a gyermekútvonal-rész \ \ nevét adja vissza.

A GetChildName megvalósításával kapcsolatos dolog, amit meg kell jegyezni

A System.Management.Automation.Provider.Navigationcmdletprovider.Getzorname* metódus implementációjának lexikálisan fel kell osztania az elérési utat az elérési út elválasztóján. Ha a megadott elérési út nem tartalmaz elérésiút-elválasztókat, a metódusnak módosítatlan elérési utat kell visszaadni.

Fontos

A metódus hívásában megadott elérési út tartalmazhat olyan karaktereket, amelyek érvénytelenek a szolgáltató névterében. Ezeket a karaktereket valószínűleg helyettesítő karakteres bővítéshez vagy reguláriskifejezés-egyeztetéshez használják, és a metódus implementációja nem távolíthatja el őket.

Annak meghatározása, hogy egy elem tároló-e

A navigációs szolgáltató implementálja a System.Management.Automation.Provider.Navigationcmdletprovider.Isitemcontainer* metódust annak megállapításához, hogy a megadott elérési út egy tárolóra utal-e. Igaz értéket ad vissza, ha az elérési út egy tárolót képvisel, egyébként pedig hamis értéket. A felhasználónak szüksége van erre a metódusra, hogy használni tudja a Test-Path parancsmagot a megadott elérési úthoz.

Az alábbi kód a System.Management.Automation.Provider.Navigationcmdletprovider.Isitemcontainer* implementációt mutatja be a minta navigációs szolgáltatóban. A metódus ellenőrzi, hogy a megadott elérési út helyes-e, és hogy létezik-e a tábla, és true (igaz) értéket ad vissza, ha az elérési út tárolót jelez.

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

Az IsItemContainer megvalósításával kapcsolatos fontos dolgok

A navigációs szolgáltató .NET-osztálya deklarálhatja az ExpandWildcards, Filter, Include vagy Exclude szolgáltatói képességeket a System.Management.Automation.Provider.Providercapabilities enumerálásból. Ebben az esetben a System.Management.Automation.Provider.Navigationcmdletprovider.Isitemcontainer* implementációjának biztosítania kell, hogy a megfelelt elérési út megfeleljen a követelményeknek. Ehhez a metódusnak hozzá kell férni a megfelelő tulajdonsághoz, például a System.Management.Automation.Provider.Cmdletprovider.Exclude* tulajdonsághoz.

Elem mozgatása

A parancsmag támogatása érdekében a navigációs szolgáltató implementálja a Move-Item System.Management.Automation.Provider.Navigationcmdletprovider.Moveitem* metódust. Ez a metódus a paraméter által megadott elemet áthelyezi a path tárolóba a paraméterben megadott elérési destination úton.

A minta navigációs szolgáltató nem bírálja felül a System.Management.Automation.Provider.Navigationcmdletprovider.Moveitem* metódust. Az alapértelmezett megvalósítás a következő.

A MoveItem megvalósításával kapcsolatos dolgok

A navigációs szolgáltató .NET-osztálya deklarálhatja az ExpandWildcards, Filter, Include vagy Exclude szolgáltatói képességeket a System.Management.Automation.Provider.Providercapabilities enumerálásból. Ebben az esetben a System.Management.Automation.Provider.Navigationcmdletprovider.Moveitem* implementációjának meg kell győződnie arról, hogy a megfelelt elérési út megfelel a követelményeknek. Ehhez a metódusnak hozzá kell férni a megfelelő tulajdonsághoz, például a CmdletProvider.Exclude tulajdonsághoz.

Alapértelmezés szerint a metódus felülbírálásai nem szabad objektumokat áthelyezni a meglévő objektumokon, kivéve, ha a System.Management.Automation.Provider.Cmdletprovider.Force* tulajdonság beállítása true . A fájlrendszer-szolgáltató például csak akkor másol c:\temp\abc.txt egy meglévő c:\bar.txt-fájlból, ha a System.Management.Automation.Provider.Cmdletprovider.Force* tulajdonság beállítása true . Ha a paraméterben megadott elérési út létezik és destination egy tároló, a System.Management.Automation.Provider.Cmdletprovider.Force* tulajdonság nem szükséges. Ebben az esetben a System.Management.Automation.Provider.Navigationcmdletprovider.Moveitem* paraméterrel jelölt elemet a paraméter által gyermekként jelölt tárolóba kell path destination áthelyezni.

A System.Management.Automation.Provider.Navigationcmdletprovider.Moveitem* metódus implementációjának meg kell hívnia a System.Management.Automation.Provider.Cmdletprovider.ShouldProcess metódust, és ellenőriznie kell a visszaadott értékét, mielőtt bármilyen módosítást eszközel az adattáron. Ez a metódus a művelet végrehajtásának megerősítésére használatos a rendszerállapot módosításakor, például fájlok törlésekor. A System.Management.Automation.Provider.Cmdletprovider.ShouldProcess elküldi a módosítani szükséges erőforrás nevét a felhasználónak, a Windows PowerShell-runtime használatával, figyelembe véve a parancssori beállításokat vagy preferenciaváltozókat annak meghatározásához, hogy mit kell megjeleníteni a felhasználó számára.

A System.Management.Automation.Provider.Cmdletprovider.ShouldProcess visszaadott hívása után a true System.Management.Automation.Provider.Navigationcmdletprovider.Moveitem* metódusnak a System.Management.Automation.Provider.Cmdletprovider.ShouldContinue metódust kell hívnia. Ez a metódus üzenetet küld a felhasználónak, hogy visszajelzést küld, ha a műveletet folytatni kell. A szolgáltatónak a System.Management.Automation.Provider.Cmdletprovider.ShouldContinue függvényt kell hívnia további ellenőrzésként a potenciálisan veszélyes rendszermódosítások ellenőrzéséhez.

Dinamikus paraméterek csatolása a Move-Item parancsmaghoz

Előfordulhat, hogy a parancsmaghoz további paraméterekre van Move-Item szükség, amelyek dinamikusan vannak megtéve futásidőben. A dinamikus paraméterek megadása érdekében a navigációs szolgáltatónak a System.Management.Automation.Provider.Navigationcmdletprovider.Moveitemdynamicparameters* metódust kell implementálva le kell szereznie a szükséges paraméterértékeket a jelzett elérési úton található elemből, és egy olyan objektumot kell visszaadni, amely a parancsmagosztályhoz vagy a System.Management.Automation.Runtimedefinedparameterdictionary objektumhoz hasonló tulajdonságokat és mezőket tartalmaz.

Ez a navigációs szolgáltató nem implementálja ezt a módszert. A következő kód azonban a System.Management.Automation.Provider.Navigationcmdletprovider.Moveitemdynamicparameters* alapértelmezett implementációja.

Relatív elérési út normalizálása

A navigációs szolgáltató implementálja a System.Management.Automation.Provider.Navigationcmdletprovider.Normalizerelativepath* metódust a paraméterben jelzett teljes elérési út a paraméter által megadott elérési úthoz viszonyított path normalizálásához. basePath A metódus visszaadja a normalizált elérési út sztringes ábrázolása. Hibát ír, ha a paraméter nem létező elérési utat path ad meg.

A navigációs mintaszolgáltató nem bírálja felül ezt a módszert. Az alapértelmezett megvalósítás a következő.

A NormalizeRelativePath megvalósításával kapcsolatos dolgok

A System.Management.Automation.Provider.Navigationcmdletprovider.Normalizerelativepath* implementációja elemezze a paramétert, de nem kell tisztán szintaktikai elemzési adatokat path használnia. Ajánlott úgy tervezni ezt a módszert, hogy az elérési út használatával keresse meg az elérési utat az adattárban, és hozzon létre egy olyan elérési utat, amely megfelel a kis- és a szabványos elérésiút-szintaxisnak.

Kódminta

A teljes mintakódért lásd: AccessDbProviderSample05 – Kódminta.

Objektumtípusok és formázás meghatározása

A szolgáltató hozzáadhat tagokat a meglévő objektumokhoz, vagy új objektumokat definiálhat. További információ:Extending Object Types and Formatting(Objektumtípusok kiterjesztése és formázása).

A Windows PowerShell kiépítése

További információ: How to Register Cmdlets, Providers, and Host Applications (Parancsmagok, szolgáltatók és gazdaalkalmazások regisztrálása).

A Windows PowerShell tesztelése

Ha az Windows PowerShell-szolgáltató regisztrálva van az Windows PowerShell-ben, tesztelheti a támogatott parancsmagok parancssoron való futtatásával, beleértve a származtatással elérhető parancsmagokat is. Ebben a példában a navigációs mintaszolgáltatót fogjuk tesztelni.

  1. Futtassa az új rendszerhéjat, és a parancsmag használatával állítsa be az elérési utat az Set-Location Access-adatbázis jelzésére.

    Set-Location mydb:
    
  2. Most futtassa a parancsmagot az adatbáziselemek listájának lekéréshez, Get-Childitem amelyek az elérhető adatbázistáblák. Ez a parancsmag minden táblához lekéri a táblasorok számát is.

    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. Használja ismét a parancsmagot az Employees adattábla Set-Location helyének beállításához.

    Set-Location Employees
    
  4. Most használjuk a parancsmagot az Employees tábla elérési Get-Location útjának lekérésére.

    Get-Location
    
    Path
    ----
    mydb:\Employees
    
  5. Most használja Get-Childitem a parancsmagnak átkért Format-Table parancsmagot. Ez a parancsmagkészlet lekéri az Employees adattábla elemeit, amelyek a tábla sorai. Ezek a parancsmag által megadott Format-Table formátumban vannak formázva.

    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. Most már futtathatja a parancsmagot az Employees adattábla 0. sorában lévő Get-Item elemek lekéréséhez.

    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. Használja ismét a parancsmagot a 0. sorban lévő elemek alkalmazotti Get-Item adatainak lekéréséhez.

    (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
    

Lásd még:

Adatszolgáltatók Windows PowerShell létrehozása

Saját Windows PowerShell megtervezése

Objektumtípusok és formázás kiterjesztése

Tárolószolgáltató Windows PowerShell megvalósítása

Parancsmagok, szolgáltatók és gazdaalkalmazások regisztrálása

Windows PowerShell – programozói útmutató

Windows PowerShell SDK