Freigeben über


Erstellung eines Windows PowerShell Item-Anbieters

Dieses Thema beschreibt, wie man einen Windows-PowerShell-Anbieter erstellt, der die Daten in einem Datenspeicher bearbeiten kann. In diesem Thema werden die Datenelemente im Speicher als die "Elemente" des Datenspeichers bezeichnet. Folglich wird ein Provider, der die Daten im Speicher bearbeiten kann, als Windows PowerShell Item Provider bezeichnet.

Hinweis

Sie können die C#-Quelldatei (AccessDBSampleProvider03.cs) für diesen Anbieter mit dem Microsoft Windows Software Development Kit for Windows Vista und .NET Framework 3.0 Runtime Components herunterladen. Für Download-Anweisungen siehe Wie man Windows PowerShell installiert und das Windows PowerShell SDK herunterlädt. Die heruntergeladenen Quelldateien sind im Verzeichnis PowerShell Samples verfügbar. Weitere Informationen zu anderen Implementierungen von Windows PowerShell-Anbietern finden Sie unter Designing Your Windows PowerShell Provider.

Der in diesem Thema beschriebene Windows-PowerShell-Item-Anbieter erhält Daten aus einer Access-Datenbank. In diesem Fall ist ein "Element" entweder eine Tabelle in der Access-Datenbank oder eine Zeile in einer Tabelle.

Definition der Windows PowerShell Item Provider-Klasse

Ein Windows-PowerShell-Item-Anbieter muss eine .NET-Klasse definieren, die von der Basisklasse System.Management.Automation.Provider.ItemCmdletProvider abgeleitet ist. Im Folgenden finden Sie die Klassendefinition für den in diesem Abschnitt beschriebenen Item-Anbieter.

[CmdletProvider("AccessDB", ProviderCapabilities.None)]

public class AccessDBProvider : ItemCmdletProvider

Beachten Sie, dass in dieser Klassendefinition das Attribut System.Management.Automation.Provider.CmdletProviderAttribute zwei Parameter enthält. Der erste Parameter gibt einen benutzerfreundlichen Namen für den Anbieter an, der von Windows PowerShell verwendet wird. Der zweite Parameter spezifiziert die Windows-PowerShell-spezifischen Fähigkeiten, die der Anbieter während der Befehlsverarbeitung der Windows-PowerShell-Laufzeit bereitstellt. Für diesen Anbieter gibt es keine zusätzlichen Windows-PowerShell-spezifischen Funktionen.

Definition der Basisfunktionalität

Wie in Design Your Windows PowerShell Provider beschrieben, leitet sich die Klasse System.Management.Automation.Provider.DriveCmdletProvider von mehreren anderen Klassen ab, die unterschiedliche Provider-Funktionalitäten bereitstellten. Ein Windows-PowerShell-Item-Anbieter muss daher alle Funktionen definieren, die von diesen Klassen bereitgestellt werden.

Weitere Informationen zur Implementierung von Funktionen zum Hinzufügen sessionsspezifischer Initialisierungsinformationen und zur Freigabe von vom Anbieter verwendeten Ressourcen finden Sie unter Erstellung eines einfachen Windows PowerShell Providers. Die meisten Anbieter, einschließlich des hier beschriebenen Anbieters, können jedoch die Standardimplementierung dieser Funktionalität verwenden, die von Windows PowerShell bereitgestellt wird.

Bevor der Windows-PowerShell-Item-Anbieter die Elemente im Store manipulieren kann, muss er die Methoden der Basisklasse System.Management.Automation.Provider.DriveCmdletProvider implementieren, um auf den Datenspeicher zuzugreifen. Weitere Informationen zur Implementierung dieser Klasse finden Sie unter Erstellung eines Windows PowerShell Laufwerksanbieters.

Überprüfung der Pfadvalidität

Wenn man nach einem Datenelement sucht, stellt die Windows-PowerShell-Laufzeit dem Anbieter einen Windows-PowerShell-Pfad zur Verfügung, wie im Abschnitt "PSPath Konzepte" von How Windows PowerShell Works definiert. Ein Windows-PowerShell-Item-Anbieter muss die syntaktische und semantische Gültigkeit jedes an ihn übermittelten Pfades überprüfen, indem er die System.Management.Automation.Automation.Provider.ItemCmdletProvider.IsValidPath-Methode implementiert. Diese Methode gibt zurück, true wenn der Pfad gültig ist, und false andernfalls. Beachten Sie, dass die Implementierung dieser Methode nicht die Existenz des Objekts auf dem Pfad überprüfen sollte, sondern lediglich, dass der Pfad syntaktisch und semantisch korrekt ist.

Hier ist die Implementierung der Methode System.Management.Automation.Provider.ItemCmdletProvider.IsValidPath für diesen Anbieter. Beachten Sie, dass diese Implementierung eine NormalizePath-Hilfsmethode aufruft, um alle Separatoren im Pfad in einen einheitlichen zu konvertieren.

protected override bool IsValidPath(string path)
{
    bool result = true;

    // check if the path is null or empty
    if (String.IsNullOrEmpty(path))
    {
        result = false;
    }

    // convert all separators in the path to a uniform one
    path = NormalizePath(path);

    // split the path into individual chunks
    string[] pathChunks = path.Split(pathSeparator.ToCharArray());

    foreach (string pathChunk in pathChunks)
    {
        if (pathChunk.Length == 0)
        {
            result = false;
        }
    }
    return result;
} // IsValidPath

Feststellung, ob ein Gegenstand existiert

Nach Überprüfung des Pfades muss die Windows-PowerShell-Laufzeit feststellen, ob ein Datenelement an diesem Pfad existiert. Um diese Art von Abfrage zu unterstützen, implementiert der Windows-PowerShell-Item-Provider die Methode System.Management.Automation.Provider.ItemCmdletProvider.ItemExist. Diese Methode gibt ansonsten ein Element zurück, true das auf dem angegebenen Pfad gefunden wird, und false (Standard).

Hier ist die Implementierung der Methode System.Management.Automation.Provider.ItemCmdletProvider.ItemExists für diesen Anbieter. Beachten Sie, dass diese Methode die Hilfsmethoden PathIsDrive, ChunkPath und GetTable aufruft und ein anbieterdefiniertes DatabaseTableInfo-Objekt verwendet.

protected override bool ItemExists(string path)
{
    // check if the path represented is a drive
    if (PathIsDrive(path))
    {
        return true;
    }

    // Obtain type, table name and row number from path
    string tableName;
    int rowNumber;

    PathType type = GetNamesFromPath(path, out tableName, out rowNumber);

    DatabaseTableInfo table = GetTable(tableName);

    if (type == PathType.Table)
    {
        // if specified path represents a table then DatabaseTableInfo
        // object for the same should exist
        if (table != null)
        {
            return true;
        }
    }
    else if (type == PathType.Row)
    {
        // if specified path represents a row then DatabaseTableInfo should
        // exist for the table and then specified row number must be within
        // the maximum row count in the table
        if (table != null && rowNumber < table.RowCount)
        {
            return true;
        }
    }

    return false;

} // ItemExists

Was man bei der Implementierung von ItemExists beachten sollte

Die folgenden Bedingungen können für Ihre Implementierung von System.Management.Automation.Provider.ItemCmdletProvider.ItemExists gelten:

Dynamische Parameter an das Test-Path Cmdlet anhängen

Manchmal benötigt das Test-Path Cmdlet, das System.Management.Automation.Automation.Provider.ItemCmdletProvider.ItemExists aufruft, zusätzliche Parameter, die zur Laufzeit dynamisch angegeben werden. Um diese dynamischen Parameter bereitzustellen, muss der Windows-PowerShell-Item-Provider die Methode System.Management.Automation.Provider.ItemCmdletProvider.ItemExistsDynamicParameters implementieren. Diese Methode ruft die dynamischen Parameter für das Element auf dem angegebenen Pfad ab und gibt ein Objekt zurück, das Eigenschaften und Felder mit Parsing-Attributen besitzt, ähnlich einer cmdlet-Klasse oder einem System.Management.Automation.RuntimeDefinedParameterDictionary-Objekt . Die Windows-PowerShell-Laufzeit verwendet das zurückgegebene Objekt, um die Parameter zum Test-Path Cmdlet hinzuzufügen.

Dieser Windows-PowerShell-Item-Anbieter implementiert diese Methode nicht. Der folgende Code ist jedoch die Standardimplementierung dieser Methode.

Wiederherstellung eines Gegenstands

Um ein Element abzurufen, muss der Windows-PowerShell-Item-Provider die Methode System.Management.Automation.Provider.ItemCmdletProvider.GetItem überschreiben, um Aufrufe vom Cmdlet Get-Item zu unterstützen. Diese Methode schreibt das Element mit der Methode System.Management.Automation.Provider.CmdletProvider.WriteItemObject .

Hier ist die Implementierung der System.Management.Automation.Provider.ItemCmdletProvider.GetItem-Methode für diesen Anbieter. Beachten Sie, dass diese Methode die Hilfsmethoden GetTable und GetRow verwendet, um Einträge abzurufen, die entweder Tabellen in der Access-Datenbank oder Zeilen in einer Datentabelle sind.

protected override void GetItem(string path)
{
    // check if the path represented is a drive
    if (PathIsDrive(path))
    {
        WriteItemObject(this.PSDriveInfo, path, true);
        return;
    }// if (PathIsDrive...

     // Get table name and row information from the path and do 
     // necessary actions
     string tableName;
     int rowNumber;

     PathType type = GetNamesFromPath(path, out tableName, out rowNumber);

     if (type == PathType.Table)
     {
         DatabaseTableInfo table = GetTable(tableName);
         WriteItemObject(table, path, true);
     }
     else if (type == PathType.Row)
     {
         DatabaseRowInfo row = GetRow(tableName, rowNumber);
         WriteItemObject(row, path, false);
     }
     else
     {
         ThrowTerminatingInvalidPathException(path);
     }

 } // GetItem

Dinge, die man bei der Implementierung von GetItem beachten sollte

Die folgenden Bedingungen können für eine Implementierung von System.Management.Automation.Provider.ItemCmdletProvider.GetItem gelten:

Dynamische Parameter an das Get-Item Cmdlet anhängen

Manchmal benötigt das Get-Item Cmdlet zusätzliche Parameter, die zur Laufzeit dynamisch angegeben werden. Um diese dynamischen Parameter bereitzustellen, muss der Windows-PowerShell-Item-Anbieter die Methode System.Management.Automation.Provider.ItemCmdletProvider.GetItemDynamicParameters implementieren. Diese Methode ruft die dynamischen Parameter für das Element auf dem angegebenen Pfad ab und gibt ein Objekt zurück, das Eigenschaften und Felder mit Parsing-Attributen besitzt, ähnlich einer cmdlet-Klasse oder einem System.Management.Automation.RuntimeDefinedParameterDictionary-Objekt . Die Windows-PowerShell-Laufzeit verwendet das zurückgegebene Objekt, um die Parameter zum Get-Item Cmdlet hinzuzufügen.

Dieser Anbieter implementiert diese Methode nicht. Der folgende Code ist jedoch die Standardimplementierung dieser Methode.

Einen Gegenstand aufstellen

Um ein Element zu setzen, muss der Windows-PowerShell-Item-Anbieter die Methode System.Management.Automation.Provider.ItemCmdletProvider.SetItem überschreiben, um Aufrufe vom Cmdlet Set-Item zu unterstützen. Diese Methode setzt den Wert des Elements auf dem angegebenen Pfad.

Dieser Anbieter bietet keine Überschreibung für die Methode System.Management.Automation.Provider.ItemCmdletProvider.SetItem . Folgendes ist jedoch die Standardimplementierung dieser Methode.

Was man bei der Implementierung von SetItem beachten sollte

Die folgenden Bedingungen können für Ihre Implementierung von System.Management.Automation.Provider.ItemCmdletProvider.SetItem gelten:

Abruf dynamischer Parameter für SetItem

Manchmal benötigt das Set-Item Cmdlet zusätzliche Parameter, die zur Laufzeit dynamisch angegeben werden. Um diese dynamischen Parameter bereitzustellen, muss der Windows-PowerShell-Item-Provider die Methode System.Management.Automation.Provider.ItemCmdletProvider.SetItemDynamicParameters implementieren. Diese Methode ruft die dynamischen Parameter für das Element auf dem angegebenen Pfad ab und gibt ein Objekt zurück, das Eigenschaften und Felder mit Parsing-Attributen besitzt, ähnlich einer cmdlet-Klasse oder einem System.Management.Automation.RuntimeDefinedParameterDictionary-Objekt . Die Windows-PowerShell-Laufzeit verwendet das zurückgegebene Objekt, um die Parameter zum Set-Item Cmdlet hinzuzufügen.

Dieser Anbieter implementiert diese Methode nicht. Der folgende Code ist jedoch die Standardimplementierung dieser Methode.

Einen Gegenstand abschließen

Um ein Element zu löschen, implementiert der Windows-PowerShell-Item-Provider die Methode System.Management.Automation.Provider.ItemCmdletProvider.ClearItem, um Aufrufe vom Cmdlet Clear-Item zu unterstützen. Diese Methode löscht das Datenelement am angegebenen Pfad.

Dieser Anbieter implementiert diese Methode nicht. Der folgende Code ist jedoch die Standardimplementierung dieser Methode.

Was man bei der Implementierung von ClearItem beachten sollte

Die folgenden Bedingungen können für eine Implementierung von System.Management.Automation.Provider.ItemCmdletProvider.ClearItem gelten:

Dynamische Parameter für ClearItem abrufen

Manchmal benötigt das Clear-Item Cmdlet zusätzliche Parameter, die zur Laufzeit dynamisch angegeben werden. Um diese dynamischen Parameter bereitzustellen, muss der Windows-PowerShell-Item-Anbieter die Methode System.Management.Automation.Provider.ItemCmdletProvider.ClearItemDynamicParameters implementieren. Diese Methode ruft die dynamischen Parameter für das Element auf dem angegebenen Pfad ab und gibt ein Objekt zurück, das Eigenschaften und Felder mit Parsing-Attributen besitzt, ähnlich einer cmdlet-Klasse oder einem System.Management.Automation.RuntimeDefinedParameterDictionary-Objekt . Die Windows-PowerShell-Laufzeit verwendet das zurückgegebene Objekt, um die Parameter zum Clear-Item Cmdlet hinzuzufügen.

Dieser Item-Anbieter implementiert diese Methode nicht. Der folgende Code ist jedoch die Standardimplementierung dieser Methode.

Ausführung einer Standardaktion für einen Gegenstand

Ein Windows-PowerShell-Item-Anbieter kann die Methode System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultAction implementieren, um Aufrufe vom Invoke-Item Cmdlet zu unterstützen, was es dem Anbieter ermöglicht, eine Standardaktion für das Element auf dem angegebenen Pfad auszuführen. Zum Beispiel könnte der FileSystem-Anbieter diese Methode verwenden, um ShellExecute für ein bestimmtes Element aufzurufen.

Dieser Anbieter implementiert diese Methode nicht. Der folgende Code ist jedoch die Standardimplementierung dieser Methode.

Was man bei der Implementierung von InvokeDefaultAction beachten sollte

Die folgenden Bedingungen können für eine Implementierung von System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultAction gelten:

Dynamische Parameter für InvokeDefaultAction abrufen

Manchmal benötigt das Invoke-Item Cmdlet zusätzliche Parameter, die zur Laufzeit dynamisch angegeben werden. Um diese dynamischen Parameter bereitzustellen, muss der Windows-PowerShell-Item-Anbieter die Methode System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultActionDynamicParameters implementieren. Diese Methode ruft die dynamischen Parameter für das Element auf dem angegebenen Pfad ab und gibt ein Objekt zurück, das Eigenschaften und Felder mit Parsing-Attributen besitzt, ähnlich einer cmdlet-Klasse oder einem System.Management.Automation.RuntimeDefinedParameterDictionary-Objekt . Die Windows-PowerShell-Laufzeit verwendet das zurückgegebene Objekt, um die dynamischen Parameter zum Invoke-Item Cmdlet hinzuzufügen.

Dieser Item-Anbieter implementiert diese Methode nicht. Der folgende Code ist jedoch die Standardimplementierung dieser Methode.

Implementierung von Hilfsmethoden und -klassen

Dieser Item-Anbieter implementiert mehrere Hilfsmethoden und -klassen, die von den öffentlichen Überschreibungsmethoden unter Windows PowerShell verwendet werden. Der Code für diese Hilfsmethoden und Klassen ist im Abschnitt Codebeispiel dargestellt.

NormalizePath-Methode

Dieser Item-Anbieter implementiert eine NormalizePath-Hilfsmethode , um sicherzustellen, dass der Pfad ein konsistentes Format hat. Das angegebene Format verwendet einen Backslash (\) als Trennzeichen.

PathIsDrive-Methode

Dieser Item-Provider implementiert eine PathIsDrive-Hilfsmethode , um festzustellen, ob der angegebene Pfad tatsächlich der Laufwerksname ist.

ChunkPath-Methode

Dieser Item-Anbieter implementiert eine ChunkPath-Hilfsmethode , die den angegebenen Pfad aufteilt, damit der Anbieter seine einzelnen Elemente identifizieren kann. Es gibt ein Array zurück, das aus den Pfadelementen besteht.

GetTable-Methode

Dieser Item-Anbieter implementiert die GetTables-Hilfsmethode , die ein DatabaseTableInfo-Objekt zurückgibt, das Informationen über die im Aufruf angegebene Tabelle darstellt.

GetRow-Methode

Die System.Management.Automation.Provider.ItemCmdletProvider.GetItem-Methode dieses Item-Anbieters ruft die GetRows-Hilfsmethode auf. Diese Hilfsmethode ruft ein DatabaseRowInfo-Objekt ab, das Informationen über die angegebene Zeile in der Tabelle darstellt.

DatabaseTableInfo-Klasse

Dieser Item-Anbieter definiert eine DatabaseTableInfo-Klasse , die eine Sammlung von Informationen in einer Datentabelle in der Datenbank darstellt. Diese Klasse ähnelt der System.IO.Directoryinfo-Klasse .

Der Beispiel-Item-Anbieter definiert eine Methode DatabaseTableInfo.GetTableTables, die eine Sammlung von Tabelleninformationsobjekten zurückgibt, die die Tabellen in der Datenbank definieren. Diese Methode beinhaltet einen Try/Catch-Block, um sicherzustellen, dass ein Datenbankfehler als Zeile ohne Einträge angezeigt wird.

DatabaseRowInfo-Klasse

Dieser Item-Anbieter definiert die DatabaseRowInfo-Hilfsklasse , die eine Zeile in einer Datenbanktabelle darstellt. Diese Klasse ähnelt der System.IO.FileInfo-Klasse .

Der Beispielanbieter definiert eine Methode DatabaseRowInfo.GetRows, um eine Sammlung von Zeileninformationsobjekten für die angegebene Tabelle zurückzugeben. Diese Methode beinhaltet einen Versuch-/Fang-Block, um Ausnahmen zu fangen. Etwaige Fehler führen zu keiner Zeileninformation.

Codebeispiel

Für den vollständigen Beispielcode siehe AccessDbProviderSample03 Codebeispiel.

Definition von Objekttypen und Formatierung

Beim Schreiben eines Providers kann es notwendig sein, bestehenden Objekten Mitglieder hinzuzufügen oder neue Objekte zu definieren. Nach Abschluss erstellen Sie eine Types-Datei, die Windows PowerShell verwenden kann, um die Mitglieder des Objekts zu identifizieren, sowie eine Format-Datei, die definiert, wie das Objekt angezeigt wird. Weitere Informationen finden Sie unter Erweiterung von Objekttypen und Formatierung.

Aufbau des Windows-PowerShell-Anbieters

Sieh dir an, wie man Cmdlets, Anbieter und Host-Anwendungen registriert.

Testen des Windows PowerShell-Anbieters

Wenn dieser Windows-PowerShell-Item-Anbieter bei Windows PowerShell registriert ist, können Sie nur die grundlegende und Laufwerksfunktionalität des Providers testen. Um die Manipulation von Elementen zu testen, müssen Sie außerdem die Container-Funktionalität implementieren, die in Implementing a Container Windows PowerShell Provider beschrieben ist.

Siehe auch