Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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*:
Implementacja metody System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* nie powinna weryfikować ścieżki jako w pełni kwalifikowanej ścieżki w przestrzeni nazw dostawcy. Należy pamiętać, ż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* dostawcy systemu plików może otrzymać wartość "windows\system32" w parametrze
parent
i "abc.dll" w parametrzechild
. Metoda łączy te wartości z separatorem "\" i zwraca wartość "windows\system32\abc.dll", która nie jest w pełni kwalifikowaną ścieżką systemu plików.Ważne
Części ścieżki podane w wywołaniu System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* mogą zawierać znaki niedozwolone w przestrzeni nazw dostawcy. Te znaki są najprawdopodobniej używane do rozszerzania symboli wieloznacznych, a implementacja tej metody nie powinna ich usuwać.
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.
Uruchom nową powłokę i użyj polecenia cmdlet
Set-Location
, aby ustawić ścieżkę wskazującą bazę danych programu Access.Set-Location mydb:
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
Ponownie użyj polecenia cmdlet
Set-Location
, aby ustawić lokalizację tabeli danych Employees.Set-Location Employees
Teraz użyjemy polecenia cmdlet
Get-Location
, aby pobrać ścieżkę do tabeli Employees.Get-Location
Path ---- mydb:\Employees
Teraz użyj polecenia cmdlet
Get-ChildItem
potokowego do polecenia cmdletFormat-Table
. Ten zestaw poleceń cmdlet pobiera elementy tabeli danych Employees, które są wierszami tabeli tabeli. Są one formatowane zgodnie zFormat-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
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
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