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 programu Windows PowerShell, który może pracować w wielowarstwowych magazynach danych. W przypadku tego typu magazynu danych najwyższy poziom magazynu zawiera elementy główne, a każdy kolejny poziom jest określany jako węzeł elementów podrzędnych. Dzięki umożliwieniu użytkownikowi pracy z tymi węzłami podrzędnym użytkownik może wchodzić w interakcję hierarchicznie za pośrednictwem magazynu danych.
Dostawcy, którzy mogą pracować w wielopoziomowych magazynach danych, są nazywani dostawcami kontenerów programu Windows PowerShell. Należy jednak pamiętać, że dostawca kontenera programu Windows PowerShell może być używany tylko wtedy, gdy istnieje jeden kontener (bez zagnieżdżonych kontenerów) z elementami w nim. Jeśli istnieją kontenery zagnieżdżone, musisz zaimplementować dostawcę nawigacji programu Windows PowerShell. Aby uzyskać więcej informacji na temat implementowania dostawcy nawigacji programu Windows PowerShell, zobacz Tworzenie dostawcy nawigacji programu Windows PowerShell.
Uwaga
Możesz pobrać plik źródłowy języka C# (AccessDBSampleProvider04.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 kontenera programu Windows PowerShell opisany tutaj definiuje bazę danych jako pojedynczy kontener z tabelami i wierszami bazy danych zdefiniowanymi jako elementy kontenera.
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 klasy dostawcy kontenerów programu Windows PowerShell
Dostawca kontenera programu Windows PowerShell musi zdefiniować klasę .NET pochodzącą z klasy bazowej System.Management.Automation.Provider.ContainerCmdletProvider. Oto definicja klasy dostawcy kontenera programu Windows PowerShell opisana w tej sekcji.
[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : ContainerCmdletProvider
Zwróć uwagę, ż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 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 Projektowanie dostawcy programu Windows PowerShell, klasa System.Management.Automation.Provider.ContainerCmdletProvider pochodzi z kilku innych klas, które dostarczyły różnych funkcji dostawcy. Dlatego dostawca kontenera programu Windows PowerShell musi zdefiniować wszystkie funkcje udostępniane przez te klasy.
Aby zaimplementować funkcje dodawania informacji inicjalizacji specyficznych dla sesji i udostępniania zasobów używanych przez dostawcę, zobacz Tworzenie podstawowego dostawcy programu Windows PowerShell. Jednak większość dostawców (w tym dostawcy opisanych tutaj) może używać domyślnej implementacji tej funkcji, która jest dostarczana przez program Windows PowerShell.
Aby uzyskać dostęp do magazynu danych, dostawca musi 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.
Pobieranie elementów podrzędnych
Aby pobrać element podrzędny, dostawca kontenera programu Windows PowerShell musi zastąpić metodę System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* metody do obsługi wywołań z polecenia cmdlet Get-ChildItem
. Ta metoda pobiera elementy podrzędne z magazynu danych i zapisuje je w potoku jako obiekty. Jeśli określono parametr recurse
polecenia cmdlet, metoda pobiera wszystkie elementy podrzędne niezależnie od poziomu, na jakim są. Jeśli nie określono parametru recurse
, metoda pobiera tylko jeden poziom elementów podrzędnych.
Oto implementacja metody System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* dla tego dostawcy. Zwróć uwagę, że ta metoda pobiera elementy podrzędne we wszystkich tabelach bazy danych, gdy ścieżka wskazuje bazę danych programu Access i pobiera elementy podrzędne z wierszy tej tabeli, jeśli ścieżka wskazuje 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
Co należy pamiętać o implementowaniu polecenia GetChildItems
Następujące warunki mogą mieć zastosowanie do implementacji System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems*:
Podczas definiowania klasy dostawcy dostawca kontenera programu Windows PowerShell może zadeklarować możliwości dostawcy rozszerzeńWildcards, Filter, Include lub Exclude z System.Management.Automation.ProviderCapabilities wyliczenia. 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. 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* i System.Management.Automation.Provider.CmdletProvider.Include*.
Implementacja tej metody powinna uwzględniać dowolną formę dostępu do elementu, który może sprawić, że element będzie widoczny dla użytkownika. Jeśli na przykład użytkownik ma dostęp do zapisu do pliku za pośrednictwem dostawcy systemu plików (dostarczonego przez program Windows PowerShell), ale nie ma dostępu do odczytu, plik nadal istnieje i System.Management.Automation.Provider.ItemCmdletProvider.ItemExists* zwraca
true
. Implementacja może wymagać sprawdzenia elementu nadrzędnego, aby sprawdzić, czy można wyliczyć element podrzędny.Podczas pisania wielu elementów metoda System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* może zająć trochę czasu. Możesz zaprojektować dostawcę, aby napisać elementy przy użyciu metody System.Management.Automation.Provider.CmdletProvider.WriteItemObject* pojedynczo. Użycie tej techniki spowoduje wyświetlenie elementów użytkownikowi w strumieniu.
Implementacja System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* jest odpowiedzialna za zapobieganie nieskończonej rekursji, gdy istnieją linki cykliczne i podobne. Należy zgłosić odpowiedni wyjątek zakończenia, aby odzwierciedlić taki warunek.
Dołączanie parametrów dynamicznych do polecenia cmdlet Get-ChildItem
Czasami polecenie cmdlet Get-ChildItem
, które wywołuje System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* wymaga dodatkowych parametrów, które są określane dynamicznie w czasie wykonywania. Aby zapewnić te parametry dynamiczne, dostawca kontenera programu Windows PowerShell musi zaimplementować metodę System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItemsDynamicParameters*. Ta metoda pobiera parametry dynamiczne dla elementu w wskazanej ścieżce i zwraca obiekt zawierający właściwości i pola z atrybutami analizowania podobnymi do klasy cmdlet lub System.Management.Automation.RuntimeDefinedParameterDictionary. Środowisko uruchomieniowe programu Windows PowerShell używa zwróconego obiektu w celu dodania parametrów do polecenia cmdlet Get-ChildItem
.
Ten dostawca kontenera programu Windows PowerShell nie implementuje tej metody. Jednak poniższy kod jest domyślną implementacją tej metody.
Pobieranie nazw elementów podrzędnych
Aby pobrać nazwy elementów podrzędnych, dostawca kontenera programu Windows PowerShell musi zastąpić System.Management.Automation.Provider.ContainerCmdletProvider.GetChildNames* metody do obsługi wywołań z polecenia cmdlet Get-ChildItem
, gdy określono jego parametr Name
. Ta metoda pobiera nazwy elementów podrzędnych dla określonej ścieżki lub nazw elementów podrzędnych dla wszystkich kontenerów, jeśli określono parametr returnAllContainers
polecenia cmdlet. Nazwa podrzędna to część liścia ścieżki. Na przykład nazwa podrzędna ścieżki C:\windows\system32\abc.dll to "abc.dll". Nazwa podrzędna 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 określona ścieżka wskazuje bazę danych programu Access (dysk) i 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
Ważne jest, aby pamiętać o implementowaniu poleceń GetChildNames
Następujące warunki mogą mieć zastosowanie do implementacji System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems*:
Podczas definiowania klasy dostawcy dostawca kontenera programu Windows PowerShell może zadeklarować możliwości dostawcy rozszerzeńWildcards, Filter, Include lub Exclude z System.Management.Automation.ProviderCapabilities wyliczenia. 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. 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* i System.Management.Automation.Provider.CmdletProvider.Include*.
Uwaga
Wyjątek od tej reguły występuje, gdy określono parametr
returnAllContainers
polecenia cmdlet. W takim przypadku metoda powinna pobrać dowolną nazwę podrzędną kontenera, nawet jeśli nie jest zgodna z wartościami System.Management.Automation.Provider.CmdletProvider.Filter*, System.Management.Automation.Provider.CmdletProvider.Include*lub System.Management.Provider.CmdletProvider.Exclude* właściwości.Domyślnie przesłonięcia tej metody nie powinny pobierać nazw obiektów, które są zwykle ukryte przed użytkownikiem, chyba że określono właściwość System.Management.Automation.Provider.CmdletProvider.Force*. Jeśli określona ścieżka wskazuje kontener, właściwość System.Management.Automation.Provider.CmdletProvider.Force* nie jest wymagana.
Implementacja System.Management.Automation.Provider.ContainerCmdletProvider.GetChildNames* jest odpowiedzialna za zapobieganie nieskończonej rekursji, gdy istnieją linki cykliczne i podobne. Należy zgłosić odpowiedni wyjątek zakończenia, aby odzwierciedlić taki warunek.
Dołączanie parametrów dynamicznych do polecenia cmdlet Get-ChildItem (nazwa)
Czasami polecenie cmdlet Get-ChildItem
(z parametrem Name
) wymaga dodatkowych parametrów, które są określane dynamicznie w czasie wykonywania. Aby zapewnić te parametry dynamiczne, dostawca kontenera programu Windows PowerShell musi zaimplementować metodę System.Management.Automation.Provider.ContainerCmdletProvider.GetChildNamesDynamicParameters*. 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 poleceń cmdlet lub System.Management.Automation.RuntimeDefinedParameterDictionary. Środowisko uruchomieniowe programu Windows PowerShell używa zwróconego obiektu w celu dodania parametrów do polecenia cmdlet Get-ChildItem
.
Ten dostawca nie implementuje tej metody. Jednak poniższy kod jest domyślną implementacją tej metody.
Zmienianie nazw elementów
Aby zmienić nazwę elementu, dostawca kontenera programu Windows PowerShell musi zastąpić System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem* metody do obsługi wywołań z polecenia cmdlet Rename-Item
. Ta metoda zmienia nazwę elementu w podanej ścieżce na nową nazwę. Nowa nazwa musi zawsze być względna względem elementu nadrzędnego (kontenera).
Ten dostawca nie zastępuje metody System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem*. Jednak poniżej przedstawiono domyślną implementację.
Co należy pamiętać o implementowaniu elementu RenameItem
Następujące warunki mogą mieć zastosowanie do implementacji System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem*:
Podczas definiowania klasy dostawcy dostawca kontenera programu Windows PowerShell może zadeklarować możliwości dostawcy rozszerzeńWildcards, Filter, Include lub Exclude z System.Management.Automation.ProviderCapabilities wyliczenia. 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. 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* i System.Management.Automation.Provider.CmdletProvider.Include*.
Metoda System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem* jest przeznaczona do modyfikacji nazwy elementu, a nie operacji przenoszenia. Implementacja metody powinna zawierać błąd, jeśli parametr
newName
zawiera separatory ścieżek lub może w inny sposób spowodować zmianę lokalizacji nadrzędnej elementu.Domyślnie przesłonięcia tej metody nie powinny zmieniać nazw obiektów, chyba że określono właściwość System.Management.Automation.Provider.CmdletProvider.Force*. Jeśli określona ścieżka wskazuje kontener, właściwość System.Management.Automation.Provider.CmdletProvider.Force* nie jest wymagana.
Implementacja metody System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem* powinna wywołać metodę System.Management.Automation.Provider.CmdletProvider.ShouldProcess i sprawdzić jego 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 zmiany nazw 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.
Po wywołaniu metody System.Management.Automation.Provider.CmdletProvider.ShouldProcess zwraca
true
, metoda System.Management.Automation.Automation.Provider.ContainerCmdletProvider.RenameItem* powinna wywołać metodę System.Management.Automation.Provider.CmdletProvider.ShouldContinue. Ta metoda wysyła komunikat z potwierdzeniem do użytkownika, aby umożliwić dodatkowe opinie, 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 Rename-Item
Czasami polecenie cmdlet Rename-Item
wymaga dodatkowych parametrów, które są określane dynamicznie w czasie wykonywania. Aby zapewnić te parametry dynamiczne, dostawca kontenera programu Windows PowerShell musi zaimplementować metodę System.Management.Automation.Provider.ContainerCmdletProvider.RenameItemDynamicParameters*. Ta metoda pobiera parametry elementu w wskazanej ścieżce i zwraca obiekt, który ma właściwości i pola z atrybutami analizowania podobnymi do klasy poleceń cmdlet lub System.Management.Automation.RuntimeDefinedParameterDictionary obiektu. Środowisko uruchomieniowe programu Windows PowerShell używa zwróconego obiektu w celu dodania parametrów do polecenia cmdlet Rename-Item
.
Ten dostawca kontenerów nie implementuje tej metody. Jednak poniższy kod jest domyślną implementacją tej metody.
Tworzenie nowych elementów
Aby utworzyć nowe elementy, dostawca kontenera musi zaimplementować metodę System.Management.Automation.Provider.ContainerCmdletProvider.NewItem*, aby obsługiwać wywołania z polecenia cmdlet New-Item
. Ta metoda tworzy element danych znajdujący się w określonej ścieżce. Parametr type
polecenia cmdlet zawiera typ zdefiniowany przez dostawcę dla nowego elementu. Na przykład dostawca systemu plików używa parametru type
z wartością "file" lub "directory". Parametr newItemValue
polecenia cmdlet określa wartość specyficzną dla dostawcy dla nowego elementu.
Poniżej przedstawiono implementację 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];
Co należy pamiętać o implementowaniu elementu 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 bez uwzględniania wielkości liter ciągu przekazanego w parametrze
type
. Powinno to również zezwalać na najmniej niejednoznaczne dopasowania. Na przykład w przypadku typów "file" i "directory" tylko pierwsza litera jest wymagana do uściślania. Jeśli parametrtype
wskazuje typ, którego dostawca nie może utworzyć, System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* metoda powinna napisać wyjątek ArgumentException z komunikatem wskazującym typy, które dostawca może utworzyć.W przypadku parametru
newItemValue
implementacja metody System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* jest zalecana do akceptowania ciągów co najmniej. Powinien również zaakceptować typ obiektu, który jest pobierany przez System.Management.Automation.Provider.ItemCmdletProvider.GetItem* metody dla tej samej ścieżki. Metoda System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* może użyć metody System.Management.Automation.LanguagePrimitives.ConvertTo*, aby przekonwertować typy na żądany typ.Implementacja metody System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* powinna wywołać metodę System.Management.Automation.Provider.CmdletProvider.ShouldProcess i sprawdzić jej wartość zwracaną przed wprowadzeniem jakichkolwiek zmian w magazynie danych. Po wywołaniu metody System.Management.Automation.Provider.CmdletProvider.ShouldProcess zwraca wartość true, metoda System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* powinna wywołać metodę System.Management.Automation.Provider.CmdletProvider.ShouldContinue jako dodatkowe sprawdzenie potencjalnie niebezpiecznych modyfikacji systemu.
Dołączanie parametrów dynamicznych do polecenia cmdlet New-Item
Czasami polecenie cmdlet New-Item
wymaga dodatkowych parametrów, które są określane dynamicznie w czasie wykonywania. Aby zapewnić te parametry dynamiczne, dostawca kontenera musi zaimplementować metodę System.Management.Automation.Provider.ContainerCmdletProvider.NewItemDynamicParameters*. Ta metoda pobiera parametry elementu w wskazanej ścieżce i zwraca obiekt, który ma właściwości i pola z atrybutami analizowania podobnymi do klasy poleceń cmdlet lub System.Management.Automation.RuntimeDefinedParameterDictionary obiektu. Środowisko uruchomieniowe programu Windows PowerShell używa zwróconego obiektu w celu dodania parametrów do polecenia cmdlet New-Item
.
Ten dostawca nie implementuje tej metody. Jednak poniższy kod jest domyślną implementacją tej metody.
Usuwanie elementów
Aby usunąć elementy, dostawca programu Windows PowerShell musi zastąpić metodę System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem*, aby obsługiwać wywołania z polecenia cmdlet Remove-Item
. Ta metoda usuwa element z magazynu danych w określonej ścieżce. Jeśli parametr recurse
polecenia cmdlet Remove-Item
jest ustawiony na true
, metoda usuwa wszystkie elementy podrzędne niezależnie od ich poziomu. Jeśli parametr jest ustawiony na false
, metoda usuwa tylko jeden element w określonej ścieżce.
Ten dostawca nie obsługuje usuwania elementów. Poniższy kod jest jednak domyślną implementacją System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem*.
Co należy pamiętać o implementowaniu elementu RemoveItem
Następujące warunki mogą mieć zastosowanie do implementacji System.Management.Automation.Provider.ContainerCmdletProvider.NewItem*:
Podczas definiowania klasy dostawcy dostawca kontenera programu Windows PowerShell może zadeklarować możliwości dostawcy rozszerzeńWildcards, Filter, Include lub Exclude z System.Management.Automation.ProviderCapabilities wyliczenia. 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. 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* i System.Management.Automation.Provider.CmdletProvider.Include*.
Domyślnie przesłonięcia tej metody nie powinny usuwać obiektów, chyba że właściwość System.Management.Automation.Provider.CmdletProvider.Force* ma ustawioną wartość true. Jeśli określona ścieżka wskazuje kontener, właściwość System.Management.Automation.Provider.CmdletProvider.Force* nie jest wymagana.
Implementacja System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem* jest odpowiedzialna za zapobieganie nieskończonej rekursji, gdy istnieją linki cykliczne i podobne. Należy zgłosić odpowiedni wyjątek zakończenia, aby odzwierciedlić taki warunek.
Implementacja metody System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem* powinna wywołać metodę System.Management.Automation.Provider.CmdletProvider.ShouldProcess i sprawdzić jej wartość zwracaną przed wprowadzeniem jakichkolwiek zmian w magazynie danych. Po wywołaniu metody System.Management.Automation.Provider.CmdletProvider.ShouldProcess zwraca
true
, metoda System.Management.Automation.Automation.Provider.ContainerCmdletProvider.RemoveItem* powinna wywołać metodę System.Management.Automation.Provider.CmdletProvider.ShouldContinue jako dodatkowe sprawdzenie potencjalnie niebezpiecznych modyfikacji systemu.
Dołączanie parametrów dynamicznych do polecenia cmdlet Remove-Item
Czasami polecenie cmdlet Remove-Item
wymaga dodatkowych parametrów, które są określane dynamicznie w czasie wykonywania. Aby zapewnić te parametry dynamiczne, dostawca kontenera musi zaimplementować metodę System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItemDynamicParameters*. 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 poleceń cmdlet lub System.Management.Automation.RuntimeDefinedParameterDictionary. Środowisko uruchomieniowe programu Windows PowerShell używa zwróconego obiektu w celu dodania parametrów do polecenia cmdlet Remove-Item
.
Ten dostawca kontenerów nie implementuje tej metody. Poniższy kod jest jednak domyślną implementacją System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItemDynamicParameters*.
Wykonywanie zapytań dotyczących elementów podrzędnych
Aby sprawdzić, czy elementy podrzędne istnieją w określonej ścieżce, dostawca kontenera programu Windows PowerShell musi zastąpić metodę System.Management.Automation.Provider.ContainerCmdletProvider.HasChildItems*. Ta metoda zwraca true
, jeśli element ma elementy podrzędne i false
w przeciwnym razie. W przypadku ścieżki o wartości null lub pustej metoda uwzględnia wszystkie elementy w magazynie danych jako elementy podrzędne i zwraca true
.
Oto zastąpienie metody System.Management.Automation.Provider.ContainerCmdletProvider.HasChildItems*. Jeśli istnieje więcej niż dwie części ścieżki utworzone przez metodę pomocnika ChunkPath, metoda zwraca false
, ponieważ zdefiniowano tylko kontener bazy danych i kontener tabeli. Aby uzyskać więcej informacji na temat tej metody pomocniczej, zobacz temat Metoda ChunkPath została omówiona w Tworzenie dostawcy elementów programu Windows PowerShell.
protected override bool HasChildItems( string path )
{
return false;
} // HasChildItems
ErrorCategory.InvalidOperation, tableName));
}
return results;
Ważne jest, aby pamiętać o implementowaniu funkcji HasChildItems
Następujące warunki mogą mieć zastosowanie do implementacji System.Management.Automation.Provider.ContainerCmdletProvider.HasChildItems*:
- Jeśli dostawca kontenera uwidacznia katalog główny zawierający interesujące punkty instalacji, implementacja System.Management.Automation.Provider.ContainerCmdletProvider.HasChildItems* metoda powinna zwrócić
true
, gdy dla ścieżki zostanie przekazany pusty lub pusty ciąg.
Kopiowanie elementów
Aby skopiować elementy, dostawca kontenera musi zaimplementować metodę System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem w celu obsługi wywołań z polecenia cmdlet Copy-Item
. Ta metoda kopiuje element danych z lokalizacji wskazanej przez parametr path
polecenia cmdlet do lokalizacji wskazanej przez parametr copyPath
. Jeśli określono parametr recurse
, metoda kopiuje wszystkie kontenery podrzędne. Jeśli parametr nie zostanie określony, metoda kopiuje tylko jeden poziom elementów.
Ten dostawca nie implementuje tej metody. Poniższy kod jest jednak domyślną implementacją System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem.
Co należy pamiętać o implementowaniu elementu CopyItem
Następujące warunki mogą mieć zastosowanie do implementacji System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem:
Podczas definiowania klasy dostawcy dostawca kontenera programu Windows PowerShell może zadeklarować możliwości dostawcy rozszerzeńWildcards, Filter, Include lub Exclude z System.Management.Automation.ProviderCapabilities wyliczenia. 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. 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* i System.Management.Automation.Provider.CmdletProvider.Include*.
Domyślnie przesłonięcia tej metody nie powinny kopiować obiektów do istniejących obiektów, 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:\abc.txt, chyba że właściwość System.Management.Automation.Provider.CmdletProvider.Force* jest ustawiona natrue
. Jeśli ścieżka określona w parametrzecopyPath
istnieje i wskazuje kontener, właściwość System.Management.Automation.Provider.CmdletProvider.Force* nie jest wymagana. W tym przypadku System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem powinien skopiować element wskazany przez parametrpath
do kontenera wskazanego przez parametrcopyPath
jako element podrzędny.Implementacja System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem jest odpowiedzialna za zapobieganie nieskończonej rekursji, gdy istnieją linki cykliczne i podobne. Należy zgłosić odpowiedni wyjątek zakończenia, aby odzwierciedlić taki warunek.
Implementacja metody System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem powinna wywołać metodę System.Management.Automation.Provider.CmdletProvider.ShouldProcess i sprawdzić jego wartość zwracaną przed wprowadzeniem jakichkolwiek zmian w magazynie danych. Po wywołaniu metody System.Management.Automation.Provider.CmdletProvider.ShouldProcess zwraca wartość true, metoda System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem powinna wywołać metodę System.Management.Automation.Provider.CmdletProvider.ShouldContinue jako dodatkową kontrolę pod kątem potencjalnie niebezpiecznych modyfikacji systemu. Aby uzyskać więcej informacji na temat wywoływania tych metod, zobacz Zmień nazwy elementów.
Dołączanie parametrów dynamicznych do polecenia cmdlet Copy-Item
Czasami polecenie cmdlet Copy-Item
wymaga dodatkowych parametrów, które są określane dynamicznie w czasie wykonywania. Aby zapewnić te parametry dynamiczne, dostawca kontenera programu Windows PowerShell musi zaimplementować metodę System.Management.Automation.Provider.ContainerCmdletProvider.CopyItemDynamicParameters*. Ta metoda pobiera parametry elementu w wskazanej ścieżce i zwraca obiekt, który ma właściwości i pola z atrybutami analizowania podobnymi do klasy poleceń cmdlet lub System.Management.Automation.RuntimeDefinedParameterDictionary obiektu. Środowisko uruchomieniowe programu Windows PowerShell używa zwróconego obiektu w celu dodania parametrów do polecenia cmdlet Copy-Item
.
Ten dostawca nie implementuje tej metody. Jednak poniższy kod jest domyślną implementacją System.Management.Automation.Provider.ContainerCmdletProvider.CopyItemDynamicParameters*.
Przykładowy kod
Aby uzyskać pełny przykładowy kod, zobacz AccessDbProviderSample04 Code Sample.
Kompilowanie dostawcy programu Windows PowerShell
Zobacz Jak rejestrować polecenia cmdlet, dostawcy i aplikacje hosta.
Testowanie dostawcy programu Windows PowerShell
Jeśli dostawca programu Windows PowerShell został zarejestrowany w programie Windows PowerShell, możesz go przetestować, uruchamiając obsługiwane polecenia cmdlet w wierszu polecenia. Należy pamiętać, że następujące przykładowe dane wyjściowe używają fikcyjnej bazy danych programu Access.
Uruchom polecenie cmdlet
Get-ChildItem
, aby pobrać listę elementów podrzędnych z tabeli Customers w bazie danych programu Access.Get-ChildItem mydb:customers
Zostanie wyświetlone następujące dane wyjściowe.
PSPath : AccessDB::customers PSDrive : mydb PSProvider : System.Management.Automation.ProviderInfo PSIsContainer : True Data : System.Data.DataRow Name : Customers RowCount : 91 Columns :
Uruchom ponownie polecenie cmdlet
Get-ChildItem
, aby pobrać dane tabeli.(Get-ChildItem mydb:customers).Data
Zostanie wyświetlone następujące dane wyjściowe.
TABLE_CAT : C:\PS\northwind TABLE_SCHEM : TABLE_NAME : Customers TABLE_TYPE : TABLE REMARKS :
Teraz użyj polecenia cmdlet
Get-Item
, aby pobrać elementy w wierszu 0 w tabeli danych.Get-Item mydb:\customers\0
Zostanie wyświetlone następujące dane wyjściowe.
PSPath : AccessDB::customers\0 PSDrive : mydb PSProvider : System.Management.Automation.ProviderInfo PSIsContainer : False Data : System.Data.DataRow RowNumber : 0
Użyj ponownie
Get-Item
, aby pobrać dane dla elementów w wierszu 0.(Get-Item mydb:\customers\0).Data
Zostanie wyświetlone następujące dane wyjściowe.
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-0101
Teraz użyj polecenia cmdlet
New-Item
, aby dodać wiersz do istniejącej tabeli. ParametrPath
określa pełną ścieżkę do wiersza i musi wskazywać liczbę wierszy większą niż istniejąca liczba wierszy w tabeli. ParametrType
wskazuje,Row
określić typ elementu do dodania. Na koniec parametrValue
określa rozdzielaną przecinkami listę wartości kolumn 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).Data
Zostanie wyświetlone następujące dane wyjściowe.
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 programu Windows PowerShell
projektowanie dostawcy programu Windows PowerShell
implementowanie dostawcy programu Windows PowerShell elementu
implementowanie dostawcy programu Windows PowerShell nawigacji
Jak rejestrować polecenia cmdlet, dostawcy i aplikacje hosta
zestaw SDK programu Windows PowerShell