Windows PowerShell elem-szolgáltató létrehozása

Ez a témakör azt ismerteti, hogyan hozhat létre olyan Windows PowerShell szolgáltatót, amely képes az adattárban lévő adatok kezelésére. Ebben a témakörben az adattárban lévő adatok elemeit az adattár "elemeinek" nevezzük. Ennek következtében az adattárban lévő adatokat manipuláló szolgáltatót Windows PowerShell elemszolgáltatónak nevezzük.

Megjegyzés

A szolgáltató C#-forrásfájlját (AccessDBSampleProvider03.cs) a Microsoft Windows Windows Vista és .NET-keretrendszer 3.0 futtatókörnyezeti összetevőkhöz készült szoftverfejlesztői készletével töltheti le. A letöltési utasításokért tekintse meg a Windows PowerShell telepítését és a Windows PowerShell SDK letöltését ismertető cikket. A letöltött forrásfájlok a könyvtárban PowerShell Samples érhetők el. A Windows PowerShell-szolgáltató egyéb implementációiról további információt a Windows PowerShell Provider tervezése című témakörben talál.

Az ebben a témakörben ismertetett Windows PowerShell elemszolgáltató lekéri az adatok elemeit egy Access-adatbázisból. Ebben az esetben az "elem" vagy az Access-adatbázisban lévő tábla, vagy egy tábla egy sora.

A Windows PowerShell elem szolgáltatói osztályának definiálása

A Windows PowerShell elemszolgáltatónak a System.Management.Automation.Provider.ItemCmdletProvider alaposztályból származtatott .NET-osztályt kell definiálnia. Az alábbiakban az ebben a szakaszban ismertetett elemszolgáltató osztálydefinícióját ismertetjük.

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

public class AccessDBProvider : ItemCmdletProvider

Vegye figyelembe, hogy ebben az osztálydefinícióban a System.Management.Automation.Provider.CmdletProviderAttribute attribútum két paramétert tartalmaz. Az első paraméter a Windows PowerShell által használt szolgáltató felhasználóbarát nevét adja meg. A második paraméter határozza meg a Windows PowerShell adott képességeket, amelyeket a szolgáltató elérhetővé tesz a Windows PowerShell futtatókörnyezet számára a parancsfeldolgozás során. Ehhez a szolgáltatóhoz nem érhető el Windows PowerShell adott képesség.

Alapfunkciók meghatározása

A Windows PowerShell-szolgáltató tervezésében leírtaknak megfelelően a System.Management.Automation.Provider.DriveCmdletProvider osztály számos más olyan osztályból származik, amelyek különböző szolgáltatói funkciókat biztosítottak. Ezért a Windows PowerShell elemszolgáltatónak meg kell határoznia az osztályok által biztosított összes funkciót.

A munkamenet-specifikus inicializálási 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 implementálásával kapcsolatos további információkért lásd: Alapszintű Windows PowerShell-szolgáltató létrehozása. A legtöbb szolgáltató, beleértve az itt leírt szolgáltatót is, használhatja a Windows PowerShell által biztosított alapértelmezett implementációt.

Ahhoz, hogy a Windows PowerShell elemszolgáltató módosíthassa a tárolóban lévő elemeket, implementálnia kell a System.Management.Automation.Provider.DriveCmdletProvider alaposztály metódusait az adattárhoz való hozzáféréshez. Az osztály megvalósításával kapcsolatos további információkért lásd: Windows PowerShell meghajtószolgáltató létrehozása.

Az elérési út érvényességének ellenőrzése

Ha egy adatelemet keres, a Windows PowerShell futtatókörnyezet egy Windows PowerShell elérési utat biztosít a szolgáltatónak, a Windows PowerShell működése "PSPath-fogalmak" című szakaszában meghatározottak szerint. A Windows PowerShell elemszolgáltatónak ellenőriznie kell a neki átadott elérési utak szintaktikai és szemantikai érvényességét a System.Management.Automation.Provider.ItemCmdletProvider.IsValidPath metódus implementálásával. Ez a metódus akkor ad true vissza értéket, ha az elérési út érvényes, és false ellenkező esetben. Vegye figyelembe, hogy ennek a módszernek a végrehajtása nem ellenőrizheti az elem meglétét az elérési úton, csak azt, hogy az elérési út szintaktikailag és szemantikailag helyes.

Íme a system.Management.Automation.Provider.ItemCmdletProvider.IsValidPath metódus implementálása ehhez a szolgáltatóhoz. Vegye figyelembe, hogy ez az implementáció egy NormalizePath segédmetódust hív meg, amely az elérési út összes elválasztóját egységessé alakítja.

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 elem

Az elérési út ellenőrzése után a Windows PowerShell futtatókörnyezetnek meg kell határoznia, hogy létezik-e adatelem az elérési úton. Az ilyen típusú lekérdezések támogatásához a Windows PowerShell elemszolgáltató implementálja a System.Management.Automation.Provider.ItemCmdletProvider.ItemExists metódust. Ez a metódus egy elemet ad vissza true , amely a megadott elérési úton található, egyébként false pedig (alapértelmezett).

Íme a System.Management.Automation.Provider.ItemCmdletProvider.ItemExists metódus implementálása ehhez a szolgáltatóhoz. Vegye figyelembe, hogy ez a metódus meghívja a PathIsDrive, a ChunkPath és a GetTable segédmetódusokat, é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

Az ItemExists implementálásával kapcsolatos tudnivalók

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

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

Előfordulhat, hogy a Test-Path System.Management.Automation.Provider.ItemCmdletProvider.ItemExists parancsmaghoz további paraméterek szükségesek, amelyek futásidőben dinamikusan vannak megadva. A dinamikus paraméterek megadásához a Windows PowerShell elemszolgáltatónak implementálnia kell a System.Management.Automation.Provider.ItemCmdletProvider.ItemExistsDynamicParameters metódust. Ez a metódus lekéri az elem dinamikus paramétereit a jelzett útvonalon, és visszaad egy olyan objektumot, amelynek tulajdonságai és mezői a parancsmagosztályhoz vagy a System.Management.Automation.RuntimeDefinedParameterDictionary objektumhoz hasonló elemzési attribútumokkal rendelkeznek. A Windows PowerShell futtatókörnyezet a visszaadott objektummal adja hozzá a paramétereket a Test-Path parancsmaghoz.

Ez a Windows PowerShell elemszolgáltató nem implementálja ezt a módszert. A metódus alapértelmezett implementációja azonban a következő kód.

Elem beolvasása

Egy elem lekéréséhez a Windows PowerShell elemszolgáltatónak felül kell bírálnia a System.Management.Automation.Provider.ItemCmdletProvider.GetItem metódust a Get-Item parancsmag hívásainak támogatásához. Ez a metódus a System.Management.Automation.Provider.CmdletProvider.WriteItemObject metódussal írja az elemet.

Íme a System.Management.Automation.Provider.ItemCmdletProvider.GetItem metódus implementálása ehhez a szolgáltatóhoz. Vegye figyelembe, hogy ez a metódus a GetTable és a GetRow segédmetódusokat használja az Access-adatbázis tábláinak vagy egy adattábla sorainak beolvasására.

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 tudnivalók a GetItem implementálásáról

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

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

Néha a Get-Item parancsmag további paramétereket igényel, amelyek dinamikusan vannak megadva futásidőben. A dinamikus paraméterek megadásához a Windows PowerShell elemszolgáltatónak implementálnia kell a System.Management.Automation.Provider.ItemCmdletProvider.GetItemDynamicParameters metódust. Ez a metódus lekéri az elem dinamikus paramétereit a jelzett útvonalon, és visszaad egy olyan objektumot, amelynek tulajdonságai és mezői a parancsmagosztályhoz vagy a System.Management.Automation.RuntimeDefinedParameterDictionary objektumhoz hasonló elemzési attribútumokkal rendelkeznek. A Windows PowerShell futtatókörnyezet a visszaadott objektummal adja hozzá a paramétereket a Get-Item parancsmaghoz.

Ez a szolgáltató nem implementálja ezt a módszert. A metódus alapértelmezett implementációja azonban a következő kód.

Elem beállítása

Elem beállításához a Windows PowerShell elemszolgáltatónak felül kell bírálnia a System.Management.Automation.Provider.ItemCmdletProvider.SetItem metódust a Set-Item parancsmagból érkező hívások támogatásához. Ez a metódus a megadott elérési úton állítja be 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. Ennek a módszernek azonban az alapértelmezett implementációja a következő.

Tudnivalók a SetItem implementálásáról

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

Dinamikus paraméterek lekérése a SetItemhez

Néha a Set-Item parancsmag további paramétereket igényel, amelyek dinamikusan vannak megadva futásidőben. A dinamikus paraméterek megadásához a Windows PowerShell elemszolgáltatónak implementálnia kell a System.Management.Automation.Provider.ItemCmdletProvider.SetItemDynamicParameters metódust. Ez a metódus lekéri az elem dinamikus paramétereit a jelzett útvonalon, és visszaad egy olyan objektumot, amelynek tulajdonságai és mezői a parancsmagosztályhoz vagy a System.Management.Automation.RuntimeDefinedParameterDictionary objektumhoz hasonló elemzési attribútumokkal rendelkeznek. A Windows PowerShell futtatókörnyezet a visszaadott objektummal adja hozzá a paramétereket a Set-Item parancsmaghoz.

Ez a szolgáltató nem implementálja ezt a módszert. A metódus alapértelmezett implementációja azonban a következő kód.

Elem törlése

Egy elem törléséhez a Windows PowerShell elemszolgáltató a System.Management.Automation.Provider.ItemCmdletProvider.ClearItem metódust implementálja a Clear-Item parancsmagból érkező hívások támogatásához. Ez a metódus törli az adatelemet a megadott elérési úton.

Ez a szolgáltató nem implementálja ezt a módszert. A metódus alapértelmezett implementációja azonban a következő kód.

Fontos tudnivalók a ClearItem implementálásáról

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

A ClearItem dinamikus paramétereinek lekérése

Előfordulhat, hogy a Clear-Item parancsmaghoz további paraméterek szükségesek, amelyek futásidőben dinamikusan vannak megadva. A dinamikus paraméterek megadásához a Windows PowerShell elemszolgáltatónak implementálnia kell a System.Management.Automation.Provider.ItemCmdletProvider.ClearItemDynamicParameters metódust. Ez a metódus lekéri az elem dinamikus paramétereit a jelzett útvonalon, és visszaad egy olyan objektumot, amelynek tulajdonságai és mezői a parancsmagosztályhoz vagy a System.Management.Automation.RuntimeDefinedParameterDictionary objektumhoz hasonló elemzési attribútumokkal rendelkeznek. A Windows PowerShell futtatókörnyezet a visszaadott objektummal adja hozzá a paramétereket a Clear-Item parancsmaghoz.

Ez az elemszolgáltató nem implementálja ezt a módszert. A metódus alapértelmezett implementációja azonban a következő kód.

Elem alapértelmezett műveletének végrehajtása

A Windows PowerShell elemszolgáltató implementálhatja a System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultAction metódust a parancsmag hívásainak Invoke-Item támogatásához, amely lehetővé teszi a szolgáltató számára, hogy alapértelmezett műveletet hajtson végre az elemhez a megadott elérési úton. Előfordulhat például, hogy a fájlrendszer-szolgáltató ezzel a módszerrel hívja meg a ShellExecute metódust egy adott elemhez.

Ez a szolgáltató nem implementálja ezt a módszert. A metódus alapértelmezett implementációja azonban a következő kód.

Az InvokeDefaultAction implementálásával kapcsolatos tudnivalók

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

Az InvokeDefaultAction dinamikus paramétereinek lekérése

Előfordulhat, hogy a Invoke-Item parancsmaghoz további paraméterek szükségesek, amelyek futásidőben dinamikusan vannak megadva. A dinamikus paraméterek biztosításához a Windows PowerShell elemszolgáltatónak implementálnia kell a System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultActionDynamicParameters metódust. Ez a metódus lekéri az elem dinamikus paramétereit a jelzett útvonalon, és visszaad egy olyan objektumot, amelynek tulajdonságai és mezői a parancsmagosztályhoz vagy a System.Management.Automation.RuntimeDefinedParameterDictionary objektumhoz hasonló elemzési attribútumokkal rendelkeznek. A Windows PowerShell futtatókörnyezet a visszaadott objektummal adja hozzá a dinamikus paramétereket a Invoke-Item parancsmaghoz.

Ez az elemszolgáltató nem implementálja ezt a módszert. A metódus alapértelmezett implementációja azonban a következő kód.

Segítő módszerek és osztályok implementálása

Ez az elemszolgáltató számos segédmetórát és osztályt implementál, amelyeket a Windows PowerShell által meghatározott nyilvános felülbírálási metódusok használnak. Ezeknek a segédmetenek és osztályoknak a kódja a Kódminta szakaszban látható.

NormalizePath metódus

Ez az elemszolgáltató normalizePath segédmetódust implementál, hogy az elérési út egységes formátumú legyen. A megadott formátum fordított perjelet (\) használ elválasztóként.

PathIsDrive metódus

Ez az elemszolgáltató egy PathIsDrive segédmetódust implementál annak megállapításához, hogy a megadott elérési út valójában a meghajtó neve-e.

ChunkPath metódus

Ez az elemszolgáltató implementál egy ChunkPath segédmetódust, amely megszakítja a megadott elérési utat, hogy a szolgáltató azonosítani tudja az egyes elemeket. Az elérési út elemeiből álló tömböt ad vissza.

GetTable metódus

Ez az elemszolgáltató implementálja a GetTables segédmetódust, amely egy DatabaseTableInfo objektumot ad vissza, amely a hívásban megadott táblára vonatkozó információkat jeleníti meg.

GetRow metódus

Az elemszolgáltató System.Management.Automation.Provider.ItemCmdletProvider.GetItem metódusa meghívja a GetRows segédmetódust. Ez a segédmetódus egy DatabaseRowInfo objektumot kér le, amely a tábla megadott sorával kapcsolatos információkat jelöli.

DatabaseTableInfo osztály

Ez az elemszolgáltató definiál egy DatabaseTableInfo osztályt, amely az adatbázis adattábláiban található információk gyűjteményét jelöli. Ez az osztály hasonló a System.IO.Directoryinfo osztályhoz.

A mintaelem-szolgáltató definiál egy DatabaseTableInfo.GetTables metódust, amely az adatbázisban lévő táblákat meghatározó táblainformációs objektumok gyűjteményét adja vissza. Ez a metódus tartalmaz egy próbálkozási/fogási blokkot, amely biztosítja, hogy az adatbázishibák nulla bejegyzést tartalmazó sorként jelenjenek meg.

DatabaseRowInfo osztály

Ez az elemszolgáltató határozza meg a DatabaseRowInfo segédosztályt, amely az adatbázis táblájának egy sorát jelöli. Ez az osztály hasonló a System.IO.FileInfo osztályhoz.

A mintaszolgáltató egy DatabaseRowInfo.GetRows metódust definiál, amely a megadott tábla sorinformációs objektumainak gyűjteményét adja vissza. Ez a metódus tartalmaz egy próbálkozási/fogási blokkot a kivételek alátöltéséhez. A hibák nem eredményeznek sorinformációt.

Kódminta

A teljes mintakódért tekintse meg az AccessDbProviderSample03 kódmintát.

Objektumtípusok és formázás definiálása

Szolgáltató írásakor előfordulhat, hogy tagokat kell hozzáadni a meglévő objektumokhoz, vagy új objektumokat kell definiálni. Ha végzett, hozzon létre egy Types fájlt, amely Windows PowerShell használható az objektum tagjainak azonosítására, valamint egy formátumfájlt, amely meghatározza az objektum megjelenítésének módját. További információ: Objektumtípusok és formázás kiterjesztése.

A Windows PowerShell-szolgáltató létrehozása

Lásd : Parancsmagok, szolgáltatók és gazdagépalkalmazások regisztrálása.

A Windows PowerShell szolgáltató tesztelése

Ha ez a Windows PowerShell elemszolgáltató regisztrálva van a Windows PowerShell, csak a szolgáltató alapszintű és meghajtófunkcióit tesztelheti. Az elemek kezelésének teszteléséhez implementálnia kell a Tároló-Windows PowerShell-szolgáltató implementálásában leírt tárolófunkciót is.

Lásd még