Partager via


Création d’un fournisseur d’éléments Windows PowerShell

Ce sujet décrit comment créer un fournisseur Windows PowerShell capable de manipuler les données dans un magasin de données. Dans ce sujet, les éléments de données du magasin sont appelés les « éléments » du magasin de données. En conséquence, un fournisseur capable de manipuler les données dans le magasin est appelé fournisseur d’éléments Windows PowerShell.

Note

Vous pouvez télécharger le fichier source C# (AccessDBSampleProvider03.cs) de ce fournisseur en utilisant le Microsoft Windows Software Development Kit pour Windows Vista et les composants d’exécution de .NET Framework 3.0. Pour les instructions de téléchargement, consultez Comment installer Windows PowerShell et télécharger le SDK Windows PowerShell. Les fichiers sources téléchargés sont disponibles dans le PowerShell Samples répertoire. Pour plus d’informations sur les autres implémentations de fournisseurs Windows PowerShell, voir Designing Your Windows PowerShell Provider.

Le fournisseur d’éléments Windows PowerShell décrit dans ce sujet obtient des données provenant d’une base de données Access. Dans ce cas, un « élément » est soit une table dans la base de données Access, soit une ligne dans une table.

Définition de la classe fournisseur d’éléments PowerShell Windows

Un fournisseur d’éléments Windows PowerShell doit définir une classe .NET dérivée de la classe de base System.Management.Automation.Provider.ItemCmdletProvider . Voici la définition de classe du fournisseur d’items décrit dans cette section.

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

public class AccessDBProvider : ItemCmdletProvider

Notez que dans cette définition de classe, l’attribut System.Management.Automation.Provider.CmdletProviderAttribute inclut deux paramètres. Le premier paramètre spécifie un nom convivial pour le fournisseur utilisé par Windows PowerShell. Le second paramètre spécifie les capacités spécifiques à Windows PowerShell que le fournisseur expose à l’exécution Windows PowerShell lors du traitement des commandes. Pour ce fournisseur, il n’y a pas de fonctionnalités spécifiques à Windows PowerShell supplémentaires.

Définition de la fonctionnalité de base

Comme décrit dans Design Your Windows PowerShell Provider, la classe System.Management.Automation.Provider.DriveCmdletProvider dérive de plusieurs autres classes qui offraient différentes fonctionnalités de fournisseurs. Un fournisseur d’éléments Windows PowerShell doit donc définir toutes les fonctionnalités fournies par ces classes.

Pour plus d’informations sur la manière d’implémenter des fonctionnalités permettant d’ajouter des informations d’initialisation spécifiques à chaque session et de la publication des ressources utilisées par le fournisseur, voir Créer un fournisseur PowerShell Windows de base. Cependant, la plupart des fournisseurs, y compris celui décrit ici, peuvent utiliser l’implémentation par défaut de cette fonctionnalité fournie par Windows PowerShell.

Avant que le fournisseur d’éléments PowerShell Windows puisse manipuler les éléments dans le magasin, il doit implémenter les méthodes de la classe de base System.Management.Automation.Provider.DriveCmdletProvider pour accéder au magasin de données. Pour plus d’informations sur la mise en œuvre de cette classe, voir Créer un fournisseur de disques Windows PowerShell.

Vérification de la validité du chemin

Lors de la recherche d’un élément de données, l’exécution Windows PowerShell fournit un chemin Windows PowerShell vers le fournisseur, tel que défini dans la section « Concepts PSPath » de Comment fonctionne Windows PowerShell. Un fournisseur d’éléments Windows PowerShell doit vérifier la validité syntaxique et sémantique de tout chemin qui lui est transmis en implémentant la méthode System.Management.Automation.Provider.ItemCmdletProvider.IsValidPath . Cette méthode retourne true si le chemin est valide, et false sinon. Sachez que l’implémentation de cette méthode ne doit pas vérifier l’existence de l’élément au chemin, mais seulement que le chemin est syntaxiquement et sémantiquement correct.

Voici l’implémentation de la méthode System.Management.Automation.Provider.ItemCmdletProvider.IsValidPath pour ce fournisseur. Notez que cette implémentation appelle une méthode assistante NormalizePath pour convertir tous les séparateurs du chemin en un système uniforme.

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

Déterminer si un objet existe

Après vérification du chemin, l’exécution PowerShell de Windows doit déterminer si un élément de données existe à ce chemin. Pour supporter ce type d’interrogation, le fournisseur d’éléments PowerShell Windows implémente la méthode System.Management.Automation.Provider.ItemCmdletProvider.ItemExists . Cette méthode renvoie true un élément trouvé sur le chemin spécifié et false (par défaut) sinon.

Voici la mise en œuvre de la méthode System.Management.Automation.Provider.ItemCmdletProvider.ItemExists pour ce fournisseur. Notez que cette méthode appelle les méthodes d’aide PathIsDrive, ChunkPath et GetTable , et utilise un objet DatabaseTableInfo défini par le fournisseur.

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

Choses à retenir concernant la mise en œuvre d’ItemExists

Les conditions suivantes peuvent s’appliquer à votre implémentation de System.Management.Automation.Provider.ItemCmdletProvider.ItemExists :

Attacher des paramètres dynamiques au cmdlet de Test-Path

Parfois, le Test-Path cmdlet qui appelle System.Management.Automation.Provider.ItemCmdletProvider.ItemExists nécessite des paramètres supplémentaires spécifiés dynamiquement à l’exécution. Pour fournir ces paramètres dynamiques, le fournisseur d’éléments PowerShell Windows doit implémenter la méthode System.Management.Automation.Provider.ItemCmdletProvider.ItemExistsDynamicParameters . Cette méthode récupère les paramètres dynamiques de l’élément sur le chemin indiqué et renvoie un objet possédant des propriétés et des champs avec des attributs d’analyse similaires à une classe cmdlet ou à un objet System.Management.Automation.RuntimeDefinedParameterDictionary . L’exécution PowerShell de Windows utilise l’objet retourné pour ajouter les paramètres au Test-Path cmdlet.

Ce fournisseur d’éléments Windows PowerShell n’implémente pas cette méthode. Cependant, le code suivant est l’implémentation par défaut de cette méthode.

Récupérer un objet

Pour récupérer un élément, le fournisseur d’éléments Windows PowerShell doit passer outre la méthode System.Management.Automation.Provider.ItemCmdletProvider.GetItem afin de prendre en charge les appels depuis le Get-Item cmdlet. Cette méthode écrit l’élément en utilisant la méthode System.Management.Automation.Provider.CmdletProvider.WriteItemObject .

Voici la mise en œuvre de la méthode System.Management.Automation.Provider.ItemCmdletProvider.GetItem pour ce fournisseur. Notez que cette méthode utilise les méthodes d’aide GetTable et GetRow pour récupérer des éléments qui sont soit des tables dans la base de données Access, soit des lignes dans une table de données.

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

Points à retenir concernant la mise en œuvre de GetItem

Les conditions suivantes peuvent s’appliquer à une implémentation de System.Management.Automation.Provider.ItemCmdletProvider.GetItem :

Attacher des paramètres dynamiques au cmdlet de Get-Item

Parfois, le Get-Item cmdlet nécessite des paramètres supplémentaires spécifiés dynamiquement à l’exécution. Pour fournir ces paramètres dynamiques, le fournisseur d’items Windows PowerShell doit implémenter la méthode System.Management.Automation.Provider.ItemCmdletProvider.GetItemDynamicParameters . Cette méthode récupère les paramètres dynamiques de l’élément sur le chemin indiqué et renvoie un objet possédant des propriétés et des champs avec des attributs d’analyse similaires à une classe cmdlet ou à un objet System.Management.Automation.RuntimeDefinedParameterDictionary . L’exécution PowerShell de Windows utilise l’objet retourné pour ajouter les paramètres au Get-Item cmdlet.

Ce fournisseur ne met pas en œuvre cette méthode. Cependant, le code suivant est l’implémentation par défaut de cette méthode.

Mise en place d’un objet

Pour définir un élément, le fournisseur d’éléments Windows PowerShell doit remplacer la méthode System.Management.Automation.Provider.ItemCmdletProvider.SetItem afin de supporter les appels depuis le Set-Item cmdlet. Cette méthode fixe la valeur de l’élément sur le chemin spécifié.

Ce fournisseur ne fournit pas de dérogation pour la méthode System.Management.Automation.Provider.ItemCmdletProvider.SetItem . Cependant, voici l’implémentation par défaut de cette méthode.

Points à retenir concernant la mise en œuvre de SetItem

Les conditions suivantes peuvent s’appliquer à votre implémentation de System.Management.Automation.Provider.ItemCmdletProvider.SetItem :

Récupération des paramètres dynamiques pour SetItem

Parfois, le Set-Item cmdlet nécessite des paramètres supplémentaires spécifiés dynamiquement à l’exécution. Pour fournir ces paramètres dynamiques, le fournisseur d’éléments PowerShell de Windows doit implémenter la méthode System.Management.Automation.Provider.ItemCmdletProvider.SetItemDynamicParameters . Cette méthode récupère les paramètres dynamiques de l’élément sur le chemin indiqué et renvoie un objet possédant des propriétés et des champs avec des attributs d’analyse similaires à une classe cmdlet ou à un objet System.Management.Automation.RuntimeDefinedParameterDictionary . L’exécution PowerShell de Windows utilise l’objet retourné pour ajouter les paramètres au Set-Item cmdlet.

Ce fournisseur ne met pas en œuvre cette méthode. Cependant, le code suivant est l’implémentation par défaut de cette méthode.

Nettoyer un élément

Pour effacer un élément, le fournisseur d’éléments Windows PowerShell implémente la méthode System.Management.Automation.Provider.ItemCmdletProvider.ClearItem pour supporter les appels depuis le Clear-Item cmdlet. Cette méthode efface l’élément de données sur le chemin spécifié.

Ce fournisseur ne met pas en œuvre cette méthode. Cependant, le code suivant est l’implémentation par défaut de cette méthode.

Points à retenir concernant la mise en œuvre de ClearItem

Les conditions suivantes peuvent s’appliquer à une implémentation de System.Management.Automation.Provider.ItemCmdletProvider.ClearItem :

Récupérer les paramètres dynamiques pour ClearItem

Parfois, le Clear-Item cmdlet nécessite des paramètres supplémentaires spécifiés dynamiquement à l’exécution. Pour fournir ces paramètres dynamiques, le fournisseur d’éléments Windows PowerShell doit implémenter la méthode System.Management.Automation.Provider.ItemCmdletProvider.ClearItemDynamicParameters . Cette méthode récupère les paramètres dynamiques de l’élément sur le chemin indiqué et renvoie un objet possédant des propriétés et des champs avec des attributs d’analyse similaires à une classe cmdlet ou à un objet System.Management.Automation.RuntimeDefinedParameterDictionary . L’exécution PowerShell de Windows utilise l’objet retourné pour ajouter les paramètres au Clear-Item cmdlet.

Ce fournisseur d’articles ne met pas en œuvre cette méthode. Cependant, le code suivant est l’implémentation par défaut de cette méthode.

Exécution d’une action par défaut pour un élément

Un fournisseur d’éléments Windows PowerShell peut implémenter la méthode System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultAction pour supporter les appels depuis le Invoke-Item cmdlet, ce qui permet au fournisseur d’effectuer une action par défaut pour l’élément sur le chemin spécifié. Par exemple, le fournisseur du système de fichiers peut utiliser cette méthode pour appeler ShellExecute pour un élément spécifique.

Ce fournisseur ne met pas en œuvre cette méthode. Cependant, le code suivant est l’implémentation par défaut de cette méthode.

Points à retenir concernant la mise en œuvre d’InvokeDefaultAction

Les conditions suivantes peuvent s’appliquer à une implémentation de System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultAction :

Récupérer les paramètres dynamiques pour InvokeDefaultAction

Parfois, le Invoke-Item cmdlet nécessite des paramètres supplémentaires spécifiés dynamiquement à l’exécution. Pour fournir ces paramètres dynamiques, le fournisseur d’éléments Windows PowerShell doit implémenter la méthode System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultActionDynamicParameters . Cette méthode récupère les paramètres dynamiques de l’élément sur le chemin indiqué et renvoie un objet possédant des propriétés et des champs avec des attributs d’analyse similaires à une classe cmdlet ou à un objet System.Management.Automation.RuntimeDefinedParameterDictionary . L’exécution PowerShell de Windows utilise l’objet retourné pour ajouter les paramètres dynamiques au Invoke-Item cmdlet.

Ce fournisseur d’articles ne met pas en œuvre cette méthode. Cependant, le code suivant est l’implémentation par défaut de cette méthode.

Implémentation des méthodes et classes d’assistance

Ce fournisseur d’items implémente plusieurs méthodes et classes d’assistance utilisées par les méthodes publiques de dérogation définies par Windows PowerShell. Le code de ces méthodes et classes d’assistance est présenté dans la section Exemple de code .

Méthode NormalizePath

Ce fournisseur d’items implémente une méthode d’assistance NormalizePath pour garantir que le chemin a un format cohérent. Le format spécifié utilise une barre oblique inverse (\) comme séparateur.

Méthode PathIsDrive

Ce fournisseur d’éléments implémente une méthode d’assistance PathIsDrive pour déterminer si le chemin spécifié est bien le nom du disque.

Méthode ChunkPath

Ce fournisseur d’items implémente une méthode d’assistance ChunkPath qui décompose le chemin spécifié afin que le fournisseur puisse identifier ses éléments individuels. Il retourne un tableau composé des éléments de chemin.

Méthode GetTable

Ce fournisseur d’éléments implémente la méthode d’aide GetTables qui retourne un objet DatabaseTableInfo représentant les informations sur la table spécifiée dans l’appel.

GetRow, méthode

La méthode System.Management.Automation.Provider.ItemCmdletProvider.GetItem de ce fournisseur d’items appelle la méthode helper GetRows . Cette méthode d’assistance récupère un objet DatabaseRowInfo qui représente des informations sur la ligne spécifiée dans la table.

Classe DatabaseTableInfo

Ce fournisseur d’items définit une classe DatabaseTableInfo qui représente une collection d’informations dans une table de données de la base de données. Cette classe est similaire à la classe System.IO.Directoryinfo .

Le fournisseur d’éléments d’exemple définit une méthode DatabaseTableInfo.GetTables qui retourne une collection d’objets d’information de table définissant les tables de la base de données. Cette méthode inclut un bloc try/catch pour s’assurer que toute erreur de base de données apparaisse comme une ligne sans entrées.

Classe DatabaseRowInfo

Ce fournisseur d’éléments définit la classe d’aide DatabaseRowInfo qui représente une ligne dans une table de la base de données. Cette classe est similaire à la classe System.IO.FileInfo .

Le fournisseur d’échantillons définit une méthode DatabaseRowInfo.GetRows pour retourner une collection d’objets d’information de ligne pour la table spécifiée. Cette méthode inclut un blocage try/catch pour piéger les exceptions. Toute erreur entraînera l’absence d’informations de ligne.

Exemple de code

Pour un code d’exemple complet, voir AccessDbProviderSample03 Code Sample.

Définition des types d’objets et mise en forme

Lors de l’écriture d’un fournisseur, il peut être nécessaire d’ajouter des membres à des objets existants ou de définir de nouveaux objets. Une fois terminé, créez un fichier Types que Windows PowerShell peut utiliser pour identifier les membres de l’objet ainsi qu’un fichier Format qui définit la manière dont l’objet est affiché. Pour plus d’informations, voir Extension des types d’objets et de la mise en forme.

Construire le fournisseur PowerShell de Windows

Voir comment enregistrer les commandants, les fournisseurs et les applications hôtes.

Tester le fournisseur Windows PowerShell

Lorsque ce fournisseur d’éléments Windows PowerShell est enregistré auprès de Windows PowerShell, vous ne pouvez tester que les fonctionnalités de base et de disque du fournisseur. Pour tester la manipulation des éléments, vous devez également implémenter la fonctionnalité de conteneur décrite dans Implémentation d’un fournisseur PowerShell Windows pour conteneurs.

Voir aussi