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" üzenetetchild
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.
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:
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
Használja ismét a parancsmagot az Employees adattábla
Set-Location
helyének beállításához.Set-Location Employees
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
Most használja
Get-Childitem
a parancsmagnak átkértFormat-Table
parancsmagot. Ez a parancsmagkészlet lekéri az Employees adattábla elemeit, amelyek a tábla sorai. Ezek a parancsmag által megadottFormat-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
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
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
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: