Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Ten temat opisuje, jak stworzyć dostawcę nawigacji Windows PowerShell, który potrafi nawigować po magazynie danych. Ten typ dostawcy obsługuje polecenia rekurencyjne, zagnieżdżone kontenery oraz ścieżki względne.
Uwaga / Notatka
Możesz pobrać plik źródłowy C# (AccessDBSampleProvider05.cs) tego dostawcy za pomocą Microsoft Windows Software Development Kit for Windows Vista oraz .NET Framework 3.0 Runtime Components. Instrukcje pobrania można znaleźć w sekcji Jak zainstalować Windows PowerShell oraz pobierz Windows PowerShell SDK. Pobrane pliki źródłowe są dostępne w katalogu <PowerShell Samples> . Więcej informacji o innych implementacjach dostawców Windows PowerShell można znaleźć w artykule Projektowanie swojego dostawcy Windows PowerShell.
Opisany tutaj dostawca umożliwia użytkownikowi zarządzanie bazą danych Access jako nośnikiem, dzięki czemu użytkownik może nawigować do tabel danych w bazie danych. Tworząc własnego dostawcę nawigacji, możesz wdrożyć metody, które mogą wymagać ścieżek kwalifikowanych przez dysk do nawigacji, normalizować ścieżki względne, przenosić elementy z magazynu danych, a także metody generujące nazwy potomne, ścieżkę nadrzędną elementu oraz testować, czy element jest kontenerem.
Ostrzeżenie
Pamiętaj, że ten projekt zakłada bazę danych z polem z identyfikatorem nazwy, a typ pola to LongInteger.
Zdefiniuj dostawcę Windows PowerShell
Dostawca nawigacji w systemie Windows PowerShell musi stworzyć klasę .NET pochodzącą z klasy bazowej System.Management.Automation.Provider.NavigationCmdletProvider . Oto definicja klasy dostawcy nawigacji opisana w tej sekcji.
[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : NavigationCmdletProvider
Należy zauważyć, że w tym dostawcy atrybut System.Management.Automation.Provider.CmdletProviderAttribute zawiera dwa parametry. Pierwszy parametr określa przyjazną dla użytkownika nazwę dostawcy używanego przez Windows PowerShell. Drugi parametr określa specyficzne możliwości Windows PowerShell, które dostawca udostępnia środowisku wykonawczym Windows PowerShell podczas przetwarzania poleceń. Dla tego dostawcy nie dodano żadnych specyficznych funkcji Windows PowerShell.
Definiowanie funkcjonalności bazowej
Jak opisano w Design Your PS Provider, klasa bazowa System.Management.Automation.Provider.NavigationCmdletProvider wywodzi się z kilku innych klas, które zapewniały różne funkcje dostawców. Dostawca nawigacji w Windows PowerShell musi zatem zdefiniować całą funkcjonalność oferowaną przez te klasy.
Aby zaimplementować funkcje dodawania informacji inicjalizacyjnych specyficznych dla sesji oraz uwalniania zasobów używanych przez dostawcę, zobacz Tworzenie podstawowego dostawcy PS. Jednak większość dostawców (w tym opisany tutaj) może korzystać z domyślnej implementacji tej funkcjonalności udostępnionej przez Windows PowerShell.
Aby uzyskać dostęp do magazynu danych przez dysk Windows PowerShell, musisz zaimplementować metody klasy bazowej System.Management.Automation.Provider.DriveCmdletProvider . Więcej informacji o implementacji tych metod można znaleźć w artykule Tworzenie dostawcy dysków Windows PowerShell.
Aby manipulować elementami magazynu danych, takimi jak pobieranie, ustawianie i czyszczenie elementów, dostawca musi wdrożyć metody dostępne przez klasę bazową System.Management.Automation.Provider.ItemCmdletProvider . Więcej informacji o implementacji tych metod można znaleźć w artykule Tworzenie dostawcy elementów Windows PowerShell.
Aby dostać się do elementów potomnych lub ich nazw magazynu danych, a także do metod tworzenia, kopiowania, zmiany nazwy i usuwania elementów, musisz zaimplementować metody dostępne przez podstawową klasę System.Management.Automation.Provider.ContainerCmdletProvider . Więcej informacji na temat implementacji tych metod można znaleźć w artykule Tworzenie dostawcy kontenerów Windows PowerShell.
Tworzenie ścieżki Windows PowerShell
Dostawca nawigacji Windows PowerShell korzysta z wewnętrznej ścieżki Windows PowerShell do nawigacji po elementach magazynu danych. Aby stworzyć ścieżkę wewnętrzną operatora, dostawca musi zaimplementować metodę System.Management.Automation.Provider.NavigationCmdletProvider.MakePath*, aby wspierać wywołania z cmdletu Combine-Path. Metoda ta łączy ścieżkę rodzica i dziecka w ścieżkę wewnętrzną dla dostawcy, wykorzystując separator ścieżek specyficzny dla dostawcy między ścieżką rodzica a potomkiem.
Domyślna implementacja przyjmuje ścieżki z "/" lub "\" jako separatorem ścieżek, normalizuje separator ścieżek do "\", łączy część ścieżki rodzica i potomnej z separatorem między nimi, a następnie zwraca ciąg zawierający połączone ścieżki.
Ten dostawca nawigacji nie wdraża tej metody. Jednak poniższy kod jest domyślną implementacją metody System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* .
Rzeczy, o których warto pamiętać przy wdrażaniu MakePath
Następujące warunki mogą mieć zastosowanie do Twojej implementacji System.Management.Automation.Provider.NavigationCmdletProvider.MakePath*:
Twoja implementacja metody System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* nie powinna walidować ścieżki jako legalnej, w pełni kwalifikowanej ścieżki w przestrzeni nazw dostawcy. Pamiętaj, że każdy parametr może reprezentować tylko część ścieżki, a połączone części mogą nie generować w pełni kwalifikowanej ścieżki. Na przykład metoda System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* dla dostawcy systemu plików może otrzymać "windows\system32" w parametrze
parentoraz "abc.dll" w parametrzechild. Metoda łączy te wartości z separatorem "\" i zwraca "windows\system32\abc.dll", który nie jest w pełni kwalifikowaną ścieżką systemu plików.Ważne
Części ścieżki dostępne w wywołaniu do System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* mogą zawierać znaki niedozwolone w przestrzeni nazw dostawcy. Te postacie najprawdopodobniej są używane do rozszerzania dzikich kart i wdrożenie tej metody nie powinno ich usuwać.
Odzyskiwanie ścieżki rodzica
Dostawcy nawigacji Windows PowerShell implementują metodę System.Management.Automation.Provider.NavigationCmdletProvider.GetParentPath*, aby pobrać nadrzędną część wyznaczonej pełnej lub częściowej ścieżki specyficznej dla dostawcy. Metoda usuwa część potomną ścieżki i zwraca część ścieżki nadrzędnej. Parametr ten root określa w pełni kwalifikowaną ścieżkę do korzenia dysku. Ten parametr może być wynikliwy lub pusty, jeśli zamontowany dysk nie jest używany do operacji pobierania. Jeśli określono korzenie, metoda musi zwrócić ścieżkę do kontenera w tym samym drzewie co ten korzeni.
Dostawca nawigacji próbek nie nadpisuje tej metody, lecz stosuje domyślną implementację. Akceptuje ścieżki, które wykorzystują zarówno "/", jak i "\" jako separatory ścieżek. Najpierw normalizuje ścieżkę tak, aby miała tylko separatory "\", następnie rozdziela ścieżkę nadrzędną na ostatnim "\" i zwraca ścieżkę nadrzędną.
Pamiętać o implementacji GetParentPath
Twoja implementacja metody System.Management.Automation.Provider.NavigationCmdletProvider.GetParentPath* powinna dzielić ścieżkę leksykalnie na separatorze ścieżek dla przestrzeni nazw dostawcy. Na przykład dostawca systemu plików używa tej metody do wyszukiwania ostatniego "\" i zwraca wszystko po lewej stronie separatora.
Odzyskaj nazwę Ścieżki Dziecka
Twój dostawca nawigacji wdraża metodę System.Management.Automation.Provider.NavigationCmdletProvider.GetChildName*, aby pobrać nazwę (element liścia) dziecka elementu umieszczonego na wskazanej pełnej lub częściowej ścieżce specyficznej dla dostawcy.
Dostawca nawigacji próbek nie nadpisuje tej metody. Domyślna implementacja przedstawiona jest poniżej. Akceptuje ścieżki, które wykorzystują zarówno "/", jak i "\" jako separatory ścieżek. Najpierw normalizuje ścieżkę tak, aby miała tylko separatory "\", następnie rozdziela ścieżkę nadrzędną na ostatnim "\" i zwraca nazwę części ścieżki potomnej.
Rzeczy, o których warto pamiętać przy wdrażaniu GetChildName
Twoja implementacja metody System.Management.Automation.Provider.NavigationCmdletProvider.GetChildName* powinna leksykalnie dzielić ścieżkę na separatorze ścieżek. Jeśli dostarczona ścieżka nie zawiera separatorów ścieżek, metoda powinna zwrócić ścieżkę bez modyfikacji.
Ważne
Ścieżka podawana w wywołaniu tej metody może zawierać znaki nielegalne w przestrzeni nazw dostawcy. Te znaki są najprawdopodobniej używane do rozszerzania dzikich kart lub dopasowywania wyrażeń regularnych, a wdrożenie tej metody nie powinno ich usuwać.
Określenie, czy przedmiot jest kontenerem
Dostawca nawigacji może zaimplementować metodę System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer*, aby określić, czy podana ścieżka wskazuje kontener. Zwraca prawda, jeśli ścieżka reprezentuje pojemnik, a fałszywość w przeciwnym przypadku. Użytkownik potrzebuje tej metody, aby móc użyć Test-Path cmdletu dla podany kanał.
Poniższy kod pokazuje implementację System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer* w naszym przykładowym dostawcy nawigacji. Metoda weryfikuje, że podana ścieżka jest poprawna oraz czy tabela istnieje, a zwraca 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
Rzeczy, o których warto pamiętać przy implementacji IsItemContainer
Klasa .NET dostawcy nawigacji może deklarować możliwości dostawcy ExpandWildcards, Filter, Include lub Exclude z enumeracji System.Management.Automation.Provider.ProviderCapabilities . W takim przypadku implementacja System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer* musi zapewnić, że przekazana ścieżka spełnia wymagania. Aby to zrobić, 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 przedmiotu
W ramach wsparcia Move-Item cmdlet, Twój dostawca nawigacji implementuje metodę System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* . Ta metoda przenosi element określony przez path parametr do kontenera na ścieżce podanej w parametrze destination .
Dostawca nawigacji próbnej nie nadpisuje metody System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* . Poniżej znajduje się domyślna implementacja.
Rzeczy, o których warto pamiętać przy wdrażaniu MoveItem
Klasa .NET dostawcy nawigacji może deklarować możliwości dostawcy ExpandWildcards, Filter, Include lub Exclude z enumeracji System.Management.Automation.Provider.ProviderCapabilities . W takim przypadku implementacja System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* musi zapewnić, że przedana ścieżka spełnia wymagania. Aby to zrobić, metoda powinna uzyskać dostęp do odpowiedniej właściwości, na przykład właściwości CmdletProvider.Excluded .
Domyślnie, nadpisania tej metody nie powinny przenosić obiektów nad istniejącymi obiektami, chyba że właściwość System.Management.Automation.Provider.CmdletProvider.Force* jest ustawiona na .true Na przykład dostawca systemu plików nie skopiuje C:\temp\abc.txt na istniejący plik C:\bar.txt, chyba że właściwość System.Management.Automation.Provider.CmdletProvider.Force* jest ustawiona na .true Jeśli ścieżka podana w parametrze destination istnieje i jest kontenerem, właściwość System.Management.Automation.Provider.CmdletProvider.Force* nie jest wymagana. W takim przypadku System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* powinien przenieść element wskazany parametrem path do kontenera wskazanego parametrem destination jako potomka.
Twoja implementacja metody System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* powinna wywołać System.Management.Automation.Provider.CmdletProvider.OughtProcess i sprawdzić jej wartość zwrotną przed wprowadzeniem jakichkolwiek zmian w magazynie danych. Metoda ta służy do potwierdzenia wykonania operacji po zmianie stanu systemu, na przykład usuwaniu plików. System.Management.Automation.Provider.CmdletProvider.ShouldProcess wysyła nazwę zasobu do zmiany do użytkownika, przy czym środowisko wykonawcze Windows PowerShell uwzględnia wszelkie ustawienia wiersza poleceń lub zmienne preferencyjne przy określaniu, co powinno być wyświetlane użytkownikowi.
Po wywołaniu System.Management.Automation.Provider.CmdletProvider.ShouldProcess returns true, metoda System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* powinna wywołać metodę System.Management.Automation.Provider.CmdletProvider.OughtContinue . Ta metoda wysyła użytkownikowi wiadomość, która pozwala na otrzymanie informacji zwrotnej, czy operacja powinna być kontynuowana. Twój dostawca powinien zadzwonić do System.Management.Automation.Provider.CmdletProvider.OughtContinue jako dodatkową kontrolę potencjalnie niebezpiecznych modyfikacji systemu.
Przypisywanie parametrów dynamicznych do Move-Item Cmdlet
Czasami Move-Item cmdlet wymaga dodatkowych parametrów, które są dynamicznie dostarczane w czasie działania. Aby dostarczyć te parametry dynamiczne, dostawca nawigacji musi zaimplementować metodę System.Management.Automation.Provider.NavigationCmdletProvider.MoveItemDynamicParameters*, aby uzyskać wymagane wartości parametrów z elementu na wskazanej ścieżce i zwrócić obiekt o właściwościach i polach z atrybutami parsowania podobnymi do klasy cmdlet lub obiektu System.Management.Automation.RuntimeDefinedParameterDictionary .
Ten dostawca nawigacji nie wdraża tej metody. Jednak poniższy kod jest domyślną implementacją System.Management.Automation.Provider.NavigationCmdletProvider.MoveItemDynamicParameters*.
Normalizacja ścieżki względnej
Twój dostawca nawigacji implementuje metodę System.Management.Automation.Provider.NavigationCmdletProvider.NormalizeRelativePath*, aby normalizować w pełni kwalifikowaną ścieżkę wskazaną w parametrze path jako względną do ścieżki określonej przez parametr.basePath Metoda zwraca reprezentację ciągu znormalizowanej ścieżki. Zapisuje błąd, jeśli path parametr określa nieistniejącą ścieżkę.
Dostawca nawigacji próbek nie nadpisuje tej metody. Poniżej znajduje się domyślna implementacja.
Rzeczy, o których warto pamiętać przy wdrażaniu NormalizeRelativePath
Twoja implementacja System.Management.Automation.Provider.NavigationCmdletProvider.NormalizeRelativePath* powinna analizować parametr, path ale nie musi używać wyłącznie składniowego parsowania. Zachęca się do zaprojektowania tej metody tak, aby ścieżka wyszukiwała informacje o ścieżce w magazynie danych i tworzyła ścieżkę odpowiadającą ogłoszeniu i ustandaryzowanej składni ścieżki.
Przykładowy kod
Pełny przykładowy kod można znaleźć w AccessDbProviderSample05 Code Sample.
Definiowanie typów obiektów i formatowanie
Możliwe jest, aby dostawca dodawał członków do istniejących obiektów lub definiował nowe obiekty. Więcej informacji można znaleźć wartykule Rozszerzanie typów obiektów i formatowania.
Budowanie dostawcy Windows PowerShell
Więcej informacji można znaleźć w artykule Jak rejestrować cmdlety, dostawców i aplikacje hostów.
Testowanie dostawcy Windows PowerShell
Gdy Twój dostawca Windows PowerShell zostanie zarejestrowany w Windows PowerShell, możesz go przetestować, uruchamiając obsługiwane cmdlets w wierszu poleceń, w tym cmdlets udostępnione przez derywację. Ten przykład przetestuje dostawcę nawigacji próbkowej.
Uruchom nową powłokę i użyj
Set-LocationCMDLET, aby ustawić ścieżkę wskazującą bazę Access.Set-Location mydb:Teraz uruchom
Get-ChildItemcmdlet, aby pobrać listę elementów bazy danych, czyli dostępnych tabel bazy danych. Dla każdej tabeli ten cmdlet pobiera również liczbę wierszy tabeli.Get-ChildItem | Format-Table RowCount, Name -AutoSizeRowCount 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 SuppliersUżyj ponownie przycisku
Set-Locationcmdlet, aby ustawić lokalizację tabeli danych Pracowników.Set-Location EmployeesTeraz użyjmy
Get-Locationcmdletu, aby odzyskać ścieżkę do stołu pracowników.Get-LocationPath ---- mydb:\EmployeesTeraz użyj cmdletu podłączonego
Get-ChildItemdoFormat-Tablecmdletu. Ten zestaw cmdletów pobiera elementy dla tabeli danych Pracowników, czyli wiersze tabeli. Są one sformatowane zgodnie z określonymi przezFormat-Tablecmdlet.Get-ChildItem | Format-Table RowNumber, PSIsContainer, Data -AutoSizeRowNumber 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.DataRowMożesz teraz uruchomić
Get-Itemcmdlet, aby pobrać elementy z wiersza 0 tabeli danych Employees.Get-Item 0PSPath : 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 : 0Użyj
Get-Itemponownie cmdletu, aby pobrać dane pracownika dla pozycji w wierszu 0.(Get-Item 0).DataEmployeeID : 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 Windows PowerShell
Zaprojektuj swojego dostawcy Windows PowerShell
Rozszerzanie typów obiektów i formatowanie
Implementacja kontenera Windows PowerShell provider
Jak rejestrować cmdlety, dostawców i aplikacje hostowane