Megosztás a következőn keresztül:


Windows PowerShell navigációs szolgáltató létrehozása

Ez a téma bemutatja, hogyan lehet létrehozni egy Windows PowerShell navigációs szolgáltatót, amely képes navigálni az adattárolóban. Ez a szolgáltatótípus támogatja a rekurzív parancsokat, beágyazott konténereket és relatív útvonalakat.

Megjegyzés:

Letöltheti a C# forrásfájlt (AccessDBSampleProvider05.cs) ehhez a szolgáltatóhoz a Microsoft Windows Software Development Kit for Windows Vista és a .NET Framework 3.0 Runtime Components segítségével. A letöltési utasításokért lásd: Hogyan telepítsük a Windows PowerShell és a Windows PowerShell SDK letöltése. A letöltött forrásfájlok elérhetők a <PowerShell Samples> könyvtárban. További információért más Windows PowerShell szolgáltató megvalósításokról lásd: Designing Your Windows PowerShell Provider.

Az itt leírt szolgáltató lehetővé teszi a felhasználó számára, hogy az Access adatbázist meghajtóként kezelje, így a felhasználó navigálhasson az adatbázis adattábláihoz. Saját navigációs szolgáltató létrehozásakor olyan metóduszokat valósíthatsz meg, amelyek meghajtó által minősített útvonalakat készítenek a navigációhoz, normalizálják a relatív utakat, mozgatják az adattároló elemeit, valamint olyan metóduszokat, amelyek gyermekneveket kapnak, egy elem szülőútját kapják, és tesztelik, hogy egy elem konténer-e.

Caution

Fontos tudni, hogy ez a kialakítás egy olyan adatbázist feltételez, amelynek van egy mezője a névazonosítóval, és a mező típusa LongInteger.

Definiáld a Windows PowerShell szolgáltatót

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. Íme a navigációs szolgáltató osztálydefiníciója, amelyet ebben a szakaszban leírtak.

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

Megjegyzendő, 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 a szolgáltatónak, amelyet a Windows PowerShell használ. A második paraméter meghatározza azokat a Windows PowerShell-specifikus képességeket, amelyeket a szolgáltató a Windows PowerShell futási idejének a parancsfeldolgozás során kiterjeszt. Ennél a szolgáltatónál nincsenek Windows PowerShell-specifikus funkciók, amelyek hozzáadnak.

Az alapfunkcionalitás meghatározása

Ahogy a Design Your PS Provider című részben leírva, a System.Management.Automation.Provider.NavigationCmdletProvider alaposztály több más osztályból származik, amelyek eltérő szolgáltatói funkciókat biztosítottak. Ezért egy Windows PowerShell navigációs szolgáltatónak meg kell határoznia az összes ilyen osztály által biztosított funkciót.

A sessionspecifikus inicializációs információk hozzáadására és a szolgáltató által használt erőforrások felszabadítására vonatkozó funkciók megvalósításához lásd: Alap PS szolgáltató létrehozása. Azonban a legtöbb szolgáltató (beleértve az itt leírt szolgáltatót is) használhatja ennek a funkciónak a Windows PowerShell alapértelmezett megvalósítását.

Ahhoz, hogy hozzáférj az adattárolóhoz Windows PowerShell meghajtón keresztül, implementálnod kell a System.Management.Automation.Provider.DriveCmdletProvider alaposztály módszereit. További információért ezeknek a módszereknek a megvalósításáról lásd: Windows PowerShell meghajtó szolgáltató létrehozása.

Az adattároló elemeinek, például az elemek megszerzése, beállítása és törlése kezelésére a szolgáltatónak a System.Management.Automation.Provider.ItemCmdletProvider alaposztály által biztosított módszereket kell alkalmaznia. További információért ezeknek a módszereknek a megvalósításáról lásd : Windows PowerShell Item Provider létrehozása.

Az adattároló gyermekelemeihez, vagyis azok nevéhez, valamint az elemeket létrehozó, másoló, átnevező és eltávolító metódusokhoz szükséges módszerek megvalósítása a System.Management.Automation.Provider.ContainerCmdletProvider alaposztály által biztosított metódusokat kell megvalósítani. További információért ezeknek a módszereknek a megvalósításáról lásd : Windows PowerShell konténer szolgáltató létrehozása.

Windows PowerShell útvonal létrehozása

A Windows PowerShell navigációs szolgáltató egy szolgáltató belső Windows PowerShell útvonalat használ az adattároló elemei közötti navigáláshoz. A szolgáltató-belső útvonal létrehozásához a szolgáltatónak a System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* metóduát kell alkalmaznia, hogy támogassa a Combine-Path cmdlet hívásait. Ez a módszer egy szülő- és gyermek útvonalat kombinál egy szolgáltató-belső útba, szolgáltató-specifikus útelválasztót használva a szülő- és gyermek útvonalak között.

Az alapértelmezett megvalósítás olyan útvonalakat vesz fel, amelyekben az "/" vagy "\" az útvonal elválasztója, normalizálja az útvonal elválasztóját "\"-ra, egyesíti a szülő- és gyermek útrészeket a közöttük lévő elválasztóval, majd visszaad egy stringet, amely tartalmazza az egyesített utakat.

Ez a navigációs szolgáltató nem alkalmazza ezt a módszert. Azonban a következő kód a System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* metódus alapértelmezett implementációja.

Fontos dolgok, amiket érdemes megjegyezni a MakePath bevezetéséről

Az alábbi feltételek alkalmazhatók a System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* megvalósítására:

  • A System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* módszer implementációja nem igazolhatja az útvonalat jogilag teljesen minősített útként a szolgáltató névtérben. Ne feledd, hogy minden paraméter csak egy útvonal egy részét képviselheti, és az egyesített részek nem feltétlenül generálnak teljesen minősített utat. Például a System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* módszer a FileSystem szolgáltató számára a paraméterben "windows\system32 parent " és a paraméterben a "abc.dll" child értéket kaphatja. A metódus ezeket az értékeket a "\" elválasztóval egyesíti, és a "windows\system32\abc.dll" értéket adja vissza, ami nem egy teljesen minősített fájlrendszer út.

    Fontos

    A System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* hívásban megadott útvonalrészek tartalmazhatnak olyan karaktereket, amelyek nem engedélyezettek a szolgáltató névtérben. Ezeket a karaktereket valószínűleg vadkártya bővítéshez használják, és ennek a módszernek a bevezetése nem szabadna eltávolítani őket.

A szülői út visszakeresése

A Windows PowerShell navigációs szolgáltatók a System.Management.Automation.Provider.NavigationCmdletProvider.GetParentPath* módszert alkalmazzák, hogy lekérjék a megadott teljes vagy részleges szolgáltató-specifikus út szülőrészét. A metódus eltávolítja az út gyermekrészét, és visszaadja a szülő út részét. A root paraméter meghatározza a teljes minősítésű utat a meghajtó gyökeréhez. Ez a paraméter null vagy üres lehet, ha nem használatban van egy beépített meghajtó a lekérdezési művelethez. Ha egy gyökér van megadva, a módszernek vissza kell térnie egy utat egy konténerhez ugyanabban a fában, mint a gyökér.

A mintanavigációs szolgáltató nem írja felül ezt a módszert, hanem az alapértelmezett implementációt használja. Elfogadja azokat az utakat, amelyek mind a "/" mind a "\" útvonalválasztóként használják. Először normalizálja az útvonalat úgy, hogy csak "\" elválasztók legyenek, majd az utolsó "\"-nál elválasztja a szülői útvonalat, és visszaadja a szülő útvonalat.

Emlékezni a GetParentPath bevezetésére

A System.Management.Automation.Provider.NavigationCmdletProvider.GetParentPath* metódus implementációja lexikikusan kell, hogy szétválassza az út szétválasztását a szolgáltató névtér számára. Például a FileSystem szolgáltató ezt a módszert használja az utolsó "\" keresésére, és mindent visszaad a szeparátor bal oldalán.

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

A navigációs szolgáltató a System.Management.Automation.Provider.NavigationCmdletProvider.GetChildName* módszert alkalmazza, hogy lekérje a termék gyermekének nevét (levélelemét) a megadott teljes vagy részleges szolgáltató-specifikus úton.

A mintanavigációs szolgáltató nem írja felül ezt a módszert. Az alapértelmezett megvalósítás az alábbiakban látható. Elfogadja azokat az utakat, amelyek mind a "/" mind a "\" útvonalválasztóként használják. Először normalizálja az útvonalat úgy, hogy csak "\" elválasztói vannak, majd az utolsó "\"-nál elválasztja az övösvényt, és visszaadja a gyermek útrész nevét.

Fontos dolgok, amiket érdemes megjegyezni a GetChildName bevezetésével kapcsolatban

A System.Management.Automation.Provider.NavigationCmdletProvider.GetChildName* metódus implementációja lexixiailag kell osztani az útvonal elválasztóján. Ha a megadott út nem tartalmaz útvonalválasztókat, akkor a metódusnak módosítatlanul kell visszaadnia az útvonalat.

Fontos

A metódus hívásában megadott útvonal tartalmazhat olyan karaktereket, amelyek illegálisak a szolgáltató névtérében. Ezeket a karaktereket valószínűleg vadkártya bővítéshez vagy reguláris kifejezések párosításához használják, és ennek a módszernek a bevezetése nem távolíthatja el őket.

Annak meghatározása, hogy egy tárgy konténer-e

A navigációs szolgáltató megvalósíthatja a System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer* metódust, hogy megállapítsa, a megadott út konténert jelöl-e. True értéket ad, ha az út egy konténert képvisel, és egyébként hamis. A felhasználónak szüksége van erre a módszerre, hogy a csomagoldót a megadott úthoz használni tudja Test-Path .

A következő kód a System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer* megvalósítást mutatja a mintanavigációs szolgáltatónkban. A metódus igazolja, hogy a megadott út helyes-e, és hogy létezik-e a tábla, és ha az út egy konténert jelöl, igaz értéket ad vissza.

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

Fontos dolgok, amiket érdemes megjegyezni az IsItemContainer megvalósításához

A navigációs szolgáltatód .NET osztálya bejelentheti az ExpandWildcards, Filter, Include, or Exclude szolgáltatói képességeit a System.Management.Automation.Provider.ProviderCapabilities felsorolásából. Ebben az esetben a System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer* megvalósításának biztosítania kell, hogy a megadott út megfeleljen a követelményeknek. Ehhez a metódusnak hozzá kell férnie a megfelelő tulajdonsághoz, például a System.Management.Automation.Provider.CmdletProvider.Exclude* tulajdonsághoz.

Egy tárgy mozgatása

A Move-Item cmdlet támogatására a navigációs szolgáltató a System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* metódusát valósítja meg. Ez a módszer a paraméter által megadott path elemet a paraméterben megadott konténerbe helyezi át a paraméterben megadott destination úton.

A mintanavigációs szolgáltató nem írja felül a System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* metóduszt. Az alábbiakban az alapértelmezett megvalósítás következik.

Fontos dolgok, amiket érdemes megjegyezni a MoveItem bevezetésével kapcsolatban

A navigációs szolgáltatód .NET osztálya bejelentheti az ExpandWildcards, Filter, Include, or Exclude szolgáltatói képességeit a System.Management.Automation.Provider.ProviderCapabilities felsorolásából. Ebben az esetben a System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* megvalósításának biztosítania kell, hogy a megadott út megfeleljen a követelményeknek. Ehhez a metódusnak hozzá kell férnie a megfelelő tulajdonsághoz, például a CmdletProvider.Exclude tulajdonsághoz.

Alapértelmezés szerint ennek a metódusnak a felülbírálásai nem mozgathatják az objektumokat a meglévő objektumok felett, hacsak a System.Management.Automation.Provider.CmdletProvider.Force* tulajdonság beállítása nem áll true. Például a FileSystem szolgáltató nem másolja C:\temp\abc.txt egy meglévő C:\bar.txt fájlra, hacsak a System.Management.Automation.Provider.CmdletProvider.Force* tulajdonság nem állított beállítva.true Ha a paraméterben megadott destination út létezik és konténer, akkor a System.Management.Automation.Provider.CmdletProvider.Force* tulajdonság nem szükséges. Ebben az esetben a System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* a paraméter által jelölt path elemet gyermekként kell áthelyeznie a paraméter által jelölt konténerbe destination .

A System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* módszer implementációja hívja a System.Management.Automation.Provider.CmdletProvider.ShouldProcess mappát, és ellenőrizze annak visszatérő értékét, mielőtt bármilyen változtatást végezne az adattárolóban. Ezt a módszert arra használják, hogy megerősítsék a művelet végrehajtását, amikor a rendszerállapotban változás történik, például fájlok törlésekor. System.Management.Automation.Provider.CmdletProvider.ShouldProcess elküldi a megváltoztatandó erőforrás nevét a felhasználónak, a Windows PowerShell futásideje pedig figyelembe veszi a parancssori beállításokat vagy preferenciaváltozókat, amikor meghatározza, mit kell megjeleníteni a felhasználónak.

Miután a System.Management.Automation.Provider.CmdletProvider.ShouldProcess hívás visszatér true, a System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* metódusnak hívnia kell a System.Management.Automation.Provider.CmdletProvider.ShouldContinue metódust. Ez a módszer üzenetet küld a felhasználónak, hogy visszajelzést adjon arról, hogy folytatni kell-e a műveletet. A szolgáltatónak hívnia kell a System.Management.Automation.Provider.CmdletProvider.ShouldContinue oldalt, hogy további ellenőrzést kapjon a potenciálisan veszélyes rendszermódosításokról.

Dinamikus paraméterek hozzácsatolása a Move-Item cmdlethez

Néha a Move-Item cmdlet további paramétereket igényel, amelyeket futás közben dinamikusan biztosítunk. A dinamikus paraméterek biztosításához a navigációs szolgáltatónak be kell valósítania a System.Management.Automation.Provider.NavigationCmdletProvider.MoveItemDynamicParameters* metódust, hogy megkapja a szükséges paraméterértékeket a megadott útvonalon lévő elemtől, és vissza kell adnia egy olyan objektumot, amelynek tulajdonságai és mezői olyan elemző attribútumokkal rendelkeznek, amelyek hasonló a cmdlet osztályhoz vagy a System.Management.Automation.RuntimeDefinedParameterDictionary objektumhoz.

Ez a navigációs szolgáltató nem alkalmazza ezt a módszert. Azonban a következő kód a System.Management.Automation.Provider.NavigationCmdletProvider.MoveItemDynamicParameters* alapértelmezett implementációja.

Egy relatív út normalizálása

A navigációs szolgáltató a System.Management.Automation.Provider.NavigationCmdletProvider.NormalizeRelativePath* módszert alkalmazza, hogy normalizálja a paraméterben jelölt teljesen minősített utat path a paraméter által megadott basePath úthoz képest. A módszer a normalizált út string reprezentációját adja vissza. Hibát ír, ha a path paraméter nem létező útvonalat jelöl meg.

A mintanavigációs szolgáltató nem írja felül ezt a módszert. Az alábbiakban az alapértelmezett megvalósítás következik.

Fontos dolgok, amiket érdemes megjegyezni a normalizeRelativePath megvalósításához

A System.Management.Automation.Provider.NavigationCmdletProvider.NormalizeRelativePath* implementációja a paramétert elemzőleg kell, path de nem kell tisztán szinttaktikai elemzést használnia. Bátorítjuk, hogy tervezd meg ezt a módszert, hogy az út segítségével megkeresse az adattárolóban az útinformációt, és olyan utat hozzon létre, amely megfelel a vázlatnak és a szabványosított útszintaxisnak.

Kódminta

A teljes mintakódért lásd az AccessDbProviderSample05 kód minta.

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

Lehetséges, hogy egy szolgáltató tagokat adjon meglévő objektumokhoz vagy új objektumokat definiáljon. További információértlásd: Objektumtípusok és formázás bővítése.

A Windows PowerShell szolgáltató felépítése

További információért lásd: Hogyan regisztráljuk a parancsnokokat, szolgáltatókat és hásztealkalmazásokat.

A Windows PowerShell szolgáltató tesztelése

Amikor a Windows PowerShell szolgáltatód regisztrálva van a Windows PowerShell-nél, tesztelheted a parancssoron a támogatott cmdlet-eket, beleértve a levezetés útján elérhető cmdleteket is. Ez a példa a mintanavigációs szolgáltatót teszteli.

  1. Indítsd le az új shelledet, és használd a Set-Location cmdlet-et, hogy beállítsd az útvonalat az Access adatbázis jelzésére.

    Set-Location mydb:
    
  2. Most futtatjuk a Get-ChildItem cmdlet-et, hogy lekérje az adatbázis-elemek listáját, amelyek az elérhető adatbázistáblák. Minden tábla esetében ez a cmdlet visszanyeri a tábla sorainak 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áld újra a Set-Location cmdletet az Employees adattábla helyének beállításához.

    Set-Location Employees
    
  4. Most használjuk a Get-Location cmdletet a Employees táblához vezető út letöltéséhez.

    Get-Location
    
    Path
    ----
    mydb:\Employees
    
  5. Most használd a Get-ChildItem cmdlet-et, ami a Format-Table cmdlethez van csatlakoztatva. Ez a cmdlet-készlet lekéri az Employees adattábla elemeit, amelyek a tábla sorok. A cmdlet által meghatározott formázás Format-Table alapján 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 futtathatod a Get-Item cmdlet-et, hogy lekérd az Alkalmazottak adattábla 0. sorának elemeit.

    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áld újra a Get-Item cmdletet a 0. sor elemeinek alkalmazotti adataihoz.

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

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

Tervezd meg a Windows PowerShell szolgáltatódat

Objektumtípusok és formázás bővítése

Container Windows PowerShell szolgáltató megvalósítása

Hogyan regisztráljuk a cmdleteket, szolgáltatókat és hoszt alkalmazásokat

Windows PowerShell programozói útmutató

Windows PowerShell SDK