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 szolgáltatót, amely többrétegű adattárolókon tud dolgozni. Ebben az adattároló típusban a tároló felső szintje tartalmazza a gyökérelemeket, és minden további szintet gyermek elemek csomópontjának nevezik. Azáltal, hogy a felhasználó ezeken a gyermekcsomópontokon dolgozhat, hierarchikusan interakcióba léphet az adattárolón keresztül.
Azokat a szolgáltatókat, akik többszintű adattárolókon dolgozhatnak, Windows PowerShell konténer szolgáltatóknak nevezik. Azonban ne feledd, hogy a Windows PowerShell konténer szolgáltatót csak akkor lehet használni, ha van egy konténer (nincs beágyazott konténer), amelyben elemek vannak. Ha vannak beágyazott konténerek, akkor Windows PowerShell navigációs szolgáltatót kell implementálnod. További információért a Windows PowerShell navigációs szolgáltató megvalósításáról lásd: Windows PowerShell navigációs szolgáltató létrehozása.
Megjegyzés:
Letöltheti a C# forrásfájlt (AccessDBSampleProvider04.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 Windows PowerShell konténer szolgáltató az adatbázist egyetlen konténerként határozza meg, az adatbázis táblái és sorai pedig a konténer elemeiként jelennek meg.
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.
Windows PowerShell konténer szolgáltató osztály meghatározása
Egy Windows PowerShell konténer szolgáltatónak olyan .NET osztályt kell definiálnia, amely a System.Management.Automation.Provider.ContainerCmdletProvider alaposztályból származik. Íme a Windows PowerShell konténer szolgáltató osztálydefiníciója, amelyet ebben a szakaszban leírnak.
[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : ContainerCmdletProvider
Figyeljük meg, hogy ebben az osztálydefiníció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 Windows PowerShell szolgáltató tervezése című részben leírva, a System.Management.Automation.Provider.ContainerCmdletProvider osztály több más osztályból származik, amelyek eltérő szolgáltatói funkcialiságot biztosítottak. Ezért egy Windows PowerShell konténer szolgáltatónak meg kell határoznia az összes ilyen osztály által biztosított funkciókat.
A munka-alkózásra specifikus inicializációs információk hozzáadására és a szolgáltató által használt erőforrások felszabadítására szolgáló funkciók megvalósításához lásd: Alap Windows PowerShell 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 által biztosított alapértelmezett megvalósítását.
Az adattárolóhoz való hozzáféréshez a szolgáltatónak a System.Management.Automation.Provider.DriveCmdletProvider alaposztály módszereit kell végrehajtania. 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.
Gyermektárgyak visszaszerzése
Egy gyermek elem visszahívásához a Windows PowerShell konténer szolgáltatónak felül kell írnia a System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* metódumat, hogy támogassa a parancsnok hívásait Get-ChildItem . Ez a módszer lekéri a gyermek elemeket az adattárolóból, és objektumként írja be őket a csővezetékre. Ha a recurse cmdlet paramétere meg van jelölve, a metódus minden gyermeket visszahív, függetlenül attól, hogy milyen szinten vannak. Ha a recurse paraméter nincs megadva, a metódus csak egyetlen szintű gyermeket kér le.
Íme a System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* módszer megvalósítása ehhez a szolgáltatóhoz. Figyeljük meg, hogy ez a módszer a gyermekelemeket az összes adatbázis táblából lekéri, ha az út az Access adatbázist jelöli, és a gyermek elemeket a tábla soraiból, ha az út adattáblát jelöl.
protected override void GetChildItems(string path, bool recurse)
{
// If path represented is a drive then the children in the path are
// tables. Hence all tables in the drive represented will have to be
// returned
if (PathIsDrive(path))
{
foreach (DatabaseTableInfo table in GetTables())
{
WriteItemObject(table, path, true);
// if the specified item exists and recurse has been set then
// all child items within it have to be obtained as well
if (ItemExists(path) && recurse)
{
GetChildItems(path + pathSeparator + table.Name, recurse);
}
} // foreach (DatabaseTableInfo...
} // if (PathIsDrive...
else
{
// Get the table name, row number and type of path from the
// path specified
string tableName;
int rowNumber;
PathType type = GetNamesFromPath(path, out tableName, out rowNumber);
if (type == PathType.Table)
{
// Obtain all the rows within the table
foreach (DatabaseRowInfo row in GetRows(tableName))
{
WriteItemObject(row, path + pathSeparator + row.RowNumber,
false);
} // foreach (DatabaseRowInfo...
}
else if (type == PathType.Row)
{
// In this case the user has directly specified a row, hence
// just give that particular row
DatabaseRowInfo row = GetRow(tableName, rowNumber);
WriteItemObject(row, path + pathSeparator + row.RowNumber,
false);
}
else
{
// In this case, the path specified is not valid
ThrowTerminatingInvalidPathException(path);
}
} // else
} // GetChildItems
Fontos dolgok, amiket érdemes megjegyezni a GetChildItems bevezetésével kapcsolatban
Az alábbi feltételek alkalmazhatók a System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* implementációjára:
A szolgáltató osztály meghatározásakor egy Windows PowerShell konténer szolgáltató bejelentheti az ExpandWildcards, Filter, Include, or Exclude szolgáltatói képességeit a System.Management.Automation.Provider.Capabilities enumerációból. Ezekben az esetekben a System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* módszer megvalósításának biztosítania kell, hogy a metódushoz átadott út megfeleljen a megadott képességek követelményeinek. Ehhez a metódusnak hozzá kell férnie a megfelelő tulajdonsághoz, például a System.Management.Automation.Provider.CmdletProvider.Exclude* és System.Management.Automation.Provider.CmdletProvider.Include* tulajdonságokhoz.
Ennek a módszernek a megvalósítása figyelembe kell vennie az elemhez való hozzáférés bármilyen formáját, amely megjelenítheti az eszközt a felhasználó számára. Például, ha egy felhasználónak írási joga van egy fájlhoz a FileSystem szolgáltatón keresztül (amelyet a Windows PowerShell biztosít), de nincs olvasási hozzáférés, akkor a fájl továbbra is létezik, és a System.Management.Automation.Provider.ItemCmdletProvider.ItemExists* visszaadja
true. A megvalósításod megkövetelheti, hogy ellenőrizd a szülői elemet, hogy megnézd, a gyermek felsorolható-e.Több elem írásakor a System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* módszer időigényes lehet. A szolgáltatót úgy tervezheted, hogy a System.Management.Automation.Provider.CmdletProvider.WriteItemObject* módszerrel egyenként írja meg az elemeket. Ezzel a technikával az elemeket streamben mutatjuk be a felhasználónak.
A System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* megvalósítása felelős azért, hogy megakadályozza a végtelen rekurziót, amikor körkörös kapcsolatok és hasonlók léteznek. Megfelelő megszüntető kivételt kell adni, hogy tükrözze ezt a feltételt.
Dinamikus paraméterek hozzácsatolása a Get-ChildItem cmdlethez
Néha az a Get-ChildItem cmdlet, amely a System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* fájlokat hívja, további paramétereket igényel, amelyeket futás közben dinamikusan definiálnak. Ezeknek a dinamikus paramétereknek a biztosításához a Windows PowerShell konténer szolgáltatónak meg kell valósítania a System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItemsDynamicParameters* metódust. Ez a módszer a megadott úton lévő elem dinamikus paramétereit keresi, és olyan objektumot ad vissza, amelynek tulajdonságai és mezői olyan elemző attribútumokkal rendelkeznek, amelyek hasonlóak egy cmdlet osztályhoz vagy a System.Management.Automation.RuntimeDefinedParameterDictionary objektumhoz. A Windows PowerShell futási ideje a visszaküldött objektumot használja a paraméterek hozzáadására a Get-ChildItem cmdlethez.
Ez a Windows PowerShell konténer szolgáltató nem valósítja meg ezt a módszert. Azonban a következő kód a módszer alapértelmezett implementációja.
Gyermek tárgynevek lekérése
A gyermekelemek neveinek visszavételéhez a Windows PowerShell konténer szolgáltatónak felül kell írnia a System.Management.Automation.Provider.ContainerCmdletProvider.GetChildNames* metódust, hogy támogassa a cmdlet hívásait Get-ChildItem , amikor a Name paraméter meg van szabva. Ez a módszer a megadott út gyermekelemeinek neveit, vagy a gyermek elemneveket minden konténerhez, ha a returnAllContainers cmdlet paramétere meg van szabva. A gyermeknév az ösvény levélrésze. Például az út gyermekneve C:\windows\system32\abc.dll "abc.dll". A C:\windows\system32 könyvtár gyermekneve "system32".
Íme a System.Management.Automation.Provider.ContainerCmdletProvider.GetChildNames* módszer megvalósítása ehhez a szolgáltatóhoz. Figyeljük meg, hogy a metódus lekéri a táblaneveket, ha a megadott út a Access adatbázist (meghajtót) jelzi, és sorszámokat, ha az út táblát jelöl.
protected override void GetChildNames(string path,
ReturnContainers returnContainers)
{
// If the path represented is a drive, then the child items are
// tables. get the names of all the tables in the drive.
if (PathIsDrive(path))
{
foreach (DatabaseTableInfo table in GetTables())
{
WriteItemObject(table.Name, path, true);
} // foreach (DatabaseTableInfo...
} // if (PathIsDrive...
else
{
// Get type, table name and row number from path specified
string tableName;
int rowNumber;
PathType type = GetNamesFromPath(path, out tableName, out rowNumber);
if (type == PathType.Table)
{
// Get all the rows in the table and then write out the
// row numbers.
foreach (DatabaseRowInfo row in GetRows(tableName))
{
WriteItemObject(row.RowNumber, path, false);
} // foreach (DatabaseRowInfo...
}
else if (type == PathType.Row)
{
// In this case the user has directly specified a row, hence
// just give that particular row
DatabaseRowInfo row = GetRow(tableName, rowNumber);
WriteItemObject(row.RowNumber, path, false);
}
else
{
ThrowTerminatingInvalidPathException(path);
}
} // else
} // GetChildNames
Fontos dolgok, amiket érdemes megjegyezni a GetChildNames bevezetésével kapcsolatban
Az alábbi feltételek alkalmazhatók a System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* implementációjára:
A szolgáltató osztály meghatározásakor egy Windows PowerShell konténer szolgáltató bejelentheti az ExpandWildcards, Filter, Include, or Exclude szolgáltatói képességeit a System.Management.Automation.Provider.Capabilities enumerációból. Ezekben az esetekben a System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* módszer megvalósításának biztosítania kell, hogy a metódushoz átadott út megfeleljen a megadott képességek követelményeinek. Ehhez a metódusnak hozzá kell férnie a megfelelő tulajdonsághoz, például a System.Management.Automation.Provider.CmdletProvider.Exclude* és System.Management.Automation.Provider.CmdletProvider.Include* tulajdonságokhoz.
Megjegyzés:
Kivétel ebből a szabályból akkor fordul elő, ha a
returnAllContainerscmdlet paraméterét megadjuk. Ebben az esetben a metódusnak vissza kell kérnie a konténer gyermeknevét, még akkor is, ha nem egyezik meg a System.Management.Automation.Provider.CmdletProvider.Filter*, System.Management.Automation.Provider.CmdletProvider.Include* vagy System.Management.Automation.Provider.CmdletProvider.Exclude* értékekkel.Alapértelmezés szerint ennek a módszernek a felülbírálására nem kell olyan objektumok nevét visszaszerezniük, amelyek általában rejtve vannak a felhasználó elől, hacsak nem van megadva a System.Management.Automation.Provider.CmdletProvider.Force* tulajdonság. Ha a megadott út konténert jelöl, a System.Management.Automation.Provider.CmdletProvider.Force* tulajdonság nem szükséges.
A System.Management.Automation.Provider.ContainerCmdletProvider.GetChildNames* megvalósítása felelős azért, hogy megakadályozza a végtelen rekurziót, amikor körkörös kapcsolatok és hasonlók vannak. Megfelelő megszüntető kivételt kell adni, hogy tükrözze ezt a feltételt.
Dinamikus paraméterek csatolása a Get-ChildItem parancsnogahoz (név)
Néha a Get-ChildItem cmdlet (a Name paraméterrel) további paramétereket igényel, amelyeket dinamikusan megadnak futás közben. Ezeknek a dinamikus paramétereknek a biztosításához a Windows PowerShell konténer szolgáltatónak meg kell valósítania a System.Management.Automation.Provider.ContainerCmdletProvider.GetChildNamesDynamicParameters* metódust. Ez a módszer visszanyeri a jelzett útvonalon lévő elem dinamikus paramétereit, és olyan objektumot ad vissza, amelynek tulajdonságai és mezői olyan parzálási attribútumokkal rendelkeznek, amelyek hasonló a cmdlet osztályhoz vagy a System.Management.Automation.RuntimeDefinedParameterDictionary objektumhoz. A Windows PowerShell futási ideje a visszaküldött objektumot használja a paraméterek hozzáadására a Get-ChildItem cmdlethez.
Ez a szolgáltató nem alkalmazza ezt a módszert. Azonban a következő kód a módszer alapértelmezett implementációja.
Elemek átnevezése
Egy elem átnevezéséhez a Windows PowerShell konténer szolgáltatónak felül kell írnia a System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem* metódust, hogy támogassa a Rename-Item parancsnok hívásait. Ez a módszer megváltoztatja az adott útvonalon lévő elem nevét az új megadott névre. Az új névnek mindig relatív kell lennie az anyaelemhez (tartályhoz).
Ez a szolgáltató nem írja felül a System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem* metódust. Azonban az alábbi alapértelmezett megvalósítás.
Fontos dolgok, amiket érdemes megjegyezni a RenameItem megvalósításához
A következő feltételek alkalmazhatók a System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem* megvalósítására:
A szolgáltató osztály meghatározásakor egy Windows PowerShell konténer szolgáltató bejelentheti az ExpandWildcards, Filter, Include, or Exclude szolgáltatói képességeit a System.Management.Automation.Provider.Capabilities enumerációból. Ezekben az esetekben a System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* módszer megvalósításának biztosítania kell, hogy a metódushoz átadott út megfeleljen a megadott képességek követelményeinek. Ehhez a metódusnak hozzá kell férnie a megfelelő tulajdonsághoz, például a System.Management.Automation.Provider.CmdletProvider.Exclude* és System.Management.Automation.Provider.CmdletProvider.Include* tulajdonságokhoz.
A System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem* módszer kizárólag egy elem nevének módosítására szolgál, nem áthelyezési műveletekre. A metódus implementációjának hibát kell írnia, ha a
newNameparaméter útelválasztókat tartalmaz, vagy egyébként megváltoztathatja az elem szülőhelyét.Alapértelmezés szerint ennek a módszernek a felülírásai nem nevezhetik át objektumokat, kivéve, ha a System.Management.Automation.Provider.CmdletProvider.Force* tulajdonság nincs megadva. Ha a megadott út konténert jelöl, a System.Management.Automation.Provider.CmdletProvider.Force* tulajdonság nem szükséges.
A System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem* módszer implementációja hívja a System.Management.Automation.Provider.CmdletProvider.ShouldProcess funkciót, és ellenőrizze annak visszaküldési é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 egy művelet végrehajtását, amikor a rendszerállapot változást hajt végre, például fájlok átnevezésekor. A 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.
Miután a System.Management.Automation.Provider.CmdletProvider.ShouldProcess hívás visszatér
true, a System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem* metódusnak a System.Management.Automation.Provider.CmdletProvider.ShouldContinue meduációt kell hívnia. Ez a módszer egy megerősítő üzenetet küld a felhasználónak, hogy további 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 funkciót, hogy további ellenőrzést nyújtson a potenciálisan veszélyes rendszermódosítások ellen.
Dinamikus paraméterek hozzácsatolása a Rename-Item cmdlethez
Néha a Rename-Item cmdlet további paramétereket igényel, amelyeket futás közben dinamikusan megadnak. A dinamikus paraméterek biztosításához a Windows PowerShell konténer szolgáltatónak a System.Management.Automation.Provider.ContainerCmdletProvider.RenameItemDynamicParameters* módszert kell végrehajtania. Ez a módszer lekéri az elem paramétereit a megadott úton, és olyan objektumot ad vissza, amelynek tulajdonságai és mezői olyan elemző attribútumokkal rendelkeznek, amelyek hasonlóak egy cmdlet osztályhoz vagy a System.Management.Automation.RuntimeDefinedParameterDictionary objektumhoz. A Windows PowerShell futási ideje a visszaküldött objektumot használja a paraméterek hozzáadására a Rename-Item cmdlethez.
Ez a konténerszolgáltató nem valósítja meg ezt a módszert. Azonban a következő kód a módszer alapértelmezett implementációja.
Új tárgyak létrehozása
Új elemek létrehozásához a konténer szolgáltatónak a System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* módszert kell alkalmaznia, hogy támogassa a parancsnokból érkező hívásokat New-Item . Ez a módszer egy adatelemet hoz létre, amely a megadott úton található. A type cmdlet paramétere tartalmazza az új tétel szolgáltató által definiált típusát. Például a FileSystem szolgáltató egy type paramétert használ, amelynek értéke "file" vagy "directory". A newItemValue cmdlet paramétere szolgáltató-specifikus értéket ad az új elemre.
Íme a System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* módszer megvalósítása ehhez a szolgáltatóhoz.
protected override void NewItem( string path, string type, object newItemValue )
{
// Create the new item here after
// performing necessary validations
//
// WriteItemObject(newItemValue, path, false);
// Example
//
// if (ShouldProcess(path, "new item"))
// {
// // Create a new item and then call WriteObject
// WriteObject(newItemValue, path, false);
// }
} // NewItem
{
case 1:
{
string name = pathChunks[0];
if (TableNameIsValid(name))
{
tableName = name;
retVal = PathType.Table;
}
}
break;
case 2:
{
string name = pathChunks[0];
Fontos dolgok, amiket érdemes megjegyezni a NewItem megvalósításához
A következő feltételek érvényesek lehetnek a System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* implementációjára:
A System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* metódusnak a paraméterben átadott string viszonyát kell végrehajtania a kisméret-érzékeny
typeösszehasonlításban. Emellett lehetővé kellene tennie a legkevésbé kétértelmű párosításokat is. Például a "file" és "directory" típusoknál csak az első betű szükséges az egyértelműsítéshez. Ha atypeparaméter olyan típust jelöl, amit a szolgáltató nem tud létrehozni, a System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* metódusnak írnia kell egy ArgumentException-t egy üzenettel, amely jelzi, milyen típusokat tud létrehozni a szolgáltató.A
newItemValueparaméterhez a System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* módszer megvalósítása ajánlott, hogy legalább a stringeket elfogadja. Ugyanazon az úton a System.Management.Automation.Provider.ItemCmdletProvider.GetItem * metódus által letöltött objektumtípust is elfogadja. A System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* módszer a System.Management.Automation.LanguagePrimitives.ConvertTo* metódumust használhatja a kívánt típusra konvertálásra.A System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* módszer implementációja hívja a System.Management.Automation.Provider.CmdletProvider.ShouldProcess formátumot, és ellenőrizze annak visszaküldési értékét, mielőtt bármilyen változtatást végezne az adattárolóban. Miután a System.Management.Automation.Provider.CmdletProvider.ShouldProcess hívás true lesz, a System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* metódusnak hívnia kell a System.Management.Automation.Provider.CmdletProvider.ShouldContinue metódut, hogy további ellenőrzést nyújtson a potenciálisan veszélyes rendszermódosítások ellen.
Dinamikus paraméterek hozzácsatolása a New-Item cmdlethez
Néha a New-Item cmdlet további paramétereket igényel, amelyeket futás közben dinamikusan megadnak. A dinamikus paraméterek megadásához a konténer szolgáltatónak a System.Management.Automation.Provider.ContainerCmdletProvider.NewItemDynamicParameters* módszert kell végrehajtania. Ez a módszer lekéri az elem paramétereit a megadott úton, és olyan objektumot ad vissza, amelynek tulajdonságai és mezői olyan elemző attribútumokkal rendelkeznek, amelyek hasonlóak egy cmdlet osztályhoz vagy a System.Management.Automation.RuntimeDefinedParameterDictionary objektumhoz. A Windows PowerShell futási ideje a visszaküldött objektumot használja a paraméterek hozzáadására a New-Item cmdlethez.
Ez a szolgáltató nem alkalmazza ezt a módszert. Azonban a következő kód a módszer alapértelmezett implementációja.
Tárgyak eltávolítása
Az elemek eltávolításához a Windows PowerShell szolgáltatónak felül kell írnia a System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem* metódumat, hogy támogassa a parancsnok hívásait Remove-Item . Ez a módszer törli az adattárolóból az adott útvonalon. Ha a recurseRemove-Item cmdlet trueparamétere , a metódus eltávolítja az összes gyerektárgyat, függetlenül a szintjüktől. Ha a paraméter , falsea metódus csak egyetlen elemet távolít el a megadott úton.
Ez a szolgáltató nem támogatja a tárgyak eltávolítását. Azonban a következő kód a System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem* alapértelmezett implementációja.
Fontos dolgok, amiket érdemes megjegyezni a RemoveItem bevezetéséről
A következő feltételek érvényesek lehetnek a System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* implementációjára:
A szolgáltató osztály meghatározásakor egy Windows PowerShell konténer szolgáltató bejelentheti az ExpandWildcards, Filter, Include, or Exclude szolgáltatói képességeit a System.Management.Automation.Provider.Capabilities enumerációból. Ezekben az esetekben a System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* módszer megvalósításának biztosítania kell, hogy a metódushoz átadott út megfeleljen a megadott képességek követelményeinek. Ehhez a metódusnak hozzá kell férnie a megfelelő tulajdonsághoz, például a System.Management.Automation.Provider.CmdletProvider.Exclude* és System.Management.Automation.Provider.CmdletProvider.Include* tulajdonságokhoz.
Alapértelmezés szerint ennek a metódusnak a felülbírálásai nem távolíthatják el objektumokat, hacsak a System.Management.Automation.Provider.CmdletProvider.Force* tulajdonság true-ra van állítva. Ha a megadott út konténert jelöl, a System.Management.Automation.Provider.CmdletProvider.Force* tulajdonság nem szükséges.
A System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem* implementációd felelős azért, hogy megakadályozza a végtelen rekurziót, amikor körkörös kapcsolatok léteznek, és hasonlók. Megfelelő megszüntető kivételt kell adni, hogy tükrözze ezt a feltételt.
A System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem* módszer implementációja hívja a System.Management.Automation.Provider.CmdletProvider.ShouldProcess fájlokat, és ellenőrizze annak visszaküldési értékét, mielőtt bármilyen változtatást végezne az adattárolóban. Miután a System.Management.Automation.Provider.CmdletProvider.ShouldProcess
truevisszatér, a System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem* metódusnak hívnia kell a System.Management.Automation.Provider.CmdletProvider.ShouldContinue metódust, hogy további ellenőrzést nyújtson a potenciálisan veszélyes rendszermódosítások ellen.
Dinamikus paraméterek hozzácsatolása a Remove-Item cmdlethez
Néha a Remove-Item cmdlet további paramétereket igényel, amelyeket futás közben dinamikusan megadnak. A dinamikus paraméterek megadásához a konténer szolgáltatónak be kell valósítania a System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItemDynamicParameters* metódusát ezeknek a paramétereknek a kezelésére. Ez a módszer visszanyeri a jelzett útvonalon lévő elem dinamikus paramétereit, és olyan objektumot ad vissza, amelynek tulajdonságai és mezői olyan parzálási attribútumokkal rendelkeznek, amelyek hasonló a cmdlet osztályhoz vagy a System.Management.Automation.RuntimeDefinedParameterDictionary objektumhoz. A Windows PowerShell futási ideje a visszaküldött objektumot használja a paraméterek hozzáadására a Remove-Item cmdlethez.
Ez a konténerszolgáltató nem valósítja meg ezt a módszert. Azonban a következő kód a System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItemDynamicParameters* alapértelmezett megvalósítása.
Gyermek elemek lekérdezése
Ahhoz, hogy ellenőrizzük, léteznek-e gyermek elemek a megadott úton, a Windows PowerShell konténer szolgáltatónak felül kell írnia a System.Management.Automation.Provider.ContainerCmdletProvider.HasChildItems* metódust. Ez a módszer akkor jelenik meg, true ha az elemnek vannak gyermekei, és false egyébként. Null vagy üres út esetén a módszer minden adattároló elemet gyermeknek tekint, és visszaadja true.
Íme a System.Management.Automation.Provider.ContainerCmdletProvider.HasChildItems* metódus felülbírálása. Ha a ChunkPath segédmetódus több mint két útrészt hoz, a metódus visszaadja false, mivel csak egy adatbázis-tároló és egy táblatároló van definiálva. További információért erről a segítő módszerről lásd a ChunkPath módszert, amelyet a Windows PowerShell Item Provider létrehozása című részben tárgyalnak.
protected override bool HasChildItems( string path )
{
return false;
} // HasChildItems
ErrorCategory.InvalidOperation, tableName));
}
return results;
Fontos dolgok, amiket érdemes megjegyezni a HasChildItems bevezetéséről
A következő feltételek alkalmazhatók a System.Management.Automation.Provider.ContainerCmdletProvider.HasChildItems* megvalósítására:
- Ha a konténer szolgáltató olyan gyökért mutat be, amely érdekes mount pontokat tartalmaz, a System.Management.Automation.Provider.ContainerCmdletProvider.HasChildItems* metódus megvalósítása vissza kell térni
true, amikor null vagy üres stringet adnak át az úthoz.
Tárgyak másolása
Az elemek másolásához a konténer szolgáltatónak a System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem metódusot kell alkalmaznia, hogy támogassa a Copy-Item cmdletből érkező hívásokat. Ez a módszer egy adatelemet másolt a cmdlet paramétere által jelölt helyről path a paraméter által jelölt copyPath helyre. Ha a recurse paraméter meg van szabva, a metódus lemásolja az összes alkonténert. Ha a paraméter nincs megadva, a metódus csak egyetlen szintű elemeket másol le.
Ez a szolgáltató nem alkalmazza ezt a módszert. Azonban a következő kód a System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem alapértelmezett implementációja.
Fontos dolgok, amiket érdemes megjegyezni a CopyItem megvalósításához
Az alábbi feltételek alkalmazhatók a System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem implementációjára:
A szolgáltató osztály meghatározásakor egy Windows PowerShell konténer szolgáltató bejelentheti az ExpandWildcards, Filter, Include, or Exclude szolgáltatói képességeit a System.Management.Automation.Provider.Capabilities enumerációból. Ezekben az esetekben a System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* módszer megvalósításának biztosítania kell, hogy a metódushoz átadott út megfeleljen a megadott képességek követelményeinek. Ehhez a metódusnak hozzá kell férnie a megfelelő tulajdonsághoz, például a System.Management.Automation.Provider.CmdletProvider.Exclude* és System.Management.Automation.Provider.CmdletProvider.Include* tulajdonságokhoz.
Alapértelmezés szerint ennek a metódusnak a felülbírálására nem szabad objektumokat másolniuk meglévő objektumokra, kivéve, ha a System.Management.Automation.Provider.CmdletProvider.Force* tulajdonság nincs beállítva.
truePéldául a FileSystem szolgáltató nem másolja C:\temp\abc.txt egy meglévő C:\abc.txt fájlra, hacsak a System.Management.Automation.Provider.CmdletProvider.Force* tulajdonság nem állított beállítva.trueHa a paraméterben megadottcopyPathút létezik és konténert jelöl, akkor a System.Management.Automation.Provider.CmdletProvider.Force* tulajdonság nem szükséges. Ebben az esetben a System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem a paraméter által jelöltpathelemet a paraméter által jelölt konténerbecopyPathkell másolnia gyermekként.A System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem megvalósítása felelős azért, hogy megakadályozza a végtelen rekurziót, amikor körkörös linkek és hasonlók léteznek. Megfelelő megszüntető kivételt kell adni, hogy tükrözze ezt a feltételt.
A System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem módszer implementációja a System.Management.Automation.Provider.CmdletProvider.ShouldProcess rendszert hívja, és ellenőrizheti annak visszaküldési értékét, mielőtt bármilyen változtatást végezne az adattárolóban. Miután a System.Management.Automation.Provider.CmdletProvider.ShouldProcess hívása true lesz, a System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem metódusnak hívnia kell a System.Management.Automation.Provider.CmdletProvider.ShouldContinue metódust további ellenőrzésként a potenciálisan veszélyes rendszermódosítások ellen. További információért ezeknek a módszereknek a megnevezéséről lásd: Elemek átnevezése.
Dinamikus paraméterek hozzácsatolása a Copy-Item cmdlethez
Néha a Copy-Item cmdlet további paramétereket igényel, amelyeket futás közben dinamikusan megadnak. A dinamikus paraméterek megadásához a Windows PowerShell konténer szolgáltatónak a System.Management.Automation.Provider.ContainerCmdletProvider.CopyItemDynamicParameters* metódusát kell megvalósítania a paraméterek kezelésére. Ez a módszer lekéri az elem paramétereit a megadott úton, és olyan objektumot ad vissza, amelynek tulajdonságai és mezői olyan elemző attribútumokkal rendelkeznek, amelyek hasonlóak egy cmdlet osztályhoz vagy a System.Management.Automation.RuntimeDefinedParameterDictionary objektumhoz. A Windows PowerShell futási ideje a visszaküldött objektumot használja a paraméterek hozzáadására a Copy-Item cmdlethez.
Ez a szolgáltató nem alkalmazza ezt a módszert. Azonban a következő kód a System.Management.Automation.Provider.ContainerCmdletProvider.CopyItemDynamicParameters* alapértelmezett implementációja.
Kódminta
A teljes mintakódért lásd: AccessDbProviderSample04 Kód minta (AccessDbProviderSample04).
Windows PowerShell szolgáltató építése
Lásd : Hogyan regisztráljuk a cmdleteket, szolgáltatókat és hásztealkalmazásokat.
A Windows PowerShell szolgáltató tesztelése
Amikor a Windows PowerShell szolgáltatód regisztrálva van Windows PowerShell-re, tesztelheted a támogatott cmdlet-eket a parancssoron futtatva. Ne feledd, hogy a következő példakimenet egy fiktív Access adatbázist használ.
Futtatd a
Get-ChildItemcmdletet, hogy a Felhasználó adatbázis Ügyfelek táblájából lehessen szerezni a gyermek elemek listáját.Get-ChildItem mydb:customersA következő kimenet jelenik meg.
PSPath : AccessDB::customers PSDrive : mydb PSProvider : System.Management.Automation.ProviderInfo PSIsContainer : True Data : System.Data.DataRow Name : Customers RowCount : 91 Columns :Futtasd újra a
Get-ChildItemparancsnokot, hogy lekérd egy tábla adatait.(Get-ChildItem mydb:customers).DataA következő kimenet jelenik meg.
TABLE_CAT : C:\PS\northwind TABLE_SCHEM : TABLE_NAME : Customers TABLE_TYPE : TABLE REMARKS :Most használd a
Get-Itemcmdlet-et, hogy lekérd az adattábla 0. sorában lévő elemeket.Get-Item mydb:\customers\0A következő kimenet jelenik meg.
PSPath : AccessDB::customers\0 PSDrive : mydb PSProvider : System.Management.Automation.ProviderInfo PSIsContainer : False Data : System.Data.DataRow RowNumber : 0Újra felhasználva
Get-Itemvisszaszerezzük az 0. sor elemei adatait.(Get-Item mydb:\customers\0).DataA következő kimenet jelenik meg.
CustomerID : 1234 CompanyName : Fabrikam ContactName : Eric Gruber ContactTitle : President Address : 4567 Main Street City : Buffalo Region : NY PostalCode : 98052 Country : USA Phone : (425) 555-0100 Fax : (425) 555-0101Most használd a
New-Itemcmdlet-et, hogy hozzáadj egy sort egy meglévő táblához. APathparaméter megadja a teljes útvonalat a sorhoz, és olyan sorszámot kell jelölnie, amely nagyobb, mint a táblázatban lévő meglévő sorszám. ATypeparaméter jelziRow, hogy melyik típusú elemet kell hozzáadni. Végül aValueparaméter egy vesszővel osztott oszlopérték-listát ad meg a sorhoz.New-Item -Path mydb:\Customers\3 -ItemType "Row" -Value "3,CustomerFirstName,CustomerLastName,CustomerEmailAddress,CustomerTitle,CustomerCompany,CustomerPhone, CustomerAddress,CustomerCity,CustomerState,CustomerZip,CustomerCountry"Az új tétel műveletének helyességét az alábbiak szerint ellenőrizzük.
PS mydb:\> cd Customers PS mydb:\Customers> (Get-Item 3).DataA következő kimenet jelenik meg.
ID : 3 FirstName : Eric LastName : Gruber Email : ericgruber@fabrikam.com Title : President Company : Fabrikam WorkPhone : (425) 555-0100 Address : 4567 Main Street City : Buffalo State : NY Zip : 98052 Country : USA
Lásd még:
Windows PowerShell szolgáltatók létrehozása
Windows PowerShell szolgáltató tervezése
Egy Item Windows PowerShell szolgáltató megvalósítása
Navigációs Windows PowerShell szolgáltató megvalósítása
Hogyan regisztráljuk a cmdleteket, szolgáltatókat és hoszt alkalmazásokat