Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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.
Indítsd le az új shelledet, és használd a
Set-Locationcmdlet-et, hogy beállítsd az útvonalat az Access adatbázis jelzésére.Set-Location mydb:Most futtatjuk a
Get-ChildItemcmdlet-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 -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 SuppliersHasználd újra a
Set-Locationcmdletet az Employees adattábla helyének beállításához.Set-Location EmployeesMost használjuk a
Get-Locationcmdletet a Employees táblához vezető út letöltéséhez.Get-LocationPath ---- mydb:\EmployeesMost használd a
Get-ChildItemcmdlet-et, ami aFormat-Tablecmdlethez 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ásFormat-Tablealapján vannak formázva.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.DataRowMost már futtathatod a
Get-Itemcmdlet-et, hogy lekérd az Alkalmazottak adattábla 0. sorának elemeit.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 : 0Használd újra a
Get-Itemcmdletet a 0. sor elemeinek alkalmazotti adataihoz.(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
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