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ę Windows PowerShell, który może pracować na wielowarstwowych magazynach danych. W tego typu magazynie danych najwyższy poziom magazynu zawiera elementy główne, a każdy kolejny poziom nazywany jest węzłem elementów potomnych. Pozwalając użytkownikowi na pracę nad tymi węzłami potomnymi, może on wchodzić w interakcje hierarchiczne poprzez magazyn danych.
Dostawcy zdolni do pracy z wielopoziomowymi magazynami danych nazywani są dostawcami kontenerów Windows PowerShell. Należy jednak pamiętać, że dostawca kontenerów Windows PowerShell może być używany tylko wtedy, gdy istnieje jeden kontener (bez zagnieżdżonych kontenerów) zawierający elementy. Jeśli są zagnieżdżone kontenery, musisz zaimplementować dostawcę nawigacji Windows PowerShell. Więcej informacji o implementacji dostawcy nawigacji Windows PowerShell można znaleźć w artykule Tworzenie dostawcy nawigacji Windows PowerShell.
Uwaga / Notatka
Możesz pobrać plik źródłowy C# (AccessDBSampleProvider04.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 kontenera Windows PowerShell definiuje bazę danych jako pojedynczy kontener, a tabele i wiersze bazy danych są zdefiniowane jako elementy kontenera.
Ostrzeżenie
Pamiętaj, że ten projekt zakłada bazę danych z polem z identyfikatorem nazwy, a typ pola to LongInteger.
Definiowanie klasy dostawcy kontenera Windows PowerShell
Dostawca kontenerów Windows PowerShell musi zdefiniować klasę .NET wywodzącą się z klasy bazowej System.Management.Automation.Provider.ContainerCmdletProvider . Oto definicja klasy dostawcy kontenerów Windows PowerShell opisana w tej sekcji.
[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : ContainerCmdletProvider
Zauważ, że w tej definicji klasy 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 Designing Your Windows PowerShell Provider, klasa System.Management.Automation.Provider.ContainerCmdletProvider pochodzi z kilku innych klas, które zapewniały różne funkcje dostawców. Dostawca kontenerów Windows PowerShell musi więc 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 Windows PowerShell. Jednak większość dostawców (w tym opisany tutaj) może korzystać z domyślnej implementacji tej funkcjonalności oferowanej przez Windows PowerShell.
Aby uzyskać dostęp do magazynu danych, dostawca musi wdrożyć metody podstawowej klasy 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.
Odzyskiwanie przedmiotów dla dzieci
Aby pobrać element potomny, dostawca kontenera Windows PowerShell musi nadpisać metodę System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems*, aby wspierać wywołania z cmdletu Get-ChildItem . Ta metoda pobiera elementy potomne ze zbioru danych i zapisuje je do potoku jako obiekty. Jeśli recurse parametr cmdletu jest podany, metoda pobiera wszystkie dzieci niezależnie od ich poziomu. Jeśli parametr recurse nie jest określony, metoda pobiera tylko jeden poziom potomków.
Oto implementacja metody System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* dla tego dostawcy. Zauważ, że ta metoda pobiera elementy potomne we wszystkich tabelach bazy danych, gdy ścieżka wskazuje bazę Access, a także pobiera elementy potomne z wierszy tej tabeli, jeśli ścieżka wskazuje na tabelę danych.
protected override void GetChildItems(string path, bool recurse)
{
// If path represented is a drive then the children in the path are
// tables. Hence all tables in the drive represented will have to be
// returned
if (PathIsDrive(path))
{
foreach (DatabaseTableInfo table in GetTables())
{
WriteItemObject(table, path, true);
// if the specified item exists and recurse has been set then
// all child items within it have to be obtained as well
if (ItemExists(path) && recurse)
{
GetChildItems(path + pathSeparator + table.Name, recurse);
}
} // foreach (DatabaseTableInfo...
} // if (PathIsDrive...
else
{
// Get the table name, row number and type of path from the
// path specified
string tableName;
int rowNumber;
PathType type = GetNamesFromPath(path, out tableName, out rowNumber);
if (type == PathType.Table)
{
// Obtain all the rows within the table
foreach (DatabaseRowInfo row in GetRows(tableName))
{
WriteItemObject(row, path + pathSeparator + row.RowNumber,
false);
} // foreach (DatabaseRowInfo...
}
else if (type == PathType.Row)
{
// In this case the user has directly specified a row, hence
// just give that particular row
DatabaseRowInfo row = GetRow(tableName, rowNumber);
WriteItemObject(row, path + pathSeparator + row.RowNumber,
false);
}
else
{
// In this case, the path specified is not valid
ThrowTerminatingInvalidPathException(path);
}
} // else
} // GetChildItems
Rzeczy, o których warto pamiętać przy wdrażaniu GetChildItems
Następujące warunki mogą mieć zastosowanie do Twojej implementacji System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems*:
Podczas definiowania klasy dostawcy, dostawca kontenerów Windows PowerShell może deklarować możliwości dostawcy ExpandWildcards, Filter, Include lub Exclude, z enumeracji System.Management.Automation.Provider.ProviderCapabilities . W takich przypadkach implementacja metody System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* musi zapewnić, że ścieżka przekazana do metody spełnia wymagania określonych możliwości. Aby to zrobić, metoda powinna uzyskać dostęp do odpowiednich właściwości, na przykład do właściwości System.Management.Automation.Provider.CmdletProvider.Exclude* oraz System.Management.Automation.Provider.CmdletProvider.Include* .
Implementacja tej metody powinna uwzględniać wszelkie formy dostępu do przedmiotu, które mogą uczynić go widocznym dla użytkownika. Na przykład, jeśli użytkownik ma dostęp do zapisu do pliku przez dostawcę systemu plików (dostarczonego przez Windows PowerShell), ale nie ma dostępu do odczytu, plik nadal istnieje i System.Management.Automation.Provider.ItemCmdletProvider.ItemExists* zwraca
true. Twoja implementacja może wymagać sprawdzenia elementu nadrzędnego, aby sprawdzić, czy dziecko może być wyliczone.Przy zapisywaniu wielu elementów metoda System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* może zająć trochę czasu. Możesz zaprojektować swojego dostawcę tak, aby zapisywał elementy za pomocą metody System.Management.Automation.Provider.CmdletProvider.WriteItemObject* pojedynczo. Stosując tę technikę, przedmioty zostaną przedstawione użytkownikowi w strumieniu.
Twoja implementacja System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* odpowiada za zapobieganie nieskończonej rekurencji przy łączach kołowych i podobnych działaniach. Należy wprowadzić odpowiedni wyjątek zakończający, aby odzwierciedlić taki warunek.
Przypisywanie parametrów dynamicznych do Get-ChildItem Cmdlet
Czasami Get-ChildItem cmdlet wywołujący System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* wymaga dodatkowych parametrów, które są określane dynamicznie w czasie działania. Aby zapewnić te parametry dynamiczne, dostawca kontenerów Windows PowerShell musi zaimplementować metodę System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItemsDynamicParameters* . Ta metoda pobiera parametry dynamiczne dla elementu na wskazanej ścieżce i zwraca obiekt o właściwościach i polach o atrybutach parsowania podobnych do klasy cmdlet lub obiektu System.Management.Automation.RuntimeDefinedParameterDictionary . Środowisko uruchomieniowe Windows PowerShell wykorzystuje zwrócony obiekt do dodawania parametrów do cmdletu Get-ChildItem .
Ten dostawca kontenerów Windows PowerShell nie implementuje tej metody. Jednak poniższy kod jest domyślną implementacją tej metody.
Pobieranie nazw przedmiotów potomnych
Aby pobrać nazwy elementów potomnych, dostawca kontenera Windows PowerShell musi nadpisać metodę System.Management.Automation.Provider.ContainerCmdletProvider.GetChildNames*, aby wspierać wywołania z Get-ChildItem cmdletu, gdy parametr jest określony Name . Ta metoda pobiera nazwy elementów potomnych dla określonej ścieżki lub nazwy elementów potomnych dla wszystkich kontenerów, jeśli returnAllContainers parametr cmdletu jest określony. Imię dziecka to część liściowa ścieżki. Na przykład nazwa potomna ścieżki C:\windows\system32\abc.dll to "abc.dll". Nazwa potomna katalogu C:\windows\system32 to "system32".
Oto implementacja metody System.Management.Automation.Provider.ContainerCmdletProvider.GetChildNames* dla tego dostawcy. Zwróć uwagę, że metoda pobiera nazwy tabel, jeśli wskazana ścieżka wskazuje bazę danych Access (dysk), a numery wierszy, jeśli ścieżka wskazuje tabelę.
protected override void GetChildNames(string path,
ReturnContainers returnContainers)
{
// If the path represented is a drive, then the child items are
// tables. get the names of all the tables in the drive.
if (PathIsDrive(path))
{
foreach (DatabaseTableInfo table in GetTables())
{
WriteItemObject(table.Name, path, true);
} // foreach (DatabaseTableInfo...
} // if (PathIsDrive...
else
{
// Get type, table name and row number from path specified
string tableName;
int rowNumber;
PathType type = GetNamesFromPath(path, out tableName, out rowNumber);
if (type == PathType.Table)
{
// Get all the rows in the table and then write out the
// row numbers.
foreach (DatabaseRowInfo row in GetRows(tableName))
{
WriteItemObject(row.RowNumber, path, false);
} // foreach (DatabaseRowInfo...
}
else if (type == PathType.Row)
{
// In this case the user has directly specified a row, hence
// just give that particular row
DatabaseRowInfo row = GetRow(tableName, rowNumber);
WriteItemObject(row.RowNumber, path, false);
}
else
{
ThrowTerminatingInvalidPathException(path);
}
} // else
} // GetChildNames
Rzeczy, o których warto pamiętać przy wdrażaniu GetChildNames
Następujące warunki mogą mieć zastosowanie do Twojej implementacji System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems*:
Podczas definiowania klasy dostawcy, dostawca kontenerów Windows PowerShell może deklarować możliwości dostawcy ExpandWildcards, Filter, Include lub Exclude, z enumeracji System.Management.Automation.Provider.ProviderCapabilities . W takich przypadkach implementacja metody System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* musi zapewnić, że ścieżka przekazana do metody spełnia wymagania określonych możliwości. Aby to zrobić, metoda powinna uzyskać dostęp do odpowiednich właściwości, na przykład do właściwości System.Management.Automation.Provider.CmdletProvider.Exclude* oraz System.Management.Automation.Provider.CmdletProvider.Include* .
Uwaga / Notatka
Wyjątek od tej reguły występuje, gdy
returnAllContainersparametr cmdletu jest określony. W takim przypadku metoda powinna pobierać dowolną nazwę potomną dla kontenera, nawet jeśli nie odpowiada ona wartościom właściwości System.Management.Automation.Provider.CmdletProvider.Filter*, System.Management.Automation.Provider.CmdletProvider.Include* lub System.Management.Automation.Provider.CmdletProvider.Exclude* .Domyślnie, nadpisania tej metody nie powinny pobierać nazw obiektów, które zazwyczaj są ukryte przed użytkownikiem, chyba że określono właściwość System.Management.Automation.Provider.CmdletProvider.Force* . Jeśli wskazana ścieżka wskazuje kontener, właściwość System.Management.Automation.Provider.CmdletProvider.Force* nie jest wymagana.
Twoja implementacja System.Management.Automation.Provider.ContainerCmdletProvider.GetChildNames* odpowiada za zapobieganie nieskończonej rekurencji przy łączach kołowych i podobnych działaniach. Należy wprowadzić odpowiedni wyjątek zakończający, aby odzwierciedlić taki warunek.
Przypisywanie parametrów dynamicznych do Get-ChildItem Cmdlet (nazwa)
Czasami Get-ChildItem cmdlet (wraz z parametrem Name ) wymaga dodatkowych parametrów, które są określane dynamicznie w czasie działania. Aby zapewnić te parametry dynamiczne, dostawca kontenera Windows PowerShell musi zaimplementować metodę System.Management.Automation.Provider.ContainerCmdletProvider.GetChildNamesDynamicParameters* . Ta metoda pobiera parametry dynamiczne dla elementu na wskazanej ścieżce i zwraca obiekt o właściwościach i polach z atrybutami parsowania podobnymi do klasy cmdlet lub obiektu System.Management.Automation.RuntimeDefinedParameterDictionary . Środowisko uruchomieniowe Windows PowerShell wykorzystuje zwrócony obiekt do dodawania parametrów do cmdletu Get-ChildItem .
Ten dostawca nie wdraża tej metody. Jednak poniższy kod jest domyślną implementacją tej metody.
Przemianowanie przedmiotów
Aby zmienić nazwę elementu, dostawca kontenerów Windows PowerShell musi nadpisać metodę System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem* , aby wspierać wywołania z cmdletu Rename-Item . Ta metoda zmienia nazwę elementu na określonej ścieżce na nową podaną nazwę. Nowa nazwa musi zawsze być względna względem nadrzędnego elementu (kontenera).
Ten dostawca nie nadpisuje metody System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem* . Jednak domyślna implementacja jest następująca.
Rzeczy, o których warto pamiętać przy wdrażaniu RenameItem
Następujące warunki mogą mieć zastosowanie do Twojej implementacji System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem*:
Podczas definiowania klasy dostawcy, dostawca kontenerów Windows PowerShell może deklarować możliwości dostawcy ExpandWildcards, Filter, Include lub Exclude, z enumeracji System.Management.Automation.Provider.ProviderCapabilities . W takich przypadkach implementacja metody System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* musi zapewnić, że ścieżka przekazana do metody spełnia wymagania określonych możliwości. Aby to zrobić, metoda powinna uzyskać dostęp do odpowiednich właściwości, na przykład do właściwości System.Management.Automation.Provider.CmdletProvider.Exclude* oraz System.Management.Automation.Provider.CmdletProvider.Include* .
Metoda System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem* służy wyłącznie do modyfikacji nazwy elementu, a nie do operacji przenoszenia. Twoja implementacja metody powinna zapisać błąd, jeśli
newNameparametr zawiera separatory ścieżek lub może w inny sposób spowodować zmianę lokalizacji nadrzędnego elementu.Domyślnie nadpisywania tej metody nie powinny zmieniać nazw obiektów, chyba że zostanie określona właściwość System.Management.Automation.Provider.CmdletProvider.Force* . Jeśli wskazana ścieżka wskazuje kontener, właściwość System.Management.Automation.Provider.CmdletProvider.Force* nie jest wymagana.
Twoja implementacja metody System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem* powinna wywołać System.Management.Automation.Provider.CmdletProvider.ShouldProcess 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 przy zmianie nazw plików. System.Management.Automation.Provider.CmdletProvider.ShouldProcess wysyła nazwę zasobu do zmiany do użytkownika, przy czym środowisko działania Windows PowerShell uwzględnia wszelkie ustawienia wiersza poleceń lub zmienne preferencyjne przy określaniu, co powinno być wyświetlane.
Po wywołaniu System.Management.Automation.Provider.CmdletProvider.ShouldProcess zwraca
true, metoda System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem* powinna wywołać metodę System.Management.Automation.Provider.CmdletProvider.ShouldContinue . Ta metoda wysyła użytkownikowi wiadomość potwierdzającą, aby uzyskać dodatkowe informacje zwrotne, czy operacja powinna być kontynuowana. Dostawca powinien zadzwonić do System.Management.Automation.Provider.CmdletProvider.ShouldContinue jako dodatkową kontrolę potencjalnie niebezpiecznych modyfikacji systemu.
Przypisywanie parametrów dynamicznych do Rename-Item Cmdlet
Czasami Rename-Item cmdlet wymaga dodatkowych parametrów, które są określane dynamicznie w czasie działania. Aby zapewnić te dynamiczne parametry, dostawca kontenerów Windows PowerShell musi wdrożyć metodę System.Management.Automation.Provider.ContainerCmdletProvider.RenameItemDynamicParameters* . Ta metoda pobiera parametry elementu na wskazanej ścieżce i zwraca obiekt o właściwościach i polach z atrybutami parsowania podobnymi do klasy cmdlet lub obiektu System.Management.Automation.RuntimeDefinedParameterDictionary . Środowisko uruchomieniowe Windows PowerShell wykorzystuje zwrócony obiekt do dodawania parametrów do cmdletu Rename-Item .
Ten dostawca kontenera nie wdraża tej metody. Jednak poniższy kod jest domyślną implementacją tej metody.
Tworzenie nowych przedmiotów
Aby tworzyć nowe elementy, dostawca kontenerów musi wdrożyć metodę System.Management.Automation.Provider.ContainerCmdletProvider.NewItem*, aby wspierać wywołania z cmdletu New-Item . Ta metoda tworzy element danych znajdujący się na określonej ścieżce. Parametr type cmdletu zawiera typ zdefiniowany przez dostawcę dla nowego elementu. Na przykład dostawca systemu plików używa parametru type o wartości "plik" lub "katalog". Parametr newItemValue cmdletu określa wartość specyficzną dla dostawcy dla nowego elementu.
Oto implementacja metody System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* dla tego dostawcy.
protected override void NewItem( string path, string type, object newItemValue )
{
// Create the new item here after
// performing necessary validations
//
// WriteItemObject(newItemValue, path, false);
// Example
//
// if (ShouldProcess(path, "new item"))
// {
// // Create a new item and then call WriteObject
// WriteObject(newItemValue, path, false);
// }
} // NewItem
{
case 1:
{
string name = pathChunks[0];
if (TableNameIsValid(name))
{
tableName = name;
retVal = PathType.Table;
}
}
break;
case 2:
{
string name = pathChunks[0];
Rzeczy, o których warto pamiętać przy wdrażaniu NewItem
Następujące warunki mogą mieć zastosowanie do implementacji System.Management.Automation.Provider.ContainerCmdletProvider.NewItem*:
Metoda System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* powinna wykonać porównanie ciągu znaków przesłanych w parametrze
typebez rozróżniania wielkości wielkości liter. Powinno to również umożliwiać najmniej niejednoznaczne dopasowania. Na przykład dla typów "file" i "directory" do rozróżnienia potrzebna jest tylko pierwsza litera. Jeślitypeparametr wskazuje typ, którego Twój dostawca nie może stworzyć, metoda System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* powinna zapisać ArgumentException z komunikatem wskazującym typy, które dostawca może stworzyć.Dla parametru
newItemValuezaleca się wdrożenie metody System.Management.Automation.Provider.ContainerCmdletProvider.NewItem*, aby akceptować co najmniej ciągi znaków. Powinien również akceptować typ obiektu pobieranego przez metodę System.Management.Automation.Provider.ItemCmdletProvider.GetItem* dla tej samej ścieżki. Metoda System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* może używać metody System.Management.Automation.LanguagePrimitives.ConvertTo* do konwersji typów na pożądany typ.Twoja implementacja metody System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* powinna wywołać System.Management.Automation.Provider.CmdletProvider.ShouldProcess i sprawdzić jej wartość zwrotną przed wprowadzeniem jakichkolwiek zmian w magazynie danych. Po wywołaniu do System.Management.Automation.Provider.CmdletProvider.ShouldProcess jako spełnienie, metoda System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* powinna wywołać metodę System.Management.Automation.Provider.CmdletProvider.ShouldContinue jako dodatkową kontrolę potencjalnie niebezpiecznych modyfikacji systemu.
Przypisywanie parametrów dynamicznych do New-Item Cmdlet
Czasami New-Item cmdlet wymaga dodatkowych parametrów, które są określane dynamicznie w czasie działania. Aby zapewnić te parametry dynamiczne, dostawca kontenera musi zaimplementować metodę System.Management.Automation.Provider.ContainerCmdletProvider.NewItemDynamicParameters* . Ta metoda pobiera parametry elementu na wskazanej ścieżce i zwraca obiekt o właściwościach i polach z atrybutami parsowania podobnymi do klasy cmdlet lub obiektu System.Management.Automation.RuntimeDefinedParameterDictionary . Środowisko uruchomieniowe Windows PowerShell wykorzystuje zwrócony obiekt do dodawania parametrów do cmdletu New-Item .
Ten dostawca nie wdraża tej metody. Jednak poniższy kod jest domyślną implementacją tej metody.
Usuwanie przedmiotów
Aby usunąć elementy, dostawca Windows PowerShell musi nadpisać metodę System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem*, aby wspierać wywołania z cmdletu Remove-Item . Ta metoda usuwa element z magazynu danych na wyznaczonej ścieżce. Jeśli parametr Remove-Item cmdletu jest ustawiony recurse na true, metoda usuwa wszystkie elementy potomne niezależnie od ich poziomu. Jeśli parametr jest ustawiony na false, metoda usuwa tylko jeden element na określonej ścieżce.
Ten dostawca nie obsługuje usuwania przedmiotów. Jednak poniższy kod jest domyślną implementacją System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem*.
Rzeczy, o których warto pamiętać przy wdrażaniu RemoveItem
Następujące warunki mogą mieć zastosowanie do implementacji System.Management.Automation.Provider.ContainerCmdletProvider.NewItem*:
Podczas definiowania klasy dostawcy, dostawca kontenerów Windows PowerShell może deklarować możliwości dostawcy ExpandWildcards, Filter, Include lub Exclude, z enumeracji System.Management.Automation.Provider.ProviderCapabilities . W takich przypadkach implementacja metody System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* musi zapewnić, że ścieżka przekazana do metody spełnia wymagania określonych możliwości. Aby to zrobić, metoda powinna uzyskać dostęp do odpowiednich właściwości, na przykład do właściwości System.Management.Automation.Provider.CmdletProvider.Exclude* oraz System.Management.Automation.Provider.CmdletProvider.Include* .
Domyślnie nadpisania tej metody nie powinny usuwać obiektów, chyba że właściwość System.Management.Automation.Provider.CmdletProvider.Force* jest ustawiona na true. Jeśli wskazana ścieżka wskazuje kontener, właściwość System.Management.Automation.Provider.CmdletProvider.Force* nie jest wymagana.
Twoja implementacja System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem* odpowiada za zapobieganie nieskończonej rekurencji przy łączach kołowych i tym podobnych. Należy wprowadzić odpowiedni wyjątek zakończający, aby odzwierciedlić taki warunek.
Twoja implementacja metody System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem* powinna wywołać System.Management.Automation.Provider.CmdletProvider.OughtProcess i sprawdzić jej wartość zwrotną przed wprowadzeniem jakichkolwiek zmian w magazynie danych. Po wywołaniu
trueSystem.Management.Automation.Provider.CmdletProvider.ShouldProcess , metoda System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem* powinna wywołać metodę System.Management.Automation.Provider.CmdletProvider.ShouldContinue jako dodatkową kontrolę potencjalnie niebezpiecznych modyfikacji systemu.
Przypisywanie parametrów dynamicznych do Remove-Item Cmdlet
Czasami Remove-Item cmdlet wymaga dodatkowych parametrów, które są określane dynamicznie w czasie działania. Aby dostarczyć te parametry dynamiczne, dostawca kontenera musi wdrożyć metodę System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItemDynamicParameters* do obsługi tych parametrów. Ta metoda pobiera parametry dynamiczne dla elementu na wskazanej ścieżce i zwraca obiekt o właściwościach i polach z atrybutami parsowania podobnymi do klasy cmdlet lub obiektu System.Management.Automation.RuntimeDefinedParameterDictionary . Środowisko uruchomieniowe Windows PowerShell wykorzystuje zwrócony obiekt do dodawania parametrów do cmdletu Remove-Item .
Ten dostawca kontenera nie wdraża tej metody. Jednak poniższy kod jest domyślną implementacją System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItemDynamicParameters*.
Zapytanie o elementy poddane
Aby sprawdzić, czy elementy potomne znajdują się na określonej ścieżce, dostawca kontenera Windows PowerShell musi nadpisać metodę System.Management.Automation.Provider.ContainerCmdletProvider.HasChildItems* . Ta metoda zwraca, true jeśli element ma potomki, a false w przeciwnym razie nie. Dla ścieżki zerowej lub pustej metoda traktuje wszystkie elementy w magazynie danych za dzieci i zwraca true.
Oto nadpisanie dla metody System.Management.Automation.Provider.ContainerCmdletProvider.HasChildItems* . Jeśli metoda pomocnicza ChunkPath tworzy więcej niż dwie części ścieżki, metoda zwraca false, ponieważ zdefiniowane są tylko kontener bazy danych i kontener tabeli. Więcej informacji o tej metodzie pomocniczej można znaleźć w artykule Metoda ChunkPath omówiona w artykule Creating a Windows PowerShell Item Provider.
protected override bool HasChildItems( string path )
{
return false;
} // HasChildItems
ErrorCategory.InvalidOperation, tableName));
}
return results;
Rzeczy, o których warto pamiętać przy wdrażaniu HasChildItems
Następujące warunki mogą mieć zastosowanie do Twojej implementacji System.Management.Automation.Provider.ContainerCmdletProvider.HasChildItems*:
- Jeśli dostawca kontenera ujawni root zawierający interesujące punkty montażu, implementacja metody System.Management.Automation.Provider.ContainerCmdletProvider.HasChildItems* powinna zwrócić
truepo przesłaniu null lub pustego ciągu na ścieżkę.
Kopiowanie elementów
Aby skopiować elementy, dostawca kontenera musi wdrożyć metodę System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem , aby wspierać wywołania z cmdletu Copy-Item . Ta metoda kopiuje element danych z lokalizacji wskazanej parametrem path cmdletu do lokalizacji wskazanej przez parametr.copyPath Jeśli recurse parametr jest określony, metoda kopiuje wszystkie podkontenery. Jeśli parametr nie jest określony, metoda kopiuje tylko jeden poziom elementów.
Ten dostawca nie wdraża tej metody. Jednak poniższy kod jest domyślną implementacją System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem.
Rzeczy, o których warto pamiętać przy wdrażaniu CopyItem
Następujące warunki mogą mieć zastosowanie do Twojej implementacji System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem:
Podczas definiowania klasy dostawcy, dostawca kontenerów Windows PowerShell może deklarować możliwości dostawcy ExpandWildcards, Filter, Include lub Exclude, z enumeracji System.Management.Automation.Provider.ProviderCapabilities . W takich przypadkach implementacja metody System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* musi zapewnić, że ścieżka przekazana do metody spełnia wymagania określonych możliwości. Aby to zrobić, metoda powinna uzyskać dostęp do odpowiednich właściwości, na przykład do właściwości System.Management.Automation.Provider.CmdletProvider.Exclude* oraz System.Management.Automation.Provider.CmdletProvider.Include* .
Domyślnie nadpisania tej metody nie powinny kopiować obiektów na istniejące obiekty, chyba że właściwość System.Management.Automation.Provider.CmdletProvider.Force* jest ustawiona na .
trueNa przykład dostawca systemu plików nie skopiuje C:\temp\abc.txt na istniejący plik C:\abc.txt, chyba że właściwość System.Management.Automation.Provider.CmdletProvider.Force* jest ustawiona na .trueJeśli ścieżka wskazana w parametrzecopyPathistnieje i wskazuje kontener, właściwość System.Management.Automation.Provider.CmdletProvider.Force* nie jest wymagana. W takim przypadku System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem powinien skopiować element wskazany parametrempathdo kontenera wskazanego parametremcopyPathjako potomka.Twoja implementacja System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem odpowiada za zapobieganie nieskończonej rekurencji przy łączach kołowych i tym podobnych. Należy wprowadzić odpowiedni wyjątek zakończający, aby odzwierciedlić taki warunek.
Twoja implementacja metody System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem powinna wywołać System.Management.Automation.Provider.CmdletProvider.ShouldProcess i sprawdzić jej wartość zwrotną przed wprowadzeniem jakichkolwiek zmian w magazynie danych. Po wywołaniu System.Management.Automation.Provider.CmdletProvider.ShouldProcess jako true, metoda System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem powinna wywołać metodę System.Management.Automation.Provider.CmdletProvider.ShouldContinue jako dodatkową kontrolę potencjalnie niebezpiecznych modyfikacji systemu. Więcej informacji o wywoływaniu tych metod można znaleźć w artykule Zmiana nazw elementów.
Przypisywanie parametrów dynamicznych do Copy-Item Cmdlet
Czasami Copy-Item cmdlet wymaga dodatkowych parametrów, które są określane dynamicznie w czasie działania. Aby zapewnić te parametry dynamiczne, dostawca kontenerów Windows PowerShell musi zaimplementować metodę System.Management.Automation.Provider.ContainerCmdletProvider.CopyItemDynamicParameters*, aby obsługiwać te parametry. Ta metoda pobiera parametry elementu na wskazanej ścieżce i zwraca obiekt o właściwościach i polach z atrybutami parsowania podobnymi do klasy cmdlet lub obiektu System.Management.Automation.RuntimeDefinedParameterDictionary . Środowisko uruchomieniowe Windows PowerShell wykorzystuje zwrócony obiekt do dodawania parametrów do cmdletu Copy-Item .
Ten dostawca nie wdraża tej metody. Jednak poniższy kod jest domyślną implementacją System.Management.Automation.Provider.ContainerCmdletProvider.CopyItemDynamicParameters*.
Przykładowy kod
Pełny przykładowy kod można znaleźć w AccessDbProviderSample04 Code Sample.
Budowanie dostawcy Windows PowerShell
Zobacz 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ń. Należy pamiętać, że poniższy przykład wychodzi z fikcyjnej bazy danych Access.
Uruchom
Get-ChildItemprzycisk cmdlet, aby pobrać listę elementów potomnych z tabeli Klienci w bazie Access.Get-ChildItem mydb:customersPojawia się następujący wynik.
PSPath : AccessDB::customers PSDrive : mydb PSProvider : System.Management.Automation.ProviderInfo PSIsContainer : True Data : System.Data.DataRow Name : Customers RowCount : 91 Columns :Uruchom
Get-ChildItemponownie cmdlet, aby pobrać dane tabeli.(Get-ChildItem mydb:customers).DataPojawia się następujący wynik.
TABLE_CAT : C:\PS\northwind TABLE_SCHEM : TABLE_NAME : Customers TABLE_TYPE : TABLE REMARKS :Teraz użyj
Get-Itemcmdletu, aby pobrać elementy z wiersza 0 w tabeli danych.Get-Item mydb:\customers\0Pojawia się następujący wynik.
PSPath : AccessDB::customers\0 PSDrive : mydb PSProvider : System.Management.Automation.ProviderInfo PSIsContainer : False Data : System.Data.DataRow RowNumber : 0Ponowne użycie
Get-Itemdo pobrania danych dla elementów w wierszu 0.(Get-Item mydb:\customers\0).DataPojawia się następujący wynik.
CustomerID : 1234 CompanyName : Fabrikam ContactName : Eric Gruber ContactTitle : President Address : 4567 Main Street City : Buffalo Region : NY PostalCode : 98052 Country : USA Phone : (425) 555-0100 Fax : (425) 555-0101Teraz użyj
New-Itemcmdletu, aby dodać wiersz do istniejącej tabeli. ParametrPathokreśla pełną ścieżkę do wiersza i musi wskazywać numer wiersza większy niż istniejąca liczba wierszy w tabeli. Parametr wskazuje,TypeRowaby określić, jaki typ elementu należy dodać. Na koniecValueparametr określa listę wartości kolumn oddzieloną przecinkami dla wiersza.New-Item -Path mydb:\Customers\3 -ItemType "Row" -Value "3,CustomerFirstName,CustomerLastName,CustomerEmailAddress,CustomerTitle,CustomerCompany,CustomerPhone, CustomerAddress,CustomerCity,CustomerState,CustomerZip,CustomerCountry"Sprawdź poprawność operacji nowego elementu w następujący sposób.
PS mydb:\> cd Customers PS mydb:\Customers> (Get-Item 3).DataPojawia się następujący wynik.
ID : 3 FirstName : Eric LastName : Gruber Email : ericgruber@fabrikam.com Title : President Company : Fabrikam WorkPhone : (425) 555-0100 Address : 4567 Main Street City : Buffalo State : NY Zip : 98052 Country : USA
Zobacz też
Tworzenie dostawców Windows PowerShell
Projektowanie dostawcy Windows PowerShell
Implementacja dostawcy Windows PowerShell Element
Implementacja dostawcy nawigacji Windows PowerShell