Erstellen eines Windows PowerShell-Containeranbieters
In diesem Thema wird beschrieben, wie Sie einen Windows PowerShell erstellen, der mit mehrschichtigen Datenspeichern arbeiten kann. Bei diesem Datenspeichertyp enthält die oberste Ebene des Speichers die Stammelemente, und jede nachfolgende Ebene wird als Knoten untergeordneter Elemente bezeichnet. Indem der Benutzer auf diesen untergeordneten Knoten arbeiten kann, kann ein Benutzer hierarchisch über den Datenspeicher interagieren.
Anbieter, die in Datenspeichern mit mehreren Ebene arbeiten können, werden als Windows PowerShell bezeichnet. Beachten Sie jedoch, dass Windows PowerShell Containeranbieter nur verwendet werden kann, wenn ein Container (keine geschachtelten Container) mit Elementen enthalten ist. Wenn geschachtelte Container installiert sind, müssen Sie einen Windows PowerShell implementieren. Weitere Informationen zum Implementieren eines Windows PowerShell-Navigationsanbieters finden Sie unter Erstellen eines Windows PowerShell-Navigationsanbieters.
Hinweis
Sie können die C#-Quelldatei (AccessDBSampleProvider04.cs) für diesen Anbieter mit dem Microsoft Windows Software Development Kit für Windows Vista und .NET Framework 3.0 Runtime Components herunterladen. Anweisungen zum Herunterladen finden Sie unter How to Install Windows PowerShell and Download the Windows PowerShell SDK. Die heruntergeladenen Quelldateien sind im Verzeichnis <PowerShell Samples> verfügbar. Weitere Informationen zu anderen Implementierungen Windows PowerShell Anbieters finden Sie unter Designing Your Windows PowerShell Provider.
Der Windows PowerShell, der hier beschrieben wird, definiert die Datenbank als ihren einzelnen Container, und die Tabellen und Zeilen der Datenbank werden als Elemente des Containers definiert.
Achtung
Beachten Sie, dass bei diesem Entwurf von einer Datenbank ausgegangen wird, die über ein Feld mit der Namens-ID verfügt und der Typ des Felds LongInteger ist.
Definieren einer Windows PowerShell-Containeranbieterklasse
Ein Windows PowerShell-Containeranbieter muss eine .NET-Klasse definieren, die von der System.Management.Automation.Provider.Containercmdletprovider-Basisklasse abgeleitet wird. Hier ist die Klassendefinition für den Windows PowerShell, der in diesem Abschnitt beschrieben wird.
[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : ContainerCmdletProvider
Beachten Sie, dass das Attribut System.Management.Automation.Provider.Cmdletproviderattribute in dieser Klassendefinition zwei Parameter enthält. Der erste Parameter gibt einen benutzerfreundlichen Namen für den Anbieter an, der von der Windows PowerShell. Der zweite Parameter gibt die Windows PowerShell Funktionen an, die der Anbieter während der Befehlsverarbeitung Windows PowerShell Laufzeit verfügbar macht. Für diesen Anbieter gibt es keine Windows PowerShell funktionen, die hinzugefügt werden.
Definieren der Basisfunktionalität
Wie unter Entwerfendes Windows PowerShell-Anbieters beschrieben, wird die Klasse System.Management.Automation.Provider.Containercmdletprovider von mehreren anderen Klassen abgeleitet, die unterschiedliche Anbieterfunktionen bereitgestellt haben. Ein Windows PowerShell-Containeranbieter muss daher alle Funktionen definieren, die von diesen Klassen bereitgestellt werden.
Informationen zum Implementieren von Funktionen zum Hinzufügen sitzungsspezifischer Initialisierungsinformationen und zum Freigeben von Ressourcen, die vom Anbieter verwendet werden, finden Sie unter Creating a Basic Windows PowerShell Provider. Die meisten Anbieter (einschließlich des hier beschriebenen Anbieters) können jedoch die Standardimplementierung dieser Funktionalität verwenden, die von Windows PowerShell.
Um Zugriff auf den Datenspeicher zu erhalten, muss der Anbieter die Methoden der System.Management.Automation.Provider.Drivecmdletprovider-Basisklasse implementieren. Weitere Informationen zum Implementieren dieser Methoden finden Sie unter Creating an Windows PowerShell Drive Provider.
Um die Elemente eines Datenspeichers zu bearbeiten, z. B. Abrufen, Festlegen und Löschen von Elementen, muss der Anbieter die Methoden implementieren, die von der System.Management.Automation.Provider.Itemcmdletprovider-Basisklasse bereitgestellt werden. Weitere Informationen zum Implementieren dieser Methoden finden Sie unter Creating an Windows PowerShell Item Provider.
Abrufen von untergeordneten Elementen
Um ein untergeordnetes Element abzurufen, muss der Windows PowerShell-Containeranbieter die System.Management.Automation.Provider.Containercmdletprovider.Getchilditems*-Methode überschreiben, um Aufrufe vom Cmdlet zu Get-ChildItem
unterstützen. Diese Methode ruft untergeordnete Elemente aus dem Datenspeicher ab und schreibt sie als Objekte in die Pipeline. Wenn der -Parameter des Cmdlets angegeben wird, ruft die -Methode alle -Children ab, unabhängig recurse
davon, auf welcher Ebene sie sich befinden. Wenn der recurse
-Parameter nicht angegeben wird, ruft die -Methode nur eine einzelne Ebene von unteren Ns ab.
Hier ist die Implementierung der System.Management.Automation.Provider.Containercmdletprovider.Getchilditems*-Methode für diesen Anbieter. Beachten Sie, dass diese Methode die untergeordneten Elemente in allen Datenbanktabellen abruft, wenn der Pfad die Access-Datenbank angibt, und die untergeordneten Elemente aus den Zeilen dieser Tabelle abruft, wenn der Pfad eine Datentabelle angibt.
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
Zu beachtende Informationen zur Implementierung von GetChildItems
Die folgenden Bedingungen können für Ihre Implementierung von System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* gelten:
Beim Definieren der Anbieterklasse kann ein Windows PowerShell-Containeranbieter Anbieterfunktionen von ExpandWildcards, Filter, Include oder Exclude aus der System.Management.Automation.Provider.Providercapabilities-Enumeration deklarieren. In diesen Fällen muss die Implementierung der System.Management.Automation.Provider.Containercmdletprovider.Getchilditems*-Methode sicherstellen, dass der an die Methode übergebene Pfad die Anforderungen der angegebenen Funktionen erfüllt. Hierzu sollte die Methode auf die entsprechende Eigenschaft zugreifen, z.B. auf die Eigenschaften System.Management.Automation.Provider.Cmdletprovider.Exclude* und System.Management.Automation.Provider.Cmdletprovider.Include*.
Bei der Implementierung dieser Methode sollte jede Form des Zugriffs auf das Element berücksichtigt werden, die das Element für den Benutzer sichtbar machen kann. Wenn ein Benutzer beispielsweise über den FileSystem-Anbieter (bereitgestellt von Windows PowerShell) Schreibzugriff auf eine Datei hat, aber keinen Lesezugriff hat, ist die Datei weiterhin vorhanden, und System.Management.Automation.Provider.Itemcmdletprovider.Itemexists* gibt
true
zurück. Ihre Implementierung erfordert möglicherweise die Überprüfung eines übergeordneten Elements, um zu überprüfen, ob das untergeordnete Element aufzählt werden kann.Beim Schreiben mehrerer Elemente kann die Methode System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* einige Zeit dauern. Sie können Ihren Anbieter so entwerfen, dass die Elemente nach dem anderen mithilfe der System.Management.Automation.Provider.Cmdletprovider.Writeitemobject*-Methode geschrieben werden. Mit dieser Technik werden die Elemente dem Benutzer in einem Stream präsentiert.
Ihre Implementierung von System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* ist dafür verantwortlich, eine unendliche Rekursion zu verhindern, wenn zirkuläre Verknüpfungen und ähnliches vorliegt. Es sollte eine entsprechende Ausnahme ausgelöst werden, um eine solche Bedingung widerzuzustanden.
Anfügen dynamischer Parameter an das Get-ChildItem-Cmdlet
Manchmal erfordert das Cmdlet, das Get-ChildItem
System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* aufruft, zusätzliche Parameter, die zur Laufzeit dynamisch angegeben werden. Um diese dynamischen Parameter bereitstellen zu können, muss der Windows PowerShell-Containeranbieter die System.Management.Automation.Provider.Containercmdletprovider.Getchilditemsdynamicparameters*-Methode implementieren. Diese Methode ruft dynamische Parameter für das Element am angegebenen Pfad ab und gibt ein Objekt mit Eigenschaften und Feldern mit Analyseattributen zurück, die einer Cmdlet-Klasse oder einem System.Management.Automation.Runtimedefinedparameterdictionary-Objekt ähneln. Die Windows PowerShell Runtime verwendet das zurückgegebene -Objekt, um dem Cmdlet die Parameter Get-ChildItem
hinzuzufügen.
Dieser Windows PowerShell Containeranbieter implementiert diese Methode nicht. Der folgende Code ist jedoch die Standardimplementierung dieser Methode.
Abrufen untergeordneter Elementnamen
Um die Namen untergeordneter Elemente abzurufen, muss der Windows PowerShell-Containeranbieter die System.Management.Automation.Provider.Containercmdletprovider.Getchildnames*-Methode überschreiben, um Aufrufe des Cmdlets zu unterstützen, wenn der Parameter angegeben Get-ChildItem
Name
wird. Diese Methode ruft die Namen der untergeordneten Elemente für den angegebenen Pfad oder untergeordnete Elementnamen für alle Container ab, wenn der Parameter des returnAllContainers
Cmdlets angegeben ist. Ein untergeordneter Name ist der Blattteil eines Pfads. Beispielsweise ist der untergeordnete Name für den Pfad c:\windows\system32\abc.dll "abc.dll". Der untergeordnete Name für das Verzeichnis c:\windows\system32 ist "system32".
Hier ist die Implementierung der System.Management.Automation.Provider.Containercmdletprovider.Getchildnames*-Methode für diesen Anbieter. Beachten Sie, dass die -Methode Tabellennamen abruft, wenn der angegebene Pfad die Access-Datenbank (Laufwerk) und Zeilennummern angibt, wenn der Pfad eine Tabelle angibt.
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
Zu beachtende Informationen zur Implementierung von GetChildNames
Die folgenden Bedingungen können für Ihre Implementierung von System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* gelten:
Beim Definieren der Anbieterklasse kann ein Windows PowerShell-Containeranbieter Anbieterfunktionen von ExpandWildcards, Filter, Include oder Exclude aus der System.Management.Automation.Provider.Providercapabilities-Enumeration deklarieren. In diesen Fällen muss die Implementierung der System.Management.Automation.Provider.Containercmdletprovider.Getchilditems*-Methode sicherstellen, dass der an die Methode übergebene Pfad die Anforderungen der angegebenen Funktionen erfüllt. Hierzu sollte die Methode auf die entsprechende Eigenschaft zugreifen, z.B. auf die Eigenschaften System.Management.Automation.Provider.Cmdletprovider.Exclude* und System.Management.Automation.Provider.Cmdletprovider.Include*.
Hinweis
Eine Ausnahme von dieser Regel tritt auf, wenn
returnAllContainers
der Parameter des Cmdlets angegeben wird. In diesem Fall sollte die Methode einen beliebigen untergeordneten Namen für einen Container abrufen, auch wenn er nicht mit den Werten der Eigenschaften System.Management.Automation.Provider.Cmdletprovider.Filter*, System.Management.Automation.Provider.Cmdletprovider.Include*oder System.Management.Automation.Provider.Cmdletprovider.Exclude* übereinstimmen.Standardmäßig sollten Außerkraftsetzungen dieser Methode keine Namen von Objekten abrufen, die im Allgemeinen für den Benutzer ausgeblendet sind, es sei denn, die System.Management.Automation.Provider.Cmdletprovider.Force*-Eigenschaft ist angegeben. Wenn der angegebene Pfad einen Container angibt, ist die System.Management.Automation.Provider.Cmdletprovider.Force*-Eigenschaft nicht erforderlich.
Ihre Implementierung von System.Management.Automation.Provider.Containercmdletprovider.Getchildnames* ist dafür verantwortlich, eine unendliche Rekursion zu verhindern, wenn zirkuläre Verknüpfungen und ähnliches vorliegt. Es sollte eine entsprechende Ausnahme ausgelöst werden, um eine solche Bedingung widerzuzustanden.
Anfügen dynamischer Parameter an das Get-ChildItem-Cmdlet (Name)
Manchmal Get-ChildItem
erfordert das Cmdlet (mit dem -Parameter) Name
zusätzliche Parameter, die zur Laufzeit dynamisch angegeben werden. Um diese dynamischen Parameter bereitstellen zu können, muss der Windows PowerShell-Containeranbieter die System.Management.Automation.Provider.Containercmdletprovider.Getchildnamesdynamicparameters*-Methode implementieren. Diese Methode ruft die dynamischen Parameter für das Element am angegebenen Pfad ab und gibt ein Objekt mit Eigenschaften und Feldern mit Analyseattributen zurück, die einer Cmdlet-Klasse oder einem System.Management.Automation.Runtimedefinedparameterdictionary-Objekt ähneln. Die Windows PowerShell Runtime verwendet das zurückgegebene -Objekt, um dem Cmdlet die Parameter Get-ChildItem
hinzuzufügen.
Dieser Anbieter implementiert diese Methode nicht. Der folgende Code ist jedoch die Standardimplementierung dieser Methode.
Umbenennen von Elementen
Um ein Element umzubenennen, muss ein Windows PowerShell-Containeranbieter die System.Management.Automation.Provider.Containercmdletprovider.Renameitem*-Methode überschreiben, um Aufrufe vom Cmdlet zu Rename-Item
unterstützen. Diese Methode ändert den Namen des Elements am angegebenen Pfad in den angegebenen neuen Namen. Der neue Name muss immer relativ zum übergeordneten Element (Container) sein.
Dieser Anbieter überschreibt die System.Management.Automation.Provider.Containercmdletprovider.Renameitem*-Methode nicht. Im Folgenden finden Sie jedoch die Standardimplementierung.
Zu beachtende Dinge beim Implementieren von RenameItem
Die folgenden Bedingungen können für Ihre Implementierung von System.Management.Automation.Provider.Containercmdletprovider.Renameitem* gelten:
Beim Definieren der Anbieterklasse kann ein Windows PowerShell-Containeranbieter Anbieterfunktionen von ExpandWildcards, Filter, Include oder Exclude aus der System.Management.Automation.Provider.Providercapabilities-Enumeration deklarieren. In diesen Fällen muss die Implementierung der System.Management.Automation.Provider.Containercmdletprovider.Getchilditems*-Methode sicherstellen, dass der an die Methode übergebene Pfad die Anforderungen der angegebenen Funktionen erfüllt. Hierzu sollte die Methode auf die entsprechende Eigenschaft zugreifen, z.B. auf die Eigenschaften System.Management.Automation.Provider.Cmdletprovider.Exclude* und System.Management.Automation.Provider.Cmdletprovider.Include*.
Die System.Management.Automation.Provider.Containercmdletprovider.Renameitem*-Methode ist nur für die Änderung des Namens eines Elements und nicht für Move-Vorgänge vorgesehen. Ihre Implementierung der -Methode sollte einen Fehler schreiben, wenn der -Parameter Pfadtrennzeichen enthält oder andernfalls dazu führen kann, dass das Element seinen
newName
übergeordneten Speicherort ändert.Standardmäßig sollten Außerkraftsetzungen dieser Methode Objekte nur dann umbenennen, wenn die System.Management.Automation.Provider.Cmdletprovider.Force*-Eigenschaft angegeben ist. Wenn der angegebene Pfad einen Container angibt, ist die System.Management.Automation.Provider.Cmdletprovider.Force*-Eigenschaft nicht erforderlich.
Ihre Implementierung der System.Management.Automation.Provider.Containercmdletprovider.Renameitem*-Methode sollte System.Management.Automation.Provider.Cmdletprovider.ShouldProcess aufrufen und ihren Rückgabewert überprüfen, bevor Sie Änderungen am Datenspeicher vornehmen. Diese Methode wird verwendet, um die Ausführung eines Vorgangs zu bestätigen, wenn eine Änderung am Systemzustand vorgenommen wird, z. B. umbenennen von Dateien. System.Management.Automation.Provider.Cmdletprovider.ShouldProcess sendet den Namen der zu ändernden Ressource an den Benutzer. Dabei berücksichtigt die Windows PowerShell-Runtime alle Befehlszeileneinstellungen oder Einstellungsvariablen, um zu bestimmen, was angezeigt werden soll.
Nach dem Aufruf von System.Management.Automation.Provider.Cmdletprovider.ShouldProcess gibt zurück, sollte die
true
System.Management.Automation.Provider.Containercmdletprovider.Renameitem*-Methode die System.Management.Automation.Provider.Cmdletprovider.ShouldContinue-Methode aufrufen. Diese Methode sendet eine Bestätigungsnachricht an den Benutzer, um zusätzliches Feedback zu ermöglichen, um zu sagen, ob der Vorgang fortgesetzt werden soll. Ein Anbieter sollte System.Management.Automation.Provider.Cmdletprovider.ShouldContinue als zusätzliche Überprüfung auf potenziell gefährlichen Systemänderungen aufrufen.
Anfügen dynamischer Parameter an das Rename-Item-Cmdlet
Manchmal Rename-Item
erfordert das Cmdlet zusätzliche Parameter, die zur Laufzeit dynamisch angegeben werden. Um diese dynamischen Parameter Windows PowerShell, muss der Containeranbieter die System.Management.Automation.Provider.Containercmdletprovider.Renameitemdynamicparameters*-Methode implementieren. Diese Methode ruft die Parameter für das Element am angegebenen Pfad ab und gibt ein Objekt mit Eigenschaften und Feldern mit Analyseattributen zurück, die einer Cmdlet-Klasse oder einem System.Management.Automation.Runtimedefinedparameterdictionary-Objekt ähneln. Die Windows PowerShell Runtime verwendet das zurückgegebene -Objekt, um dem Cmdlet die Parameter Rename-Item
hinzuzufügen.
Dieser Containeranbieter implementiert diese Methode nicht. Der folgende Code ist jedoch die Standardimplementierung dieser Methode.
Erstellen neuer Elemente
Um neue Elemente zu erstellen, muss ein Containeranbieter die System.Management.Automation.Provider.Containercmdletprovider.Newitem*-Methode implementieren, um Aufrufe vom Cmdlet zu New-Item
unterstützen. Diese Methode erstellt ein Datenelement, das sich am angegebenen Pfad befindet. Der type
Parameter des Cmdlets enthält den vom Anbieter definierten Typ für das neue Element. Beispielsweise verwendet der FileSystem-Anbieter einen Parameter mit dem type
Wert "file" oder "directory". Der newItemValue
-Parameter des Cmdlets gibt einen anbieterspezifischen Wert für das neue Element an.
Hier ist die Implementierung der System.Management.Automation.Provider.Containercmdletprovider.Newitem*-Methode für diesen Anbieter.
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];
Zu beachtende Informationen zur Implementierung von NewItem
Die folgenden Bedingungen können für Ihre Implementierung von System.Management.Automation.Provider.Containercmdletprovider.Newitem* gelten:
Die System.Management.Automation.Provider.Containercmdletprovider.Newitem*-Methode sollte einen Vergleich der im -Parameter übergebenen Zeichenfolge ohne Unterscheidung nach Groß-/Kleinschreibung
type
durchführen. Außerdem sollten die am wenigsten mehrdeutigen Übereinstimmungen zulässig sein. Für die Typen "file" und "directory" ist beispielsweise nur der erste Buchstabe erforderlich, um mehrdeutige Informationen zu erhalten. Wenn der Parameter einen Typ angibt, den Ihr Anbieter nicht erstellen kann, sollte dietype
System.Management.Automation.Provider.Containercmdletprovider.Newitem*-Methode eine ArgumentException mit einer Meldung schreiben, die angibt, welche Typen der Anbieter erstellen kann.Für den -Parameter wird die Implementierung der
newItemValue
System.Management.Automation.Provider.Containercmdletprovider.Newitem*-Methode empfohlen, Zeichenfolgen mindestens zu akzeptieren. Außerdem sollte der Objekttyp akzeptiert werden, der von der System.Management.Automation.Provider.Itemcmdletprovider.Getitem*-Methode für denselben Pfad abgerufen wird. Die System.Management.Automation.Provider.Containercmdletprovider.Newitem*-Methode kann die System.Management.Automation.Languageprimitives.Convertto*-Methode verwenden, um Typen in den gewünschten Typ zu konvertieren.Ihre Implementierung der System.Management.Automation.Provider.Containercmdletprovider.Newitem*-Methode sollte System.Management.Automation.Provider.Cmdletprovider.ShouldProcess aufrufen und ihren Rückgabewert überprüfen, bevor Sie Änderungen am Datenspeicher vornehmen. Nachdem der Aufruf von System.Management.Automation.Provider.Cmdletprovider.ShouldProcess true zurückgegeben hat, sollte die System.Management.Automation.Provider.Containercmdletprovider.Newitem*-Methode die System.Management.Automation.Provider.Cmdletprovider.ShouldContinue-Methode als zusätzliche Überprüfung auf potenziell gefährlichen Systemänderungen aufrufen.
Anfügen dynamischer Parameter an das New-Item-Cmdlet
Manchmal New-Item
erfordert das Cmdlet zusätzliche Parameter, die zur Laufzeit dynamisch angegeben werden. Um diese dynamischen Parameter bereitstellen zu können, muss der Containeranbieter die Methode System.Management.Automation.Provider.Containercmdletprovider.Newitemdynamicparameters* implementieren. Diese Methode ruft die Parameter für das Element am angegebenen Pfad ab und gibt ein Objekt mit Eigenschaften und Feldern mit Analyseattributen zurück, die einer Cmdlet-Klasse oder einem System.Management.Automation.Runtimedefinedparameterdictionary-Objekt ähneln. Die Windows PowerShell Runtime verwendet das zurückgegebene -Objekt, um dem Cmdlet die Parameter New-Item
hinzuzufügen.
Dieser Anbieter implementiert diese Methode nicht. Der folgende Code ist jedoch die Standardimplementierung dieser Methode.
Entfernen von Elementen
Zum Entfernen von Elementen muss der Windows PowerShell-Anbieter die System.Management.Automation.Provider.Containercmdletprovider.Removeitem*-Methode überschreiben, um Aufrufe des Cmdlets zu Remove-Item
unterstützen. Diese Methode löscht ein Element aus dem Datenspeicher unter dem angegebenen Pfad. Wenn der -Parameter des Cmdlets auf festgelegt ist, entfernt die -Methode alle recurse
Remove-Item
true
untergeordneten Elemente unabhängig von ihrer Ebene. Wenn der -Parameter auf festgelegt ist, entfernt die -Methode nur ein false
einzelnes Element am angegebenen Pfad.
Dieser Anbieter unterstützt keine Elemententfernung. Der folgende Code ist jedoch die Standardimplementierung von System.Management.Automation.Provider.Containercmdletprovider.Removeitem*.
Zu beachtende Dinge beim Implementieren von RemoveItem
Die folgenden Bedingungen können für Ihre Implementierung von System.Management.Automation.Provider.Containercmdletprovider.Newitem* gelten:
Beim Definieren der Anbieterklasse kann ein Windows PowerShell-Containeranbieter Anbieterfunktionen von ExpandWildcards, Filter, Include oder Exclude aus der System.Management.Automation.Provider.Providercapabilities-Enumeration deklarieren. In diesen Fällen muss die Implementierung der System.Management.Automation.Provider.Containercmdletprovider.Getchilditems*-Methode sicherstellen, dass der an die Methode übergebene Pfad die Anforderungen der angegebenen Funktionen erfüllt. Hierzu sollte die Methode auf die entsprechende Eigenschaft zugreifen, z.B. auf die Eigenschaften System.Management.Automation.Provider.Cmdletprovider.Exclude* und System.Management.Automation.Provider.Cmdletprovider.Include*.
Standardmäßig sollten Außerkraftsetzungen dieser Methode Objekte nur entfernen, wenn die System.Management.Automation.Provider.Cmdletprovider.Force*-Eigenschaft auf TRUE festgelegt ist. Wenn der angegebene Pfad einen Container angibt, ist die System.Management.Automation.Provider.Cmdletprovider.Force*-Eigenschaft nicht erforderlich.
Ihre Implementierung von System.Management.Automation.Provider.Containercmdletprovider.Removeitem* ist dafür verantwortlich, eine unendliche Rekursion zu verhindern, wenn zirkuläre Verknüpfungen und ähnliches vorliegt. Es sollte eine entsprechende Ausnahme ausgelöst werden, um eine solche Bedingung widerzuzustanden.
Ihre Implementierung der System.Management.Automation.Provider.Containercmdletprovider.Removeitem*-Methode sollte System.Management.Automation.Provider.Cmdletprovider.ShouldProcess aufrufen und ihren Rückgabewert überprüfen, bevor Sie Änderungen am Datenspeicher vornehmen. Nach dem Aufruf von System.Management.Automation.Provider.Cmdletprovider.ShouldProcess gibt zurück, sollte die
true
System.Management.Automation.Provider.Containercmdletprovider.Removeitem*-Methode die System.Management.Automation.Provider.Cmdletprovider.ShouldContinue-Methode als zusätzliche Überprüfung auf potenziell gefährlichen Systemänderungen aufrufen.
Anfügen dynamischer Parameter an das Remove-Item-Cmdlet
Manchmal Remove-Item
erfordert das Cmdlet zusätzliche Parameter, die zur Laufzeit dynamisch angegeben werden. Um diese dynamischen Parameter bereitstellen zu können, muss der Containeranbieter die System.Management.Automation.Provider.Containercmdletprovider.Removeitemdynamicparameters*-Methode implementieren, um diese Parameter zu verarbeiten. Diese Methode ruft die dynamischen Parameter für das Element am angegebenen Pfad ab und gibt ein Objekt mit Eigenschaften und Feldern mit Analyseattributen zurück, die einer Cmdlet-Klasse oder einem System.Management.Automation.Runtimedefinedparameterdictionary-Objekt ähneln. Die Windows PowerShell Runtime verwendet das zurückgegebene -Objekt, um dem Cmdlet die Parameter Remove-Item
hinzuzufügen.
Dieser Containeranbieter implementiert diese Methode nicht. Der folgende Code ist jedoch die Standardimplementierung von System.Management.Automation.Provider.Containercmdletprovider.Removeitemdynamicparameters*.
Abfragen von untergeordneten Elementen
Um zu überprüfen, ob untergeordnete Elemente im angegebenen Pfad vorhanden sind, muss der Windows PowerShell-Containeranbieter die System.Management.Automation.Provider.Containercmdletprovider.Haschilditems*-Methode überschreiben. Diese Methode gibt true
zurück, wenn das Element über children verfügt, false
andernfalls . Bei einem NULL- oder leeren Pfad betrachtet die -Methode alle Elemente im Datenspeicher als children und gibt true
zurück.
Hier ist die Außerkraftsetzung für die System.Management.Automation.Provider.Containercmdletprovider.Haschilditems*-Methode. Wenn mehr als zwei Pfadteile von der ChunkPath-Hilfsmethode erstellt werden, gibt die Methode zurück, da nur ein Datenbankcontainer und ein false
Tabellencontainer definiert sind. Weitere Informationen zu dieser Hilfsmethode finden Sie unter Die ChunkPath-Methode wird unter Erstellen eines Windows PowerShell Elementanbieters erläutert.
protected override bool HasChildItems( string path )
{
return false;
} // HasChildItems
ErrorCategory.InvalidOperation, tableName));
}
return results;
Zu beachtende Informationen zur Implementierung von HasChildItems
Die folgenden Bedingungen können für Ihre Implementierung von System.Management.Automation.Provider.Containercmdletprovider.Haschilditems* gelten:
- Wenn der Containeranbieter einen Stamm verfügbar macht, der interessante Bereitstellungspunkte enthält, sollte die Implementierung der System.Management.Automation.Provider.Containercmdletprovider.Haschilditems*-Methode zurückgeben, wenn ein NULL-Wert oder eine leere Zeichenfolge für den Pfad übergeben
true
wird.
Kopieren von Elementen
Zum Kopieren von Elementen muss der Containeranbieter die System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem-Methode implementieren, um Aufrufe vom Cmdlet zu Copy-Item
unterstützen. Diese Methode kopiert ein Datenelement von dem durch den -Parameter des Cmdlets angegebenen Speicherort an den durch path
den -Parameter angegebenen copyPath
Speicherort. Wenn der recurse
-Parameter angegeben wird, kopiert die -Methode alle Untergeordneten Container. Wenn der -Parameter nicht angegeben wird, kopiert die -Methode nur eine einzelne Ebene von Elementen.
Dieser Anbieter implementiert diese Methode nicht. Der folgende Code ist jedoch die Standardimplementierung von System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem.
Zu beachtende Dinge beim Implementieren von CopyItem
Die folgenden Bedingungen gelten möglicherweise für Ihre Implementierung von System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem:
Beim Definieren der Anbieterklasse kann ein Windows PowerShell-Containeranbieter Anbieterfunktionen von ExpandWildcards, Filter, Include oder Exclude aus der System.Management.Automation.Provider.Providercapabilities-Enumeration deklarieren. In diesen Fällen muss die Implementierung der System.Management.Automation.Provider.Containercmdletprovider.Getchilditems*-Methode sicherstellen, dass der an die Methode übergebene Pfad die Anforderungen der angegebenen Funktionen erfüllt. Hierzu sollte die Methode auf die entsprechende Eigenschaft zugreifen, z.B. auf die Eigenschaften System.Management.Automation.Provider.Cmdletprovider.Exclude* und System.Management.Automation.Provider.Cmdletprovider.Include*.
Standardmäßig sollten Außerkraftsetzungen dieser Methode objekte nur dann über vorhandene Objekte kopieren, wenn die System.Management.Automation.Provider.Cmdletprovider.Force*-Eigenschaft auf festgelegt
true
ist. Beispielsweise kopiert der FileSystem-Anbieter keine c:\temp\abc.txt über eine vorhandene c:\abc.txt-Datei, es sei denn, die System.Management.Automation.Provider.Cmdletprovider.Force*-Eigenschaft ist auftrue
festgelegt. Wenn der im -Parameter angegebene Pfad vorhanden ist und einen Container angibt, ist diecopyPath
System.Management.Automation.Provider.Cmdletprovider.Force*-Eigenschaft nicht erforderlich. In diesem Fall sollte System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem das durch den -Parameter angegebene Element in den Container kopieren, der durch den -Parameter als untergeordnetes Element angegebenpath
copyPath
wird.Ihre Implementierung von System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem ist dafür verantwortlich, eine unendliche Rekursion zu verhindern, wenn zirkuläre Verknüpfungen und ähnliches vorliegt. Es sollte eine entsprechende Ausnahme ausgelöst werden, um eine solche Bedingung widerzuzustanden.
Ihre Implementierung der System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem-Methode sollte System.Management.Automation.Provider.Cmdletprovider.ShouldProcess aufrufen und ihren Rückgabewert überprüfen, bevor Sie Änderungen am Datenspeicher vornehmen. Nachdem der Aufruf von System.Management.Automation.Provider.Cmdletprovider.ShouldProcess true zurückgegeben hat, sollte die System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem-Methode die System.Management.Automation.Provider.Cmdletprovider.ShouldContinue-Methode als zusätzliche Überprüfung auf potenziell gefährlichen Systemänderungen aufrufen. Weitere Informationen zum Aufrufen dieser Methoden finden Sie unter Umbenennen von Elementen.
Anfügen dynamischer Parameter an das Copy-Item-Cmdlet
Manchmal Copy-Item
erfordert das Cmdlet zusätzliche Parameter, die zur Laufzeit dynamisch angegeben werden. Um diese dynamischen Parameter bereitstellen zu können, muss der Windows PowerShell-Containeranbieter die System.Management.Automation.Provider.Containercmdletprovider.Copyitemdynamicparameters*-Methode implementieren, um diese Parameter zu verarbeiten. Diese Methode ruft die Parameter für das Element am angegebenen Pfad ab und gibt ein Objekt mit Eigenschaften und Feldern mit Analyseattributen zurück, die einer Cmdlet-Klasse oder einem System.Management.Automation.Runtimedefinedparameterdictionary-Objekt ähneln. Die Windows PowerShell Runtime verwendet das zurückgegebene -Objekt, um dem Cmdlet die Parameter Copy-Item
hinzuzufügen.
Dieser Anbieter implementiert diese Methode nicht. Der folgende Code ist jedoch die Standardimplementierung von System.Management.Automation.Provider.Containercmdletprovider.Copyitemdynamicparameters*.
Codebeispiel
Den vollständigen Beispielcode finden Sie unter AccessDbProviderSample04-Codebeispiel.
Erstellen des Windows PowerShell Anbieters
Weitere Informationen finden Sie unter Registrieren von Cmdlets, Anbietern und Hostanwendungen.
Testen des Windows PowerShell Anbieters
Wenn Ihr Windows PowerShell-Anbieter bei Windows PowerShell registriert wurde, können Sie ihn testen, indem Sie die unterstützten Cmdlets in der Befehlszeile ausführen. Beachten Sie, dass in der folgenden Beispielausgabe eine fiktive Access-Datenbank verwendet wird.
Führen Sie das
Get-ChildItem
Cmdlet aus, um die Liste der untergeordneten Elemente aus einer Customers-Tabelle in der Access-Datenbank abzurufen.Get-ChildItem mydb:customers
Die folgende Ausgabe wird angezeigt.
PSPath : AccessDB::customers PSDrive : mydb PSProvider : System.Management.Automation.ProviderInfo PSIsContainer : True Data : System.Data.DataRow Name : Customers RowCount : 91 Columns :
Führen Sie das
Get-ChildItem
Cmdlet erneut aus, um die Daten einer Tabelle abzurufen.(Get-ChildItem mydb:customers).data
Die folgende Ausgabe wird angezeigt.
TABLE_CAT : c:\PS\northwind TABLE_SCHEM : TABLE_NAME : Customers TABLE_TYPE : TABLE REMARKS :
Verwenden Sie nun das
Get-Item
Cmdlet , um die Elemente in Zeile 0 in der Datentabelle abzurufen.Get-Item mydb:\customers\0
Die folgende Ausgabe wird angezeigt.
PSPath : AccessDB::customers\0 PSDrive : mydb PSProvider : System.Management.Automation.ProviderInfo PSIsContainer : False Data : System.Data.DataRow RowNumber : 0
Get-Item
Wiederverwenden, um die Daten für die Elemente in Zeile 0 abzurufen.(Get-Item mydb:\customers\0).data
Die folgende Ausgabe wird angezeigt.
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
Verwenden Sie nun das
New-Item
Cmdlet , um einer vorhandenen Tabelle eine Zeile hinzuzufügen. Der -Parameter gibt den vollständigen Pfad zur Zeile an und muss eine Zeilennummer angeben, die größer als die vorhandene Anzahl von ZeilenPath
in der Tabelle ist. DerType
-Parameter gibt "row" an, um den Typ des hinzuzufügenden Elements anzugeben. Schließlich gibt der -Parameter eine durch Trennzeichen getrennte Liste von SpaltenwertenValue
für die Zeile an.New-Item -Path mydb:\Customers\3 -ItemType "row" -Value "3,CustomerFirstName,CustomerLastName,CustomerEmailAddress,CustomerTitle,CustomerCompany,CustomerPhone, CustomerAddress,CustomerCity,CustomerState,CustomerZip,CustomerCountry"
Überprüfen Sie die Richtigkeit des Vorgangs für das neue Element wie folgt.
PS mydb:\> cd Customers PS mydb:\Customers> (Get-Item 3).data
Die folgende Ausgabe wird angezeigt.
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
Weitere Informationen
Erstellen von Windows PowerShell Anbietern
Entwerfen eines Windows PowerShell-Anbieters
Implementieren eines Elementanbieters Windows PowerShell Elementanbieters
Implementieren eines Navigationsanbieters Windows PowerShell