Udostępnij za pośrednictwem


Tworzenie dostawcy nawigacji programu Windows PowerShell

W tym temacie opisano sposób tworzenia dostawcy nawigacji programu Windows PowerShell, który może nawigować po magazynie danych. Ten typ dostawcy obsługuje polecenia cykliczne, zagnieżdżone kontenery i ścieżki względne.

Uwaga

Możesz pobrać plik źródłowy języka C# (AccessDBSampleProvider05.cs) dla tego dostawcy przy użyciu zestawu Microsoft Windows Software Development Kit dla systemów Windows Vista i .NET Framework 3.0 Runtime Components. Aby uzyskać instrukcje pobierania, zobacz How to Install Windows PowerShell (Jak zainstalować program Windows PowerShell) i Download the Windows PowerShell SDK (Pobieranie zestawu Windows PowerShell SDK). Pobrane pliki źródłowe są dostępne w katalogu <Przykłady programu PowerShell>. Aby uzyskać więcej informacji na temat innych implementacji dostawców programu Windows PowerShell, zobacz Projektowanie dostawcy programu Windows PowerShell.

Dostawca opisany tutaj umożliwia użytkownikowi obsługę bazy danych programu Access jako dysku, dzięki czemu użytkownik może przejść do tabel danych w bazie danych. Podczas tworzenia własnego dostawcy nawigacji można zaimplementować metody, które mogą tworzyć ścieżki kwalifikowane pod kątem dysków wymagane do nawigacji, normalizować ścieżki względne, przenosić elementy magazynu danych, a także metody, które pobierają nazwy podrzędne, pobierają ścieżkę nadrzędną elementu i testują, aby określić, czy element jest kontenerem.

Ostrożność

Należy pamiętać, że w tym projekcie przyjęto założenie, że baza danych ma pole o identyfikatorze nazwy, a typ pola to LongInteger.

Definiowanie dostawcy programu Windows PowerShell

Dostawca nawigacji programu Windows PowerShell musi utworzyć klasę .NET pochodzącą z klasy bazowej System.Management.Automation.Provider.NavigationCmdlet Provider. Oto definicja klasy dostawcy nawigacji opisana w tej sekcji.

[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : NavigationCmdletProvider

Należy pamiętać, że w tym dostawcy 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 program Windows PowerShell. Drugi parametr określa funkcje specyficzne dla środowiska Windows PowerShell, które dostawca uwidacznia środowisko uruchomieniowe programu Windows PowerShell podczas przetwarzania poleceń. W przypadku tego dostawcy nie są dodawane żadne funkcje specyficzne dla programu Windows PowerShell.

Definiowanie podstawowych funkcji

Zgodnie z opisem w Design Your PS Provider, System.Management.Automation.Provider.NavigationCmdletProvider klasy bazowej pochodzi z kilku innych klas, które dostarczyły różnych funkcji dostawcy. Dlatego dostawca nawigacji programu Windows PowerShell musi zdefiniować wszystkie funkcje udostępniane przez te klasy.

Aby zaimplementować funkcje dodawania informacji inicjalizacji specyficznych dla sesji i wydawania zasobów używanych przez dostawcę, zobacz Tworzenie podstawowego dostawcy programu PS. Jednak większość dostawców (w tym dostawcy opisanych tutaj) może używać domyślnej implementacji tej funkcji udostępnianej przez program Windows PowerShell.

Aby uzyskać dostęp do magazynu danych za pośrednictwem dysku programu Windows PowerShell, należy zaimplementować metody System.Management.Automation.Provider.DriveCmdletProvider klasy bazowej. Aby uzyskać więcej informacji na temat implementowania tych metod, zobacz Tworzenie dostawcy dysków programu Windows PowerShell.

Aby manipulować elementami magazynu danych, takimi jak pobieranie, ustawianie i czyszczenie elementów, dostawca musi zaimplementować metody udostępniane przez klasę bazową System.Management.Automation.Provider.ItemCmdletProvider. Aby uzyskać więcej informacji na temat implementowania tych metod, zobacz Tworzenie dostawcy elementów programu Windows PowerShell.

Aby uzyskać dostęp do elementów podrzędnych lub ich nazw, magazynu danych, a także metod tworzenia, kopiowania, zmieniania nazw i usuwania elementów, należy zaimplementować metody udostępniane przez klasę bazową System.Management.Automation.Provider.ContainerCmdletProvider. Aby uzyskać więcej informacji na temat implementowania tych metod, zobacz Tworzenie dostawcy kontenera programu Windows PowerShell.

Tworzenie ścieżki programu Windows PowerShell

Dostawca nawigacji programu Windows PowerShell używa wewnętrznej ścieżki programu Windows PowerShell dostawcy, aby nawigować po elementach magazynu danych. Aby utworzyć ścieżkę wewnętrzną dostawcy, dostawca musi zaimplementować metodę System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* w celu obsługi wywołań z polecenia cmdlet Combine-Path. Ta metoda łączy ścieżkę nadrzędną i podrzędną w ścieżkę wewnętrzną dostawcy przy użyciu separatora ścieżki specyficznego dla dostawcy między ścieżkami nadrzędnymi i podrzędnym.

Domyślna implementacja pobiera ścieżki z separatorem ścieżki "/" lub "\", normalizuje separator ścieżki do "\", łączy części ścieżki nadrzędnej i podrzędnej z separatorem między nimi, a następnie zwraca ciąg zawierający połączone ścieżki.

Ten dostawca nawigacji nie implementuje tej metody. Poniższy kod jest jednak domyślną implementacją metody System.Management.Automation.Provider.NavigationCmdletProvider.MakePath*.

Ważne jest, aby pamiętać o implementowaniu programu MakePath

Następujące warunki mogą mieć zastosowanie do implementacji System.Management.Automation.Provider.NavigationCmdletProvider.MakePath*:

Pobieranie ścieżki nadrzędnej

Dostawcy nawigacji programu Windows PowerShell implementują metodę System.Management.Automation.Provider.NavigationCmdletProvider.GetParentPath*, aby pobrać część nadrzędną wskazanej pełnej lub częściowej ścieżki specyficznej dla dostawcy. Metoda usuwa część podrzędną ścieżki i zwraca część ścieżki nadrzędnej. Parametr root określa w pełni kwalifikowaną ścieżkę do katalogu głównego dysku. Ten parametr może mieć wartość null lub być pusty, jeśli zainstalowany dysk nie jest używany do operacji pobierania. Jeśli zostanie określony katalog główny, metoda musi zwrócić ścieżkę do kontenera w tym samym drzewie co katalog główny.

Przykładowy dostawca nawigacji nie zastępuje tej metody, ale używa domyślnej implementacji. Akceptuje ścieżki, które używają znaków "/" i "\" jako separatorów ścieżek. Najpierw normalizuje ścieżkę tak, aby miała tylko separatory "\", a następnie dzieli ścieżkę nadrzędną poza ostatnią ścieżkę "\" i zwraca ścieżkę nadrzędną.

Pamiętaj o implementowaniu polecenia GetParentPath

Implementacja metody System.Management.Automation.Provider.NavigationCmdletProvider.GetParentPath* powinna podzielić ścieżkę leksykalnie na separator ścieżki dla przestrzeni nazw dostawcy. Na przykład dostawca systemu plików używa tej metody do wyszukania ostatniego ciągu "\" i zwraca wszystko z lewej strony separatora.

Pobieranie nazwy ścieżki podrzędnej

Dostawca nawigacji implementuje metodę System.Management.Automation.Provider.NavigationCmdletProvider.GetChildName*, aby pobrać nazwę (element liścia) elementu podrzędnego znajdującego się w wskazanej pełnej lub częściowej ścieżce specyficznej dla dostawcy.

Przykładowy dostawca nawigacji nie zastępuje tej metody. Poniżej przedstawiono domyślną implementację. Akceptuje ścieżki, które używają znaków "/" i "\" jako separatorów ścieżek. Najpierw normalizuje ścieżkę, aby miała tylko separatory "\", a następnie dzieli ścieżkę nadrzędną od ostatniego "\" i zwraca nazwę części ścieżki podrzędnej.

Ważne jest, aby pamiętać o implementowaniu polecenia GetChildName

Implementacja metody System.Management.Automation.Provider.NavigationCmdletProvider.GetChildName* powinna podzielić ścieżkę leksykalnie na separator ścieżki. Jeśli podana ścieżka nie zawiera separatorów ścieżek, metoda powinna zwrócić ścieżkę niezmodyfikowaną.

Ważne

Ścieżka podana w wywołaniu tej metody może zawierać znaki, które są nielegalne w przestrzeni nazw dostawcy. Te znaki są najprawdopodobniej używane do rozszerzania symboli wieloznacznych lub dopasowywania wyrażeń regularnych, a implementacja tej metody nie powinna ich usuwać.

Określanie, czy element jest kontenerem

Dostawca nawigacji może zaimplementować metodę System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer*, aby określić, czy określona ścieżka wskazuje kontener. Zwraca wartość true, jeśli ścieżka reprezentuje kontener, a w przeciwnym razie wartość false. Użytkownik potrzebuje tej metody, aby móc użyć polecenia cmdlet Test-Path dla podanej ścieżki.

Poniższy kod przedstawia implementację System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer* implementacji w naszym przykładowym dostawcy nawigacji. Metoda sprawdza, czy określona ścieżka jest poprawna, a jeśli tabela istnieje, i zwraca wartość true, jeśli ścieżka wskazuje kontener.

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

Co należy pamiętać o implementacji isItemContainer

Klasa .NET dostawcy nawigacji może zadeklarować możliwości dostawcy rozszerzeńWildcards, Filter, Include lub Exclude z System.Management.Automation.ProviderCapabilities wyliczenie. W tym przypadku implementacja System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer* musi upewnić się, że ścieżka przekazana spełnia wymagania. W tym celu metoda powinna uzyskać dostęp do odpowiedniej właściwości, na przykład właściwości System.Management.Automation.Provider.CmdletProvider.Exclude*.

Przenoszenie elementu

W obsłudze polecenia cmdlet Move-Item dostawca nawigacji implementuje metodę System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem*. Ta metoda przenosi element określony przez parametr path do kontenera w ścieżce podanej w parametrze destination.

Przykładowy dostawca nawigacji nie zastępuje metody System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem*. Poniżej przedstawiono domyślną implementację.

Co należy pamiętać o implementowaniu elementu MoveItem

Klasa .NET dostawcy nawigacji może zadeklarować możliwości dostawcy rozszerzeńWildcards, Filter, Include lub Exclude z System.Management.Automation.ProviderCapabilities wyliczenie. W takim przypadku implementacja System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* musi upewnić się, że przekazana ścieżka spełnia wymagania. W tym celu metoda powinna uzyskać dostęp do odpowiedniej właściwości, na przykład właściwości CmdletProvider.Exclude.

Domyślnie przesłonięcia tej metody nie powinny przenosić obiektów na istniejące obiekty, chyba że właściwość System.Management.Automation.Provider.CmdletProvider.Force* jest ustawiona na wartość true. Na przykład dostawca systemu plików nie będzie kopiować C:\temp\abc.txt za pośrednictwem istniejącego pliku C:\bar.txt, chyba że właściwość System.Management.Automation.Provider.CmdletProvider.Force* jest ustawiona na true. Jeśli ścieżka określona w parametrze destination istnieje i jest kontenerem, właściwość System.Management.Automation.Provider.CmdletProvider.Force* nie jest wymagana. W tym przypadku System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* powinien przenieść element wskazany przez parametr path do kontenera wskazanego przez parametr destination jako element podrzędny.

Implementacja metody System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* powinna wywołać metodę System.Management.Automation.Provider.CmdletProvider.ShouldProcess i sprawdzić jej wartość zwracaną przed wprowadzeniem jakichkolwiek zmian w magazynie danych. Ta metoda służy do potwierdzania wykonania operacji po wprowadzeniu zmiany stanu systemu, na przykład usuwania plików. System.Management.Automation.Provider.CmdletProvider.ShouldProcess wysyła nazwę zasobu, który ma zostać zmieniony na użytkownika, przy czym środowisko uruchomieniowe programu Windows PowerShell uwzględnia wszystkie ustawienia wiersza polecenia lub zmienne preferencji w określaniu, co powinno być wyświetlane użytkownikowi.

Po wywołaniu metody System.Management.Automation.Provider.CmdletProvider.ShouldProcess zwraca true, metoda System.Management.Automation.Automation.Provider.NavigationCmdletProvider.MoveItem* powinna wywołać metodę System.Management.Automation.Provider.CmdletProvider.ShouldContinue. Ta metoda wysyła użytkownikowi komunikat, aby zezwolić na opinię, aby powiedzieć, czy operacja powinna być kontynuowana. Dostawca powinien wywołać System.Management.Automation.Provider.CmdletProvider.ShouldContinue jako dodatkową kontrolę pod kątem potencjalnie niebezpiecznych modyfikacji systemu.

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

Czasami polecenie cmdlet Move-Item wymaga dodatkowych parametrów, które są udostępniane dynamicznie w czasie wykonywania. Aby zapewnić te parametry dynamiczne, dostawca nawigacji musi zaimplementować System.Management.Automation.Provider.NavigationCmdletProvider.MoveItemDynamicParameters* metodę, aby uzyskać wymagane wartości parametrów z elementu w wskazanej ścieżce i zwrócić obiekt, który ma właściwości i pola z atrybutami analizy podobnymi do klasy cmdlet lub System.Management.Automation.RuntimeDefinedParameterDictionary.

Ten dostawca nawigacji nie implementuje tej metody. Poniższy kod jest jednak domyślną implementacją System.Management.Automation.Provider.NavigationCmdletProvider.MoveItemDynamicParameters*.

Normalizacja ścieżki względnej

Dostawca nawigacji implementuje metodę System.Management.Automation.Provider.NavigationCmdletProvider.NormalizeRelativePath*, aby znormalizować w pełni kwalifikowaną ścieżkę wskazaną w parametrze path jako względną ścieżkę określoną przez parametr basePath. Metoda zwraca reprezentację ciągu znormalizowanej ścieżki. Zapisuje błąd, jeśli parametr path określa nieistnieną ścieżkę.

Przykładowy dostawca nawigacji nie zastępuje tej metody. Poniżej przedstawiono domyślną implementację.

Co należy pamiętać o implementowaniu normalizeRelativePath

Implementacja System.Management.Automation.Provider.NavigationCmdletProvider.NormalizeRelativePath* powinna przeanalizować parametr path, ale nie musi używać wyłącznie analizy składniowej. Zachęcamy do zaprojektowania tej metody w celu wyszukania informacji o ścieżce w magazynie danych i utworzenia ścieżki zgodnej ze składnią wielkości liter i standardowej ścieżki.

Przykładowy kod

Aby uzyskać pełny przykładowy kod, zobacz AccessDbProviderSample05 Code Sample.

Definiowanie typów obiektów i formatowanie

Dostawca może dodawać elementy członkowskie do istniejących obiektów lub definiować nowe obiekty. Aby uzyskać więcej informacji, zobaczRozszerzanie typów obiektów i formatowanie.

Kompilowanie dostawcy programu Windows PowerShell

Aby uzyskać więcej informacji, zobacz Jak rejestrować polecenia cmdlet, dostawcy i aplikacje hosta.

Testowanie dostawcy programu Windows PowerShell

Gdy dostawca programu Windows PowerShell został zarejestrowany w programie Windows PowerShell, możesz go przetestować, uruchamiając obsługiwane polecenia cmdlet w wierszu polecenia, w tym polecenia cmdlet udostępnione przez wyprowadzanie. W tym przykładzie zostanie przetestowany przykładowy dostawca nawigacji.

  1. Uruchom nową powłokę i użyj polecenia cmdlet Set-Location, aby ustawić ścieżkę wskazującą bazę danych programu Access.

    Set-Location mydb:
    
  2. Teraz uruchom polecenie cmdlet Get-ChildItem, aby pobrać listę elementów bazy danych, które są dostępnymi tabelami bazy danych. Dla każdej tabeli to polecenie cmdlet pobiera również liczbę wierszy tabeli.

    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
    
  3. Ponownie użyj polecenia cmdlet Set-Location, aby ustawić lokalizację tabeli danych Employees.

    Set-Location Employees
    
  4. Teraz użyjemy polecenia cmdlet Get-Location, aby pobrać ścieżkę do tabeli Employees.

    Get-Location
    
    Path
    ----
    mydb:\Employees
    
  5. Teraz użyj polecenia cmdlet Get-ChildItem potokowego do polecenia cmdlet Format-Table. Ten zestaw poleceń cmdlet pobiera elementy tabeli danych Employees, które są wierszami tabeli tabeli. Są one formatowane zgodnie z Format-Table polecenia cmdlet.

    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
    
  6. Teraz możesz uruchomić polecenie cmdlet Get-Item, aby pobrać elementy dla wiersza 0 tabeli danych Employees.

    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
    
  7. Ponownie użyj polecenia cmdlet Get-Item, aby pobrać dane pracownika dla elementów w wierszu 0.

    (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
    

Zobacz też

Tworzenie dostawców programu Windows PowerShell

projektowanie dostawcy programu Windows PowerShell

rozszerzanie typów obiektów i formatowanie

implementowanie dostawcy programu Windows PowerShell kontenera

Jak rejestrować polecenia cmdlet, dostawcy i aplikacje hosta

Przewodnik programisty programu Windows PowerShell

zestaw SDK programu Windows PowerShell