Tworzenie dostawcy kontenerów programu Windows PowerShell
W tym temacie opisano sposób tworzenia dostawcy Windows PowerShell, który może działać 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. Zezwalając użytkownikowi na pracę w tych węzłach podrzędnych, użytkownik może wchodzić w interakcje hierarchiczne za pośrednictwem magazynu danych.
Dostawcy, którzy mogą pracować z magazynami danych na wielu poziomie, są nazywani Windows PowerShell kontenerów. Należy jednak pamiętać, że dostawca Windows PowerShell kontenerów może być używany tylko wtedy, gdy istnieje jeden kontener (bez kontenerów zagnieżdżonych) z elementami w nim. Jeśli istnieją zagnieżdżone kontenery, należy zaimplementować Windows PowerShell nawigacji. Aby uzyskać więcej informacji na temat implementowania Windows PowerShell nawigacji, zobacz Creating a Windows PowerShell Navigation Provider.
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 składników środowiska uruchomieniowego Windows Vista i .NET Framework 3.0. Aby uzyskać instrukcje dotyczące pobierania, zobacz How to Install Windows PowerShell and Download the Windows PowerShell SDK (Jak zainstalować zestaw SDK Windows PowerShell). Pobrane pliki źródłowe są dostępne w <PowerShell Samples> katalogu . Aby uzyskać więcej informacji na temat Windows PowerShell implementacji innych dostawców, zobacz Projektowanie dostawcy Windows PowerShell sieci.
Dostawca Windows PowerShell kontenerów zdefiniowany w tym miejscu definiuje bazę danych jako jej pojedynczy kontener z tabelami i wierszami bazy danych zdefiniowanymi jako elementy kontenera.
Przestroga
Należy pamiętać, że w tym projekcie przyjęto założenie, że baza danych zawiera pole o identyfikatorze nazwy, a typ pola to LongInteger.
Definiowanie klasy Windows PowerShell kontenera
Dostawca Windows PowerShell kontenerów musi zdefiniować klasę .NET pochodzącą z klasy bazowej System.Management.Automation.Provider.Containercmdletprovider. Poniżej znajduje się definicja klasy dla dostawcy Windows PowerShell kontenerów 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óra jest używana przez Windows PowerShell. Drugi parametr określa Windows PowerShell możliwości, które dostawca uwidacznia w środowisku uruchomieniowym Windows PowerShell podczas przetwarzania poleceń. W przypadku tego dostawcy nie ma żadnych Windows PowerShell, które zostały dodane.
Definiowanie podstawowych funkcji
Zgodnie z opisem w te Windows PowerShell Dostawcyzasobów klasa System.Management.Automation.Provider.Containercmdletprovider pochodzi z kilku innych klas, które zapewniały różne funkcje dostawcy. Dostawca Windows PowerShell kontenerów musi zatem definiować wszystkie funkcje udostępniane przez te klasy.
Aby zaimplementować funkcje dodawania informacji inicjowania specyficznych dla sesji i wydawania zasobów używanych przez dostawcę,zobacz Tworzenie podstawowego Windows PowerShell dostawcy . Jednak większość dostawców (w tym dostawca opisany tutaj) może używać domyślnej implementacji tej funkcji udostępnianej przez Windows PowerShell.
Aby uzyskać dostęp do magazynu danych, dostawca musi zaimplementować metody klasy bazowej System.Management.Automation.Provider.Drivecmdletprovider. Aby uzyskać więcej informacji na temat implementowania tych metod, zobacz Creating an Windows PowerShell Drive Provider.
Aby manipulować elementami magazynu danych, takimi jak pobieranie, ustawianie i czyszczenie elementów, dostawca musi zaimplementować metody dostarczane przez klasę bazową System.Management.Automation.Provider.Itemcmdletprovider. Aby uzyskać więcej informacji na temat implementowania tych metod, zobacz Creating an Windows PowerShell Item Provider (Tworzenie dostawcy Windows PowerShell elementów).
Pobieranie elementów podrzędnych
Aby pobrać element podrzędny, dostawca kontenera usługi Windows PowerShell musi zastąpić metodę System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* w celu obsługi wywołań z Get-ChildItem
polecenia cmdlet . Ta metoda pobiera elementy podrzędne z magazynu danych i zapisuje je w potoku jako obiekty. Jeśli parametr polecenia cmdlet jest określony, metoda pobiera wszystkie dzieci niezależnie od recurse
poziomu, na jakim się znajdują. Jeśli parametr recurse
nie zostanie określony, metoda pobiera tylko jeden poziom dzieci.
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 implementowanie getChildItems
Następujące warunki mogą dotyczyć implementacji systemu System.Management.Automation.Provider.Containercmdletprovider.Getchilditems*:
Podczas definiowania klasy dostawcy dostawca kontenera usługi Windows PowerShell może zadeklarować możliwości dostawcy expandWildcards, Filter, Include lub Exclude z wyliczenia 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. 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óra 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 FileSystem (dostarczanego przez usługę Windows PowerShell), ale nie ma dostępu do odczytu, plik nadal istnieje, a funkcja System.Management.Automation.Provider.Itemcmdletprovider.Itemexists* zwraca wartość
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ę tak, aby zapisywał elementy przy użyciu metody System.Management.Automation.Provider.Cmdletprovider.Writeitemobject* po jednym na raz. Użycie tej techniki spowoduje przedstawienie elementów użytkownikowi w strumieniu.
Implementacja system.Management.Automation.Provider.Containercmdletprovider.Getchilditems* jest odpowiedzialna za zapobieganie nieskończonemu rekursji, gdy istnieją linki cykliczne i podobne. Aby odzwierciedlić taki warunek, należy zwrócić odpowiedni wyjątek zakończenia.
Dołączanie parametrów dynamicznych do Get-ChildItem cmdlet
Czasami Get-ChildItem
polecenie cmdlet, które wywołuje element System.Management.Automation.Provider.Containercmdletprovider.Getchilditems*, wymaga dodatkowych parametrów, które są określane dynamicznie w czasie wykonywania. Aby zapewnić te parametry dynamiczne, Windows PowerShell kontenera musi zaimplementować metodę System.Management.Automation.Provider.Containercmdletprovider.Getchilditemsdynamicparameters*. Ta metoda pobiera parametry dynamiczne dla elementu we wskazanej ścieżce i zwraca obiekt, który ma właściwości i pola z atrybutami analizowania podobnymi do klasy polecenia cmdlet lub obiektu System.Management.Automation.Runtimedefinedparameterdictionary. Środowisko Windows PowerShell używa zwróconego obiektu w celu dodania parametrów do Get-ChildItem
polecenia cmdlet .
Ten Windows PowerShell kontenera 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 usługi Windows PowerShell musi zastąpić metodę System.Management.Automation.Provider.Containercmdletprovider.Getchildnames* w celu obsługi wywołań z polecenia cmdlet, gdy określono jego Get-ChildItem
Name
parametr. 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
Co należy pamiętać o implementowania getChildNames
Następujące warunki mogą dotyczyć implementacji systemu System.Management.Automation.Provider.Containercmdletprovider.Getchilditems*:
Podczas definiowania klasy dostawcy dostawca kontenera usługi Windows PowerShell może zadeklarować możliwości dostawcy expandWildcards, Filter, Include lub Exclude z wyliczenia 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. 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 ona dopasowana do wartości 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 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ńczonemu rekursji, gdy istnieją linki cykliczne itp. Aby odzwierciedlić taki warunek, należy zwrócić odpowiedni wyjątek zakończenia.
Dołączanie parametrów dynamicznych do Get-ChildItem cmdlet (Name)
Czasami polecenie Get-ChildItem
cmdlet (z parametrem ) wymaga dodatkowych parametrów, które są określane Name
dynamicznie w czasie wykonywania. Aby zapewnić te parametry dynamiczne, Windows PowerShell kontenera musi zaimplementować metodę System.Management.Automation.Provider.Containercmdletprovider.Getchildnamesdynamicparameters*. Ta metoda pobiera parametry dynamiczne elementu we wskazanej ścieżce i zwraca obiekt, który ma właściwości i pola z atrybutami analizowania podobnymi do klasy polecenia cmdlet lub obiektu System.Management.Automation.Runtimedefinedparameterdictionary. Środowisko Windows PowerShell używa zwróconego obiektu w celu dodania parametrów do Get-ChildItem
polecenia cmdlet .
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 Windows PowerShell musi zastąpić metodę System.Management.Automation.Provider.Containercmdletprovider.Renameitem* w celu obsługi wywołań z Rename-Item
polecenia cmdlet . Ta metoda zmienia nazwę elementu w określonej ścieżce na nową podaną nazwę. Nowa nazwa musi być zawsze względna względem elementu nadrzędnego (kontenera).
Ten dostawca nie zastępuje metody System.Management.Automation.Provider.Containercmdletprovider.Renameitem*. Poniżej przedstawiono jednak implementację domyślną.
Co należy zapamiętać na temat implementowania renameitem
Następujące warunki mogą dotyczyć implementacji pliku System.Management.Automation.Provider.Containercmdletprovider.Renameitem*:
Podczas definiowania klasy dostawcy dostawca kontenera usługi Windows PowerShell może zadeklarować możliwości dostawcy expandWildcards, Filter, Include lub Exclude z wyliczenia 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. 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 modyfikowania tylko nazwy elementu, a nie operacji przenoszenia. Implementacja metody powinna zapisać błąd, jeśli parametr zawiera separatory ścieżek lub w inny sposób może spowodować zmianę
newName
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ć jej wartość zwracaną przed wprowadzeniem jakichkolwiek zmian w magazynie danych. Ta metoda służy do potwierdzania wykonania operacji w przypadku zmiany stanu systemu, na przykład zmiany nazwy plików. System.Management.Automation.Provider.Cmdletprovider.ShouldProcess wysyła nazwę zasobu, który ma zostać zmieniony, do użytkownika, przy czym środowisko uruchomieniowe programu Windows PowerShell uwzględnia wszystkie ustawienia wiersza polecenia lub zmienne preferencji podczas określania tego, co powinno być wyświetlane.
Po wywołaniu metody System.Management.Automation.Provider.Cmdletprovider.ShouldProcess zwraca wartość , metoda
true
System.Management.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 zezwolić na dodatkową opinię na temat tego, czy operacja powinna być kontynuowana. Dostawca powinien wywołać element System.Management.Automation.Provider.Cmdletprovider.ShouldContinue jako dodatkowe sprawdzenie potencjalnie niebezpiecznych modyfikacji systemu.
Dołączanie parametrów dynamicznych do Rename-Item cmdlet
Czasami polecenie Rename-Item
cmdlet wymaga dodatkowych parametrów, które są określane dynamicznie w czasie wykonywania. Aby podać te parametry dynamiczne, Windows PowerShell kontener kontenerów musi zaimplementować metodę System.Management.Automation.Provider.Containercmdletprovider.Renameitemdynamicparameters*. Ta metoda pobiera parametry elementu we wskazanej ścieżce i zwraca obiekt, który ma właściwości i pola z atrybutami analizowania podobnymi do klasy polecenia cmdlet lub obiektu System.Management.Automation.Runtimedefinedparameterdictionary. Środowisko Windows PowerShell używa zwróconego obiektu w celu dodania parametrów do Rename-Item
polecenia cmdlet .
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 New-Item
polecenia cmdlet . 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 FileSystem używa parametru o type
wartości "file" lub "directory". Parametr polecenia cmdlet określa wartość specyficzną dla dostawcy newItemValue
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];
Co należy zapamiętać na temat implementowania newItem
Następujące warunki mogą dotyczyć implementacji rozwiązania System.Management.Automation.Provider.Containercmdletprovider.Newitem*:
Metoda System.Management.Automation.Provider.Containercmdletprovider.Newitem* powinna wykonać porównanie ciągu przekazanego w parametrze bez uwzględniania
type
liter. Powinno to również zezwalać na najmniej niejednoznaczne dopasowania. Na przykład w przypadku typów "file" i "directory" do uujednoznania jest wymagana tylko pierwsza litera. Jeśli parametr wskazuje typ, który dostawca nie może utworzyć, metodatype
System.Management.Automation.Provider.Containercmdletprovider.Newitem* powinna napisać element ArgumentException z komunikatem wskazującym typy, które dostawca może utworzyć.W przypadku parametru zaleca się, aby implementacja metody
newItemValue
System.Management.Automation.Provider.Containercmdletprovider.Newitem* akceptowała ciągi co najmniej. Powinna również akceptować typ obiektu, który jest pobierany przez metodę System.Management.Automation.Provider.Itemcmdletprovider.Getitem* 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 New-Item cmdlet
Czasami polecenie New-Item
cmdlet wymaga dodatkowych parametrów, które są określane dynamicznie w czasie wykonywania. Aby podać te parametry dynamiczne, dostawca kontenera musi zaimplementować metodę System.Management.Automation.Provider.Containercmdletprovider.Newitemdynamicparameters*. Ta metoda pobiera parametry elementu we wskazanej ścieżce i zwraca obiekt, który ma właściwości i pola z atrybutami analizowania podobnymi do klasy polecenia cmdlet lub obiektu System.Management.Automation.Runtimedefinedparameterdictionary. Środowisko Windows PowerShell używa zwróconego obiektu w celu dodania parametrów do New-Item
polecenia cmdlet .
Ten dostawca nie implementuje tej metody. Jednak poniższy kod jest domyślną implementacją tej metody.
Usuwanie elementów
Aby usunąć elementy, Windows PowerShell musi zastąpić metodę System.Management.Automation.Provider.Containercmdletprovider.Removeitem* w celu obsługi wywołań z Remove-Item
polecenia cmdlet. Ta metoda usuwa element z magazynu danych w określonej ścieżce. Jeśli parametr polecenia cmdlet jest ustawiony na , metoda usuwa wszystkie elementy podrzędne niezależnie recurse
Remove-Item
od ich true
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. Jednak poniższy kod jest domyślną implementacją rozwiązania System.Management.Automation.Provider.Containercmdletprovider.Removeitem*.
Co należy zapamiętać na temat implementowania RemoveItem
Następujące warunki mogą dotyczyć implementacji rozwiązania System.Management.Automation.Provider.Containercmdletprovider.Newitem*:
Podczas definiowania klasy dostawcy dostawca kontenera usługi Windows PowerShell może zadeklarować możliwości dostawcy ExpandWildcards, Filter, Include lub Exclude z wyliczenia 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. 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 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. Aby odzwierciedlić taki warunek, należy zwrócić odpowiedni wyjątek zakończenia.
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 metoda
true
System.Management.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 Remove-Item cmdlet
Czasami polecenie Remove-Item
cmdlet wymaga dodatkowych parametrów, które są określane dynamicznie w czasie wykonywania. Aby podać te parametry dynamiczne, dostawca kontenera musi zaimplementować metodę System.Management.Automation.Provider.Containercmdletprovider.Removeitemdynamicparameters*, aby obsłużyć te parametry. Ta metoda pobiera parametry dynamiczne elementu we wskazanej ścieżce i zwraca obiekt, który ma właściwości i pola z atrybutami analizowania podobnymi do klasy polecenia cmdlet lub obiektu System.Management.Automation.Runtimedefinedparameterdictionary. Środowisko Windows PowerShell używa zwróconego obiektu w celu dodania parametrów do Remove-Item
polecenia cmdlet .
Ten dostawca kontenerów nie implementuje tej metody. Jednak poniższy kod jest domyślną implementacją system.Management.Automation.Provider.Containercmdletprovider.Removeitemdynamicparameters*.
Wykonywanie zapytań o elementy podrzędne
Aby sprawdzić, czy elementy podrzędne istnieją w określonej ścieżce, dostawca kontenera usługi Windows PowerShell musi zastąpić metodę System.Management.Automation.Provider.Containercmdletprovider.Haschilditems*. Ta metoda zwraca true
wartość , jeśli element ma dzieci, i w przeciwnym false
razie. W przypadku ścieżki o wartości null lub pustej metoda uznaje wszystkie elementy w magazynie danych za elementy children i zwraca wartość true
.
Oto przesłonięcie metody System.Management.Automation.Provider.Containercmdletprovider.Haschilditems*. Jeśli istnieją więcej niż dwie części ścieżki utworzone przez metodę pomocnika ChunkPath, metoda zwraca wartość , ponieważ definiowany jest tylko kontener bazy danych i false
kontener tabeli. Aby uzyskać więcej informacji na temat tej metody pomocnika, zobacz ChunkPath method is discussed in Creating a Windows PowerShell Item Provider (Tworzenie dostawcy Windows PowerShell item).
protected override bool HasChildItems( string path )
{
return false;
} // HasChildItems
ErrorCategory.InvalidOperation, tableName));
}
return results;
Co należy zapamiętać na temat implementowania hasChildItems
Następujące warunki mogą dotyczyć implementacji rozwiązania System.Management.Automation.Provider.Containercmdletprovider.Haschilditems*:
- Jeśli dostawca kontenera uwidacznia katalog główny zawierający interesujące punkty instalacji, implementacja metody System.Management.Automation.Provider.Containercmdletprovider.Haschilditems* powinna zostać zwrócona, gdy dla ścieżki zostanie przekazany pusty ciąg lub wartość
true
null.
Kopiowanie elementów
Aby skopiować elementy, dostawca kontenera musi zaimplementować metodę System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem w celu obsługi wywołań z Copy-Item
polecenia cmdlet . Ta metoda kopiuje element danych z lokalizacji wskazanej przez parametr polecenia cmdlet do lokalizacji path
wskazanej przez copyPath
parametr . Jeśli parametr recurse
jest określony, 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. Jednak poniższy kod jest domyślną implementacją system.Management.Automation.Provider.ContainerCmdletProvider.CopyItem.
Co należy zapamiętać na temat implementowania copyItem
Następujące warunki mogą dotyczyć implementacji pliku System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem:
Podczas definiowania klasy dostawcy dostawca kontenera usługi Windows PowerShell może zadeklarować możliwości dostawcy ExpandWildcards, Filter, Include lub Exclude z wyliczenia 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. 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
true
wartość . Na przykład dostawca FileSystem nie skopiuje pliku c:\temp\abc.txt istniejącego pliku c:\abc.txt, chyba że właściwość System.Management.Automation.Provider.Cmdletprovider.Force* jest ustawiona natrue
wartość . Jeśli ścieżka określona w parametrze istnieje i wskazuje kontener, właściwośćcopyPath
System.Management.Automation.Provider.Cmdletprovider.Force* nie jest wymagana. W takim przypadku system.Management.Automation.Provider.ContainerCmdletProvider.CopyItem powinien skopiować element wskazany przez parametr do kontenera wskazanego przez parametr jakopath
elementcopyPath
podrzędny.Implementacja system.Management.Automation.Provider.ContainerCmdletProvider.CopyItem jest odpowiedzialna za zapobieganie nieskończonej rekursji, gdy istnieją linki cykliczne i podobne. Aby odzwierciedlić taki warunek, należy zwrócić odpowiedni wyjątek zakończenia.
Implementacja metody System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem 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.CopyItem powinna wywołać metodę System.Management.Automation.Provider.Cmdletprovider.ShouldContinue jako dodatkowe sprawdzenie potencjalnie niebezpiecznych modyfikacji systemu. Aby uzyskać więcej informacji na temat wywoływania tych metod, zobacz Zmienianie nazwy elementów.
Dołączanie parametrów dynamicznych do Copy-Item cmdlet
Czasami polecenie Copy-Item
cmdlet wymaga dodatkowych parametrów, które są określane dynamicznie w czasie wykonywania. Aby zapewnić te parametry dynamiczne, dostawca kontenera usługi Windows PowerShell musi zaimplementować metodę System.Management.Automation.Provider.Containercmdletprovider.Copyitemdynamicparameters*, aby obsłużyć te parametry. Ta metoda pobiera parametry elementu we wskazanej ścieżce i zwraca obiekt, który ma właściwości i pola z atrybutami analizowania podobnymi do klasy polecenia cmdlet lub obiektu System.Management.Automation.Runtimedefinedparameterdictionary. Środowisko Windows PowerShell używa zwróconego obiektu w celu dodania parametrów do Copy-Item
polecenia cmdlet .
Ten dostawca nie implementuje tej metody. Jednak poniższy kod jest domyślną implementacją system.Management.Automation.Provider.Containercmdletprovider.Copyitemdynamicparameters*.
Przykład kodu
Aby uzyskać kompletny przykładowy kod, zobacz AccessDbProviderSample04 Code Sample (Przykładowy kod AccessDbProviderSample04).
Tworzenie dostawcy Windows PowerShell aplikacji
Testowanie dostawcy Windows PowerShell danych
Gdy dostawca Windows PowerShell został zarejestrowany w 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 wykorzystują fikcyjną bazę danych programu Access.
Uruchom polecenie
Get-ChildItem
cmdlet , aby pobrać listę elementów podrzędnych z tabeli Customers w bazie danych programu Access.Get-ChildItem mydb:customers
Wyświetlone są 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
Get-ChildItem
polecenie cmdlet , aby pobrać dane tabeli.(Get-ChildItem mydb:customers).data
Wyświetlone są następujące dane wyjściowe.
TABLE_CAT : c:\PS\northwind TABLE_SCHEM : TABLE_NAME : Customers TABLE_TYPE : TABLE REMARKS :
Teraz użyj polecenia
Get-Item
cmdlet , aby pobrać elementy w wierszu 0 w tabeli danych.Get-Item mydb:\customers\0
Wyświetlone są 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
Get-Item
ponownie, aby pobrać dane dla elementów w wierszu 0.(Get-Item mydb:\customers\0).data
Wyświetlone są 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
New-Item
polecenia cmdlet , aby dodać wiersz do istniejącej tabeli. Parametr określa pełną ścieżkę do wiersza i musi wskazywać numer wiersza, który jest większy niż istniejąca liczbaPath
wierszy w tabeli. ParametrType
wskazuje "wiersz", aby określić typ elementu do dodania. Na koniec parametr określa rozdzielaną przecinkamiValue
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
Wyświetlone są 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 Windows PowerShell dostawców
Projektowanie dostawcy programu Windows PowerShell
Implementowanie dostawcy Windows PowerShell elementu
Implementowanie dostawcy Windows PowerShell nawigacji
Jak rejestrować polecenia cmdlet, dostawców i aplikacje hosta
Opinia
Prześlij i wyświetl opinię dla