Tworzenie dostawcy elementów Windows PowerShell

W tym temacie opisano sposób tworzenia dostawcy Windows PowerShell, który może manipulować danymi w magazynie danych. W tym temacie elementy danych w magazynie są określane jako "elementy" magazynu danych. W związku z tym dostawca, który może manipulować danymi w magazynie, jest określany jako dostawca elementów Windows PowerShell.

Uwaga

Możesz pobrać plik źródłowy języka C# (AccessDBSampleProvider03.cs) dla tego dostawcy przy użyciu zestawu Microsoft Windows Software Development Kit dla Windows Vista i składników środowiska uruchomieniowego .NET Framework 3.0. Aby uzyskać instrukcje dotyczące pobierania, zobacz How to Install Windows PowerShell and Download the Windows PowerShell SDK (Jak zainstalować Windows PowerShell i pobrać zestaw SDK Windows PowerShell). Pobrane pliki źródłowe są dostępne w PowerShell Samples katalogu. Aby uzyskać więcej informacji na temat innych implementacji dostawcy Windows PowerShell, zobacz Projektowanie dostawcy Windows PowerShell.

Dostawca elementów Windows PowerShell opisany w tym temacie pobiera elementy danych z bazy danych programu Access. W takim przypadku "element" jest tabelą w bazie danych programu Access lub wierszem w tabeli.

Definiowanie klasy dostawcy elementów Windows PowerShell

Dostawca elementów Windows PowerShell musi zdefiniować klasę .NET, która pochodzi z klasy bazowej System.Management.Automation.Provider.ItemCmdletProvider. Poniżej przedstawiono definicję klasy dostawcy elementów opisaną w tej sekcji.

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

public class AccessDBProvider : ItemCmdletProvider

Należy pamiętać, że w tej definicji klasy atrybut System.Management.Automation.Provider.CmdletProviderAttribute zawiera dwa parametry. Pierwszy parametr określa przyjazną dla użytkownika nazwę dostawcy, który jest używany przez Windows PowerShell. Drugi parametr określa Windows PowerShell określonych możliwości, które dostawca uwidacznia w środowisku uruchomieniowym Windows PowerShell podczas przetwarzania poleceń. W przypadku tego dostawcy nie ma dodanych Windows PowerShell określonych możliwości.

Definiowanie podstawowych funkcji

Zgodnie z opisem w temacie Design Your Windows PowerShell Provider (Projektowanie dostawcy Windows PowerShell) klasa System.Management.Automation.Provider.DriveCmdletProvider pochodzi z kilku innych klas, które zapewniły różne funkcje dostawcy. W związku z tym dostawca elementów Windows PowerShell musi zdefiniować wszystkie funkcje udostępniane przez te klasy.

Aby uzyskać więcej informacji na temat implementowania funkcji dodawania informacji inicjowania specyficznych dla sesji i wydawania zasobów używanych przez dostawcę, zobacz Tworzenie podstawowego dostawcy Windows PowerShell. Jednak większość dostawców, w tym dostawcę opisanego tutaj, może użyć domyślnej implementacji tej funkcji udostępnianej przez Windows PowerShell.

Aby dostawca elementów Windows PowerShell mógł manipulować elementami w magazynie, musi zaimplementować metody klasy bazowej System.Management.Automation.Provider.DriveCmdletProvider, aby uzyskać dostęp do magazynu danych. Aby uzyskać więcej informacji na temat implementowania tej klasy, zobacz Tworzenie dostawcy dysków Windows PowerShell.

Sprawdzanie poprawności ścieżki

Podczas wyszukiwania elementu danych środowisko uruchomieniowe Windows PowerShell dostarcza Windows PowerShell ścieżkę do dostawcy, zgodnie z definicją w sekcji "Pojęcia programu PSPath" w temacie How Windows PowerShell Works. Dostawca elementów Windows PowerShell musi zweryfikować ważność składniową i semantyczną dowolnej ścieżki przekazanej przez zaimplementowanie metody System.Management.Automation.Provider.ItemCmdletProvider.IsValidPath. Ta metoda zwraca wartość true , jeśli ścieżka jest prawidłowa, a false w przeciwnym razie. Należy pamiętać, że implementacja tej metody nie powinna weryfikować istnienia elementu w ścieżce, ale tylko, że ścieżka jest składniowo i semantycznie poprawna.

Oto implementacja metody System.Management.Automation.Provider.ItemCmdletProvider.IsValidPath dla tego dostawcy. Należy pamiętać, że ta implementacja wywołuje metodę pomocnika NormalizePath , aby przekonwertować wszystkie separatory w ścieżce na jednolitą.

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

Określanie, czy element istnieje

Po zweryfikowaniu ścieżki środowisko uruchomieniowe Windows PowerShell musi określić, czy element danych istnieje w tej ścieżce. Aby obsługiwać ten typ zapytania, dostawca elementów Windows PowerShell implementuje metodę System.Management.Automation.Provider.ItemCmdletProvider.ItemExists. Ta metoda zwraca true element w określonej ścieżce i false (wartość domyślna) w przeciwnym razie.

Oto implementacja metody System.Management.Automation.Provider.ItemCmdletProvider.ItemExists dla tego dostawcy. Należy pamiętać, że ta metoda wywołuje metody pomocnika PathIsDrive, ChunkPath i GetTable oraz używa zdefiniowanego przez dostawcę obiektu DatabaseTableInfo .

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

Należy pamiętać o implementowaniu elementu ItemExists

Następujące warunki mogą mieć zastosowanie do implementacji elementu System.Management.Automation.Provider.ItemCmdletProvider.ItemExists:

Dołączanie parametrów dynamicznych do polecenia cmdlet Test-Path

Test-Path Czasami polecenie cmdlet, które wywołuje element System.Management.Automation.Provider.ItemCmdletProvider.ItemExists, wymaga dodatkowych parametrów określonych dynamicznie w czasie wykonywania. Aby zapewnić te parametry dynamiczne, dostawca elementów Windows PowerShell musi zaimplementować metodę System.Management.Automation.Provider.ItemCmdletProvider.ItemExistsDynamicParameters. Ta metoda pobiera parametry dynamiczne elementu w wskazanej ścieżce i zwraca obiekt zawierający właściwości i pola z atrybutami analizowania podobnymi do klasy cmdlet lub obiektu System.Management.Automation.RuntimeDefinedParameterDictionary. Środowisko uruchomieniowe Windows PowerShell używa zwróconego obiektu w celu dodania Test-Path parametrów do polecenia cmdlet.

Ten dostawca elementów Windows PowerShell nie implementuje tej metody. Jednak poniższy kod jest domyślną implementacją tej metody.

Pobieranie elementu

Aby pobrać element, dostawca elementu Windows PowerShell musi zastąpić metodę System.Management.Automation.Provider.ItemCmdletProvider.GetItem w celu obsługi wywołań z Get-Item polecenia cmdlet. Ta metoda zapisuje element przy użyciu metody System.Management.Automation.Provider.CmdletProvider.WriteItemObject.

Oto implementacja metody System.Management.Automation.Provider.ItemCmdletProvider.GetItem dla tego dostawcy. Należy pamiętać, że ta metoda używa metod pomocnika GetTable i GetRow do pobierania elementów, które są tabelami w bazie danych programu Access lub wierszach w tabeli danych.

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

Należy pamiętać o implementacji polecenia GetItem

Następujące warunki mogą dotyczyć implementacji elementu System.Management.Automation.Provider.ItemCmdletProvider.GetItem:

Dołączanie parametrów dynamicznych do polecenia cmdlet Get-Item

Get-Item Czasami polecenie cmdlet wymaga dodatkowych parametrów, które są określane dynamicznie w czasie wykonywania. Aby zapewnić te parametry dynamiczne, dostawca elementów Windows PowerShell musi zaimplementować metodę System.Management.Automation.Provider.ItemCmdletProvider.GetItemDynamicParameters. Ta metoda pobiera parametry dynamiczne elementu w wskazanej ścieżce i zwraca obiekt zawierający właściwości i pola z atrybutami analizowania podobnymi do klasy cmdlet lub obiektu System.Management.Automation.RuntimeDefinedParameterDictionary. Środowisko uruchomieniowe Windows PowerShell używa zwróconego obiektu w celu dodania Get-Item parametrów do polecenia cmdlet.

Ten dostawca nie implementuje tej metody. Jednak poniższy kod jest domyślną implementacją tej metody.

Ustawianie elementu

Aby ustawić element, dostawca elementu Windows PowerShell musi zastąpić metodę System.Management.Automation.Provider.ItemCmdletProvider.SetItem w celu obsługi wywołań z Set-Item polecenia cmdlet. Ta metoda ustawia wartość elementu w określonej ścieżce.

Ten dostawca nie udostępnia zastąpienia metody System.Management.Automation.Provider.ItemCmdletProvider.SetItem. Jednak poniżej przedstawiono domyślną implementację tej metody.

Należy pamiętać o implementacji elementu SetItem

Następujące warunki mogą mieć zastosowanie do implementacji elementu System.Management.Automation.Provider.ItemCmdletProvider.SetItem:

Pobieranie parametrów dynamicznych dla elementu SetItem

Set-Item Czasami polecenie cmdlet wymaga dodatkowych parametrów, które są określane dynamicznie w czasie wykonywania. Aby zapewnić te parametry dynamiczne, dostawca elementów Windows PowerShell musi zaimplementować metodę System.Management.Automation.Provider.ItemCmdletProvider.SetItemDynamicParameters. Ta metoda pobiera parametry dynamiczne elementu w wskazanej ścieżce i zwraca obiekt zawierający właściwości i pola z atrybutami analizowania podobnymi do klasy cmdlet lub obiektu System.Management.Automation.RuntimeDefinedParameterDictionary. Środowisko uruchomieniowe Windows PowerShell używa zwróconego obiektu w celu dodania Set-Item parametrów do polecenia cmdlet.

Ten dostawca nie implementuje tej metody. Jednak poniższy kod jest domyślną implementacją tej metody.

Wyczyszczenie elementu

Aby wyczyścić element, dostawca elementów Windows PowerShell implementuje metodę System.Management.Automation.Provider.ItemCmdletProvider.ClearItem do obsługi wywołań z Clear-Item polecenia cmdlet. Ta metoda usuwa element danych w określonej ścieżce.

Ten dostawca nie implementuje tej metody. Jednak poniższy kod jest domyślną implementacją tej metody.

Kwestie, które należy pamiętać o implementowaniu rozwiązania ClearItem

Następujące warunki mogą dotyczyć implementacji elementu System.Management.Automation.Provider.ItemCmdletProvider.ClearItem:

Pobieranie parametrów dynamicznych dla funkcji ClearItem

Clear-Item Czasami polecenie cmdlet wymaga dodatkowych parametrów, które są określane dynamicznie w czasie wykonywania. Aby zapewnić te parametry dynamiczne, dostawca elementów Windows PowerShell musi zaimplementować metodę System.Management.Automation.Provider.ItemCmdletProvider.ClearItemDynamicParameters. Ta metoda pobiera parametry dynamiczne elementu w wskazanej ścieżce i zwraca obiekt zawierający właściwości i pola z atrybutami analizowania podobnymi do klasy cmdlet lub obiektu System.Management.Automation.RuntimeDefinedParameterDictionary. Środowisko uruchomieniowe Windows PowerShell używa zwróconego obiektu w celu dodania Clear-Item parametrów do polecenia cmdlet.

Ten dostawca elementów nie implementuje tej metody. Jednak poniższy kod jest domyślną implementacją tej metody.

Wykonywanie akcji domyślnej dla elementu

Dostawca elementów Windows PowerShell może zaimplementować metodę System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultAction w celu obsługi wywołań z Invoke-Item polecenia cmdlet, co umożliwia dostawcy wykonanie domyślnej akcji dla elementu w określonej ścieżce. Na przykład dostawca systemu plików może użyć tej metody do wywołania klasy ShellExecute dla określonego elementu.

Ten dostawca nie implementuje tej metody. Jednak poniższy kod jest domyślną implementacją tej metody.

Należy pamiętać o implementowaniu funkcji InvokeDefaultAction

Następujące warunki mogą dotyczyć implementacji elementu System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultAction:

Pobieranie parametrów dynamicznych dla funkcji InvokeDefaultAction

Invoke-Item Czasami polecenie cmdlet wymaga dodatkowych parametrów, które są określane dynamicznie w czasie wykonywania. Aby zapewnić te parametry dynamiczne, dostawca elementów Windows PowerShell musi zaimplementować metodę System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultActionDynamicParameters. Ta metoda pobiera parametry dynamiczne elementu w wskazanej ścieżce i zwraca obiekt zawierający właściwości i pola z atrybutami analizowania podobnymi do klasy cmdlet lub obiektu System.Management.Automation.RuntimeDefinedParameterDictionary. Środowisko uruchomieniowe Windows PowerShell używa zwróconego obiektu w celu dodania Invoke-Item parametrów dynamicznych do polecenia cmdlet.

Ten dostawca elementów nie implementuje tej metody. Jednak poniższy kod jest domyślną implementacją tej metody.

Implementowanie metod i klas pomocnika

Ten dostawca elementów implementuje kilka metod i klas pomocników, które są używane przez publiczne metody zastąpienia zdefiniowane przez Windows PowerShell. Kod dla tych metod i klas pomocników jest wyświetlany w sekcji Przykład kodu .

NormalizePath, metoda

Ten dostawca elementów implementuje metodę pomocnika NormalizePath , aby upewnić się, że ścieżka ma spójny format. Określony format używa ukośnika odwrotnego (\) jako separatora.

PathIsDrive, metoda

Ten dostawca elementów implementuje metodę pomocnika PathIsDrive , aby określić, czy określona ścieżka jest w rzeczywistości nazwą dysku.

ChunkPath, metoda

Ten dostawca elementów implementuje metodę pomocnika ChunkPath , która dzieli określoną ścieżkę, aby dostawca mógł zidentyfikować jego poszczególne elementy. Zwraca tablicę składającą się z elementów ścieżki.

GetTable, metoda

Ten dostawca elementów implementuje metodę pomocnika GetTables , która zwraca obiekt DatabaseTableInfo , który reprezentuje informacje o tabeli określonej w wywołaniu.

GetRow, metoda

Metoda System.Management.Automation.Provider.ItemCmdletProvider.GetItem tego dostawcy elementów wywołuje metodę pomocnika GetRows. Ta metoda pomocnika pobiera obiekt DatabaseRowInfo , który reprezentuje informacje o określonym wierszu w tabeli.

DatabaseTableInfo, klasa

Ten dostawca elementów definiuje klasę DatabaseTableInfo , która reprezentuje kolekcję informacji w tabeli danych w bazie danych. Ta klasa jest podobna do klasy System.IO.Directoryinfo .

Dostawca przykładowego elementu definiuje metodę DatabaseTableInfo.GetTables , która zwraca kolekcję obiektów informacji o tabeli definiujących tabele w bazie danych. Ta metoda zawiera blok try/catch, aby upewnić się, że każdy błąd bazy danych jest wyświetlany jako wiersz z zerowymi wpisami.

DatabaseRowInfo, klasa

Ten dostawca elementów definiuje klasę pomocnika DatabaseRowInfo , która reprezentuje wiersz w tabeli bazy danych. Ta klasa jest podobna do klasy System.IO.FileInfo .

Przykładowy dostawca definiuje metodę DatabaseRowInfo.GetRows , aby zwrócić kolekcję obiektów informacji o wierszach dla określonej tabeli. Ta metoda zawiera blok try/catch do wyjątków pułapki. Wszelkie błędy spowodują brak informacji o wierszu.

Przykład kodu

Aby uzyskać pełny przykładowy kod, zobacz AccessDbProviderSample03 Code Sample (Przykład kodu).

Definiowanie typów obiektów i formatowanie

Podczas pisania dostawcy może być konieczne dodanie elementów członkowskich do istniejących obiektów lub zdefiniowanie nowych obiektów. Po zakończeniu utwórz plik Typy, który Windows PowerShell może użyć do identyfikowania elementów członkowskich obiektu i pliku Formatu, który definiuje sposób wyświetlania obiektu. Aby uzyskać więcej informacji, zobacz Rozszerzanie typów obiektów i formatowanie.

Tworzenie dostawcy Windows PowerShell

Zobacz Jak rejestrować polecenia cmdlet, dostawców i aplikacje hosta.

Testowanie dostawcy Windows PowerShell

Po zarejestrowaniu tego dostawcy elementów Windows PowerShell za pomocą Windows PowerShell można przetestować tylko podstawową i stację dysków dostawcy. Aby przetestować manipulowanie elementami, należy również zaimplementować funkcje kontenera opisane w temacie Implementowanie dostawcy Windows PowerShell kontenera.

Zobacz też