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


Windows PowerShell item provider létrehozása

Ez a téma bemutatja, hogyan lehet létrehozni egy Windows PowerShell szolgáltatót, amely képes kezelni az adattárolóban lévő adatokat. Ebben a témában az adattároló elemeit az adattároló "elemeinek" nevezik. Ennek következtében egy olyan szolgáltatót, amely képes manipulálni az adatokat a tárolóban, Windows PowerShell item providernek nevezik.

Megjegyzés:

Letöltheti a C# forrásfájlt (AccessDBSampleProvider03.cs) ehhez a szolgáltatóhoz a Microsoft Windows Vista Software Development Kit é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.

A témában leírt Windows PowerShell elemszolgáltató adatokat kap egy Access adatbázisból. Ebben az esetben a "tétel" vagy egy tábla az Access adatbázisban, vagy egy sor egy táblában.

A Windows PowerShell item provider osztály meghatározása

A Windows PowerShell elemszolgáltatónak olyan .NET osztályt kell definiálnia, amely a System.Management.Automation.Provider.ItemCmdletProvider alaposztályból származik. Az alábbiakban található az ebben a szakaszban leírt tárgyszolgáltató osztálydefiníciója.

[CmdletProvider("AccessDB", ProviderCapabilities.None)]

public class AccessDBProvider : ItemCmdletProvider

Fontos megjegyezni, 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 nincs további Windows PowerShell-specifikus képesség.

Az alapfunkcionalitás meghatározása

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

További információért 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áról 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.

Mielőtt a Windows PowerShell elemszolgáltató manipulálhatná a boltban lévő elemeket, be kell valósítania a System.Management.Automation.Provider.DriveCmdletProvider alaposztály módszereit az adattárolóhoz való hozzáféréshez. További információért az osztály megvalósításáról lásd : Windows PowerShell meghajtó szolgáltató létrehozása.

Út érvényességének ellenőrzése

Adat keresésekor a Windows PowerShell futási ideje egy Windows PowerShell útvonalat biztosít a szolgáltatóhoz, ahogy azt a "PSPath Concepts" szakaszban definiálja a How Windows PowerShell Works. A Windows PowerShell elemszolgáltatónak a System.Management.Automation.Provider.ItemCmdletProvider.IsValidPath módszer alkalmazásával kell ellenőriznie bármely hozzá továbbított út szintaktikai és szemantikai érvényességét. Ez a módszer akkor tér vissza true , ha az út érvényes, és false egyébként. Fontos tudni, hogy ennek a módszernek a megvalósítása nem igazolhatja az útvonal tárgyának létezését, hanem csak azt kell igazolnia, hogy az út szintaktikailag és szemantikailag helyes.

Íme a System.Management.Automation.Provider.ItemCmdletProvider.IsValidPath módszer megvalósítása ehhez a szolgáltatóhoz. Fontos megjegyezni, hogy ez a megvalósítás NormalizePath segédmetódust hív, hogy az összes elválasztót az úton egységessé alakítsa.

protected override bool IsValidPath(string path)
{
    bool result = true;

    // check if the path is null or empty
    if (String.IsNullOrEmpty(path))
    {
        result = false;
    }

    // convert all separators in the path to a uniform one
    path = NormalizePath(path);

    // split the path into individual chunks
    string[] pathChunks = path.Split(pathSeparator.ToCharArray());

    foreach (string pathChunk in pathChunks)
    {
        if (pathChunk.Length == 0)
        {
            result = false;
        }
    }
    return result;
} // IsValidPath

Annak meghatározása, hogy létezik-e egy tárgy

Az útvonal ellenőrzése után a Windows PowerShell futásidőnek meg kell határoznia, hogy létezik-e egy adattétel azon az úton. Ennek a lekérdezéstípusnak a támogatásához a Windows PowerShell elemszolgáltató a System.Management.Automation.Provider.ItemCmdletProvider.ItemExists metódust valósítja meg. Ez a módszer azt eredményezi, true hogy egy elem a megadott útvonalon található, és false egyébként (alapértelmezett) marad.

Íme a System.Management.Automation.Provider.ItemCmdletProvider.ItemExists módszer megvalósítása ehhez a szolgáltatóhoz. Fontos megjegyezni, hogy ez a módszer a PathIsDrive, ChunkPath és GetTable segédmetódusokat hívja, és egy szolgáltató által definiált DatabaseTableInfo objektumot használ.

protected override bool ItemExists(string path)
{
    // check if the path represented is a drive
    if (PathIsDrive(path))
    {
        return true;
    }

    // Obtain type, table name and row number from path
    string tableName;
    int rowNumber;

    PathType type = GetNamesFromPath(path, out tableName, out rowNumber);

    DatabaseTableInfo table = GetTable(tableName);

    if (type == PathType.Table)
    {
        // if specified path represents a table then DatabaseTableInfo
        // object for the same should exist
        if (table != null)
        {
            return true;
        }
    }
    else if (type == PathType.Row)
    {
        // if specified path represents a row then DatabaseTableInfo should
        // exist for the table and then specified row number must be within
        // the maximum row count in the table
        if (table != null && rowNumber < table.RowCount)
        {
            return true;
        }
    }

    return false;

} // ItemExists

Fontos dolgok, amiket érdemes megjegyezni az ItemExists megvalósításával kapcsolatban

Az alábbi feltételek érvényesek lehetnek a System.Management.Automation.Provider.ItemCmdletProvider.ItemExists implementációjára:

Dinamikus paraméterek csatolása a Test-Path cmdlethez

Néha az a Test-Path cmdlet, amely a System.Management.Automation.Provider.ItemCmdletProvider.ItemExists 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 elemszolgáltatónak meg kell valósítania a System.Management.Automation.Provider.ItemCmdletProvider.ItemExistsDynamicsParameters 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 Test-Path cmdlethez.

Ez a Windows PowerShell elemszolgáltató nem valósítja meg ezt a módszert. Azonban a következő kód a módszer alapértelmezett implementációja.

Egy tárgy visszaszerzése

Egy elem lekéréséhez a Windows PowerShell elemszolgáltatónak felül kell írnia a System.Management.Automation.Provider.ItemCmdletProvider.GetItem metódusát, hogy támogassa a parancsnok hívásait Get-Item . Ez a módszer a System.Management.Automation.Provider.CmdletProvider.WriteItemObject metódussal írja az elemet.

Íme a System.Management.Automation.Provider.ItemCmdletProvider.GetItem módszer megvalósítása ehhez a szolgáltatóhoz. Fontos megjegyezni, hogy ez a módszer a GetTable és a GetRow segéd metódusos módszereket használja az Access adatbázis táblái vagy egy adattábla sorainak lekérdezésére.

protected override void GetItem(string path)
{
    // check if the path represented is a drive
    if (PathIsDrive(path))
    {
        WriteItemObject(this.PSDriveInfo, path, true);
        return;
    }// if (PathIsDrive...

     // Get table name and row information from the path and do 
     // necessary actions
     string tableName;
     int rowNumber;

     PathType type = GetNamesFromPath(path, out tableName, out rowNumber);

     if (type == PathType.Table)
     {
         DatabaseTableInfo table = GetTable(tableName);
         WriteItemObject(table, path, true);
     }
     else if (type == PathType.Row)
     {
         DatabaseRowInfo row = GetRow(tableName, rowNumber);
         WriteItemObject(row, path, false);
     }
     else
     {
         ThrowTerminatingInvalidPathException(path);
     }

 } // GetItem

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

A következő feltételek alkalmazhatók a System.Management.Automation.Provider.ItemCmdletProvider.GetItem implementációjára:

Dinamikus paraméterek csatolása a Get-Item cmdlethez

Néha a Get-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 elemszolgáltatónak meg kell valósítania a System.Management.Automation.Provider.ItemCmdletProvider.GetItemDynamicParameters 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-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árgy beállítása

Egy elem beállításához a Windows PowerShell elemszolgáltatójának felül kell írnia a System.Management.Automation.Provider.ItemCmdletProvider.SetItem metódust, hogy támogassa a cmdlet hívásait Set-Item . Ez a módszer a megadott úton határozza meg az elem értékét.

Ez a szolgáltató nem biztosít felülbírálást a System.Management.Automation.Provider.ItemCmdletProvider.SetItem metódushoz. Azonban a következő a módszer alapértelmezett megvalósítása.

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

A következő feltételek alkalmazhatók a System.Management.Automation.Provider.ItemCmdletProvider.SetItem megvalósítására:

Dinamikus paraméterek lekérése a SetItem számára

Néha a Set-Item cmdlet további paramétereket igényel, amelyeket futás közben dinamikusan megadnak. Ezeknek a dinamikus paramétereknek a megadásához a Windows PowerShell elemszolgáltatónak meg kell valósítania a System.Management.Automation.Provider.ItemCmdletProvider.SetItemDynamicParameters 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 Set-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.

Egy tárgy törlése

Egy elem törléséhez a Windows PowerShell elemszolgáltató a System.Management.Automation.Provider.ItemCmdletProvider.ClearItem metódusot valósítja meg, hogy támogassa a cmdlet hívásait Clear-Item . Ez a módszer törli az adatelemet a megadott úton.

Ez a szolgáltató nem alkalmazza ezt a módszert. Azonban a következő kód a módszer alapértelmezett implementációja.

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

A következő feltételek alkalmazhatók a System.Management.Automation.Provider.ItemCmdletProvider.ClearItem implementációjára:

Dinamikus paraméterek lekérése a ClearItem számára

Néha a Clear-Item cmdlet további paramétereket igényel, amelyeket futás közben dinamikusan megadnak. E dinamikus paraméterek megadásához a Windows PowerShell elemszolgáltatónak meg kell valósítania a System.Management.Automation.Provider.ItemCmdletProvider.ClearItemDynamicParameters 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 Clear-Item cmdlethez.

Ez az item 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.

Egy alap művelet végrehajtása egy tárgyhoz

Egy Windows PowerShell elemszolgáltató megvalósíthatja a System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultAction metódust, hogy támogassa a parancsnok hívásait Invoke-Item , amely lehetővé teszi a szolgáltató számára, hogy alapértelmezett műveletet hajtson végre a megadott útvonalon lévő elemre. Például a FileSystem szolgáltató ezt a módszert használhatja, hogy egy adott tételhez hívja a ShellExecute-ot .

Ez a szolgáltató nem alkalmazza ezt a módszert. Azonban a következő kód a módszer alapértelmezett implementációja.

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

Az alábbi feltételek alkalmazhatók a System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultAction implementációjára:

Retriev dynamic parameters for InvokeDefaultAction

Néha a Invoke-Item cmdlet további paramétereket igényel, amelyeket futás közben dinamikusan megadnak. Ezeknek a dinamikus paramétereknek a biztosításához a Windows PowerShell elemszolgáltatónak meg kell valósítania a System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultActionDynamicParameters 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óideje a visszaadott objektumot használja a dinamikus paraméterek hozzáadására a Invoke-Item cmdlethez.

Ez az item 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.

Segéd metódusok és osztályok megvalósítása

Ez az elemszolgáltató több segéd metódust és osztályt valósít meg, amelyeket a Windows PowerShell által definiált nyilvános felülírási metódok használnak. Ezeknek a segítő metódusoknak és osztályoknak a kódja a Kód Sample szekcióban látható.

NormalizePath módszer

Ez az elemszolgáltató egy NormalizePath segéd módszert alkalmaz, hogy biztosítsa, hogy az út konzisztens formátumú legyen. A megadott formátum egy visszaoldali lecsapást (\) használ elválasztóként.

PathIsDrive módszer

Ez az elemszolgáltató egy PathIsDrive segítő módszert alkalmaz, hogy megállapítsa, valóban a megadott út a meghajtó neve.

ChunkPath metódus

Ez az item provider egy ChunkPath segédmetódust valósít meg, amely felbontja a megadott útvonalat, hogy a szolgáltató azonosíthassa az egyes elemeit. Egy tömböt ad vissza, amely az útelemekből áll.

GetTable módszer

Ez az elemszolgáltató a GetTables segéd módszert valósítja meg, amely egy DatabaseTableInfo objektumot ad vissza, amely a hívásban megadott tábláról származó információkat reprezentálja.

GetRow metódus

Ennek az item szolgáltatónak a System.Management.Automation.Provider.ItemCmdletProvider.GetItem metódusa a GetRows segítő metódust hívja. Ez a segítő módszer egy DatabaseRowInfo objektumot kér, amely a táblázatban megadott sorról szól.

DatabaseTableInfo osztály

Ez az elemszolgáltató egy DatabaseTableInfo osztályt definiál, amely egy adattábla információgyűjteményét képviseli az adatbázisban. Ez az osztály hasonló a System.IO.Directoryinfo osztályhoz.

A mintatétel szolgáltató egy DatabaseTableInfo.GetTables metódumust definiál, amely egy táblázat-információs objektumokból álló gyűjteményt ad vissza, amelyek definiálják az adatbázis tábláit. Ez a módszer tartalmaz egy try/catch blokkot, hogy biztosítsa, hogy bármilyen adatbázis-hiba nulla bejegyzéssel rendelkező sorként jelenjen meg.

DatabaseRowInfo osztály

Ez az elemszolgáltató definiálja a DatabaseRowInfo segítő osztályt, amely egy sort képvisel az adatbázis táblázatában. Ez az osztály hasonló a System.IO.FileInfo osztályhoz.

A mintaszolgáltató egy DatabaseRowInfo.GetRows metódust definiál, hogy a megadott táblázathoz sorinformációs objektumok gyűjteményét adja vissza. Ez a módszer tartalmaz egy try/catch blokkot a kivételek csapdájához. Bármilyen hiba esetén nem lesz sorinformáció.

Kódrészlet

A teljes mintakódért lásd: AccessDbProviderSample03 Kód minta címet.

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

Szolgáltató írásakor szükség lehet tagok hozzáadására meglévő objektumokhoz vagy új objektumok definiálására. A befejezés után hozz létre egy Types fájlt, amellyel a Windows PowerShell azonosíthatja az objektum tagjait, valamint egy Format fájlt, amely meghatározza, hogyan jelenítik meg az objektumot. További információért lásd: Objektumtípusok és formázás bővítése.

A Windows PowerShell szolgáltató felé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 ez a Windows PowerShell elemszolgáltató regisztrált a Windows PowerShell-re, csak a szolgáltató alapvető és meghajtó funkcióit tesztelheted. Az elemek manipulálásának teszteléséhez a konténer funkciókat is meg kell valósítanod, amelyet a Container Windows PowerShell Provider implementálásakor leírtak.

Lásd még