Partager via


Création d’un fournisseur de navigation Windows PowerShell

Ce sujet décrit comment créer un fournisseur de navigation Windows PowerShell capable de naviguer dans le magasin de données. Ce type de fournisseur prend en charge les commandes récursives, les conteneurs imbriqués et les chemins relatifs.

Note

Vous pouvez télécharger le fichier source C# (AccessDBSampleProvider05.cs) de ce fournisseur en utilisant le Microsoft Windows Software Development Kit for Windows Vista et les composants d’exécution .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 <répertoire PowerShell Samples> . Pour plus d’informations sur les autres implémentations de fournisseurs Windows PowerShell, voir Designing Your Windows PowerShell Provider.

Le fournisseur décrit ici permet à l’utilisateur de gérer une base de données Access comme un lecteur afin de pouvoir naviguer vers les tables de données de la base de données. Lors de la création de votre propre fournisseur de navigation, vous pouvez mettre en œuvre des méthodes permettant de créer des chemins qualifiés par le disque nécessaires à la navigation, de normaliser les chemins relatifs, de déplacer des éléments du magasin de données, ainsi que des méthodes qui obtiennent des noms enfants, obtiennent le chemin parent d’un élément, et testent pour identifier si un élément est un conteneur.

Caution

Sachez que cette conception suppose une base de données avec un champ avec l’ID du nom, et que le type du champ est LongInteger.

Définissez le fournisseur Windows PowerShell

Un fournisseur de navigation Windows PowerShell doit créer une classe .NET dérivée de la classe de base System.Management.Automation.Provider.NavigationCmdletProvider . Voici la définition de classe du fournisseur de navigation décrite dans cette section.

[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : NavigationCmdletProvider

Notez que dans ce fournisseur, 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, aucune fonctionnalité spécifique à Windows PowerShell n’est ajoutée.

Définition de la fonctionnalité de base

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

Pour implémenter des fonctionnalités permettant d’ajouter des informations d’initialisation spécifiques à chaque session et de libérer les ressources utilisées par le fournisseur, voir Création d’un fournisseur PS 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.

Pour accéder au stockage de données via un disque PowerShell Windows, vous devez implémenter les méthodes de la classe de base System.Management.Automation.Provider.DriveCmdletProvider . Pour plus d’informations sur la mise en œuvre de ces méthodes, voir Créer un fournisseur de disques Windows PowerShell.

Pour manipuler les éléments d’un magasin de données, tels que l’obtention, la mise en place et la compensation des éléments, le fournisseur doit implémenter les méthodes fournies par la classe de base System.Management.Automation.Provider.ItemCmdletProvider . Pour plus d’informations sur la mise en œuvre de ces méthodes, voir Créer un fournisseur d’éléments PowerShell Windows.

Pour accéder aux éléments enfants, ou à leurs noms, du magasin de données, ainsi qu’aux méthodes qui créent, copient, renomment et suppriment des éléments, vous devez implémenter les méthodes fournies par la classe de base System.Management.Automation.Provider.ContainerCmdletProvider . Pour plus d’informations sur la mise en œuvre de ces méthodes, voir Créer un fournisseur de conteneurs Windows PowerShell.

Création d’un chemin PowerShell Windows

Le fournisseur de navigation Windows PowerShell utilise un chemin Windows PowerShell interne au fournisseur pour naviguer dans les éléments du magasin de données. Pour créer un chemin interne fournisseur, le fournisseur doit implémenter la méthode System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* pour supporter les appels depuis le Combine-Path cmdlet. Cette méthode combine un chemin parent et un chemin enfant dans un chemin interne fournisseur, en utilisant un séparateur de chemin spécifique au fournisseur entre les chemins parent et enfant.

L’implémentation par défaut prend les chemins avec « / » ou « \ » comme séparateur de chemin, normalise le séparateur de chemin en « \ », combine les parties de chemin parent et enfant avec le séparateur entre elles, puis retourne une chaîne contenant les chemins combinés.

Ce fournisseur de navigation n’applique pas cette méthode. Cependant, le code suivant est l’implémentation par défaut de la méthode System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* .

Choses à retenir concernant la mise en œuvre de MakePath

Les conditions suivantes peuvent s’appliquer à votre implémentation de System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* :

  • Votre implémentation de la méthode System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* ne devrait pas valider le chemin comme un chemin légal entièrement qualifié dans l’espace de noms du fournisseur. Sachez que chaque paramètre ne peut représenter qu’une partie d’un chemin, et que les parties combinées peuvent ne pas générer un chemin entièrement qualifié. Par exemple, la méthode System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* pour le fournisseur de Système de fichiers peut recevoir « windows\system32 » dans le parent paramètre et «abc.dll» dans le child paramètre. La méthode relie ces valeurs au séparateur « \ » et renvoie « windows\system32\abc.dll», qui n’est pas un chemin de système de fichiers entièrement qualifié.

    Important

    Les parties de chemin fournies dans l’appel à System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* peuvent contenir des caractères non autorisés dans l’espace de noms fournisseur. Ces caractères sont très probablement utilisés pour l’expansion des jokers et la mise en œuvre de cette méthode ne devrait pas les supprimer.

Récupérer le chemin parent

Les fournisseurs de navigation Windows PowerShell implémentent la méthode System.Management.Automation.Provider.NavigationCmdletProvider.GetParentPath* pour récupérer la partie parente du chemin spécifique complet ou partiel indiqué. La méthode supprime la partie enfant du chemin et retourne la partie parent du chemin. Le root paramètre spécifie le chemin entièrement qualifié vers la racine d’un disque. Ce paramètre peut être nul ou vide si un disque monté n’est pas utilisé pour l’opération de récupération. Si une origine est spécifiée, la méthode doit retourner un chemin vers un conteneur dans le même arbre que la racine.

Le fournisseur de navigation par exemple ne remplace pas cette méthode, mais utilise l’implémentation par défaut. Il accepte les chemins qui utilisent à la fois « / » et « \ » comme séparateurs de chemin. Il normalise d’abord le chemin pour n’avoir que des séparateurs « \ », puis sépare le chemin parent au dernier « \ » et renvoie le chemin parent.

À retenir de la mise en œuvre de GetParentPath

Votre implémentation de la méthode System.Management.Automation.Provider.NavigationCmdletProvider.GetParentPath* devrait diviser le chemin de façon lexique sur le séparateur de chemin pour l’espace de noms fournisseur. Par exemple, le fournisseur du système de fichiers utilise cette méthode pour chercher le dernier « \ » et renvoie tout à gauche du séparateur.

Récupérer le nom du chemin enfant

Votre fournisseur de navigation implémente la méthode System.Management.Automation.Provider.NavigationCmdletProvider.GetChildName* pour récupérer le nom (élément feuille) de l’enfant de l’élément situé sur le chemin complet ou partiel spécifique au fournisseur indiqué.

Le fournisseur de navigation d’exemple ne supprime pas cette méthode. L’implémentation par défaut est présentée ci-dessous. Il accepte les chemins qui utilisent à la fois « / » et « \ » comme séparateurs de chemin. Il normalise d’abord le chemin pour n’avoir que des séparateurs « \ », puis sépare le chemin parent au dernier « \ » et retourne le nom de la partie enfant du chemin.

Choses à retenir concernant la mise en place de GetChildName

Votre implémentation de la méthode System.Management.Automation.Provider.NavigationCmdletProvider.GetChildName* devrait diviser le chemin lexiquement sur le séparateur de chemin. Si le chemin fourni ne contient aucun séparateur de chemin, la méthode devrait retourner le chemin sans modification.

Important

Le chemin fourni dans l’appel à cette méthode peut contenir des caractères illégaux dans l’espace de noms fournisseur. Ces caractères sont très probablement utilisés pour l’expansion des jokers ou l’appariement d’expressions régulières, et cette méthode ne devrait pas les supprimer.

Déterminer si un objet est un contenant

Le fournisseur de navigation peut implémenter la méthode System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer* pour déterminer si le chemin spécifié indique un conteneur. Il retourne true si le chemin représente un conteneur, et faux sinon. L’utilisateur a besoin de cette méthode pour pouvoir utiliser le Test-Path cmdlet pour le chemin fourni.

Le code suivant montre l’implémentation System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer* dans notre fournisseur de navigation d’exemple. La méthode vérifie que le chemin spécifié est correct et si la table existe, et retourne vrai si le chemin indique un conteneur.

protected override bool IsItemContainer(string path)
{
   if (PathIsDrive(path)) 
   { 
       return true; 
   }
   
   string[] pathChunks = ChunkPath(path);
   string tableName;
   int rowNumber;

   PathType type = GetNamesFromPath(path, out tableName, out rowNumber);
   
   if (type == PathType.Table)
   {
      foreach (DatabaseTableInfo ti in GetTables())
      {
          if (string.Equals(ti.Name, tableName, StringComparison.OrdinalIgnoreCase))
          {
              return true;
          }
      } // foreach (DatabaseTableInfo...
   } // if (pathChunks...

   return false;
} // IsItemContainer

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

La classe .NET de votre fournisseur de navigation pourrait déclarer les capacités du fournisseur ExpandWildcards, Filtrer, Inclure ou Exclure, de l’énumération System.Management.Automation.Provider.ProvidersCapabilities . Dans ce cas, la mise en œuvre de System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer* doit s’assurer que le chemin suivi répond aux besoins. Pour cela, la méthode doit accéder à la propriété appropriée, par exemple la propriété System.Management.Automation.Provider.CmdletProvider.Exclude* .

Déplacer un élément

Pour soutenir le Move-Item cmdlet, votre fournisseur de navigation implémente la méthode System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* . Cette méthode déplace l’élément spécifié par le path paramètre vers le conteneur au chemin fourni dans le destination paramètre.

Le fournisseur de navigation d’exemple ne supprime pas la méthode System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* . Voici l’implémentation par défaut.

Choses à retenir concernant la mise en œuvre de MoveItem

La classe .NET de votre fournisseur de navigation pourrait déclarer les capacités du fournisseur ExpandWildcards, Filtrer, Inclure ou Exclure, de l’énumération System.Management.Automation.Provider.ProvidersCapabilities . Dans ce cas, la mise en œuvre de System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* doit garantir que le chemin parcouru répond aux critères. Pour cela, la méthode doit accéder à la propriété appropriée, par exemple le CmdletProvider.Exclure la propriété.

Par défaut, les dérogations de cette méthode ne devraient pas déplacer les objets sur des objets existants, sauf si la propriété System.Management.Automation.Provider.CmdletProvider.Force* est définie sur true. Par exemple, le fournisseur de Système de fichiers ne copiera pas C:\temp\abc.txt sur un fichier C:\bar.txt existant à moins que la propriété System.Management.Automation.Provider.CmdletProvider.Force* ne soit définie à true. Si le chemin spécifié dans le destination paramètre existe et est un conteneur, la propriété System.Management.Automation.Provider.CmdletProvider.Force* n’est pas requise. Dans ce cas, System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* doit déplacer l’élément indiqué par le path paramètre vers le conteneur indiqué par ce destination paramètre en tant qu’enfant.

Votre implémentation de la méthode System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* doit appeler System.Management.Automation.Provider.CmdletProvider.ShouldProcess et vérifier sa valeur de retour avant d’effectuer toute modification du stockage de données. Cette méthode est utilisée pour confirmer l’exécution d’une opération lorsqu’un changement est effectué dans l’état système, par exemple la suppression de fichiers. System.Management.Automation.Provider.CmdletProvider.ShouldProcess envoie le nom de la ressource à changer à l’utilisateur, l’exécution PowerShell de Windows tenant compte des paramètres en ligne de commande ou des variables de préférence pour déterminer ce qui doit être affiché à l’utilisateur.

Après les retours truede l’appel vers System.Management.Automation.Provider.CmdletProvider.ShouldProcess , la méthode System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* doit appeler la méthode System.Management.Automation.Provider.CmdletProvider.ShouldContinue. Cette méthode envoie un message à l’utilisateur pour permettre un retour d’information indiquant si l’opération doit être poursuivie. Votre fournisseur doit appeler System.Management.Automation.Provider.CmdletProvider.ShouldContinue comme vérification supplémentaire en cas de modifications potentiellement dangereuses du système.

Attacher des paramètres dynamiques au Move-Item cmdlet

Parfois, le Move-Item cmdlet nécessite des paramètres supplémentaires fournis dynamiquement à l’exécution. Pour fournir ces paramètres dynamiques, le fournisseur de navigation doit implémenter la méthode System.Management.Automation.Provider.NavigationCmdletProvider.MoveItemDynamicParameters* pour obtenir les valeurs de paramètres requises de l’élément sur le chemin indiqué, et renvoyer un objet ayant des propriétés et des champs avec des attributs d’analyse similaires à une classe cmdlet ou à un objet System.Management.Automation.RuntimeDefinedParameterDictionary .

Ce fournisseur de navigation n’applique pas cette méthode. Cependant, le code suivant est l’implémentation par défaut de System.Management.Automation.Provider.NavigationCmdletProvider.MoveItemDynamicParameters*.

Normalisation d’un chemin relatif

Votre fournisseur de navigation implémente la méthode System.Management.Automation.Provider.NavigationCmdletProvider.NormalizeRelativePath* pour normaliser le chemin entièrement qualifié indiqué dans le path paramètre comme étant relatif au chemin spécifié par le basePath paramètre. La méthode retourne une représentation de chaîne du chemin normalisé. Il écrit une erreur si le path paramètre spécifie un chemin inexistant.

Le fournisseur de navigation d’exemple ne supprime pas cette méthode. Voici l’implémentation par défaut.

Choses à retenir concernant la mise en œuvre de NormalizeRelativePath

Votre implémentation de System.Management.Automation.Provider.NavigationCmdletProvider.NormalizeRelativePath* devrait analyser le path paramètre, mais il n’est pas nécessaire d’utiliser uniquement l’analyse syntaxique. Vous êtes encouragé à concevoir cette méthode pour utiliser le chemin afin de rechercher les informations de chemin dans le magasin de données et de créer un chemin correspondant à la casing et à la syntaxe standardisée des chemins.

Exemple de code

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

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

Il est possible pour un fournisseur d’ajouter des membres à des objets existants ou de définir de nouveaux objets. Pour plus d’informations, voirExtension des types d’objets et de la mise en forme.

Construire le fournisseur PowerShell de Windows

Pour plus d’informations, voir Comment enregistrer les commandets, fournisseurs et applications hôtes.

Tester le fournisseur Windows PowerShell

Lorsque votre fournisseur Windows PowerShell est enregistré auprès de Windows PowerShell, vous pouvez le tester en exécutant les cmdlets pris en charge sur la ligne de commande, y compris les cmdlets rendus disponibles par dérivation. Cet exemple testera le fournisseur de navigation par exemple.

  1. Exécutez votre nouveau shell et utilisez le Set-Location cmdlet pour définir le chemin indiquant la base de données Access.

    Set-Location mydb:
    
  2. Exécutez maintenant le Get-ChildItem cmdlet pour récupérer une liste des éléments de la base de données, qui sont les tables de base de données disponibles. Pour chaque tableau, ce cmdlet récupère également le nombre de lignes de tableau.

    Get-ChildItem | Format-Table RowCount, Name -AutoSize
    
    RowCount   Name
    --------   ----
         180   MSysAccessObjects
           0   MSysACEs
           1   MSysCmdbars
           0   MSysIMEXColumns
           0   MSysIMEXSpecs
           0   MSysObjects
           0   MSysQueries
           7   MSysRelationships
           8   Categories
          91   Customers
           9   Employees
        2155   Order Details
         830   Orders
          77   Products
           3   Shippers
          29   Suppliers
    
  3. Utilisez à nouveau le Set-Location cmdlet pour définir l’emplacement de la table de données des employés.

    Set-Location Employees
    
  4. Utilisons maintenant le Get-Location cmdlet pour récupérer le chemin vers la table des employés.

    Get-Location
    
    Path
    ----
    mydb:\Employees
    
  5. Utilisez maintenant le Get-ChildItem cmdlet branché vers le Format-Table cmdlet. Cet ensemble de commandlets récupère les éléments pour la table de données des employés, qui sont les lignes de tableau. Ils sont formatés selon les spécifications du Format-Table cmdlet.

    Get-ChildItem | Format-Table RowNumber, PSIsContainer, Data -AutoSize
    
    RowNumber   PSIsContainer   Data
    ---------   --------------   ----
    0           False            System.Data.DataRow
    1           False            System.Data.DataRow
    2           False            System.Data.DataRow
    3           False            System.Data.DataRow
    4           False            System.Data.DataRow
    5           False            System.Data.DataRow
    6           False            System.Data.DataRow
    7           False            System.Data.DataRow
    8           False            System.Data.DataRow
    
  6. Vous pouvez maintenant exécuter le Get-Item cmdlet pour récupérer les éléments de la ligne 0 de la table de données Employés.

    Get-Item 0
    
    PSPath        : AccessDB::C:\PS\Northwind.mdb\Employees\0
    PSParentPath  : AccessDB::C:\PS\Northwind.mdb\Employees
    PSChildName   : 0
    PSDrive       : mydb
    PSProvider    : System.Management.Automation.ProviderInfo
    PSIsContainer : False
    Data           : System.Data.DataRow
    RowNumber      : 0
    
  7. Utilisez à nouveau le Get-Item cmdlet pour récupérer les données des employés des éléments de la ligne 0.

    (Get-Item 0).Data
    
    EmployeeID      : 1
    LastName        : Davis
    FirstName       : Sara
    Title           : Sales Representative
    TitleOfCourtesy : Ms.
    BirthDate       : 12/8/1968 12:00:00 AM
    HireDate        : 5/1/1992 12:00:00 AM
    Address         : 4567 Main Street
                      Apt. 2A
    City            : Buffalo
    Region          : NY
    PostalCode      : 98052
    Country         : USA
    HomePhone       : (206) 555-9857
    Extension       : 5467
    Photo           : EmpID1.bmp
    Notes           : Education includes a BA in psychology from
                      Colorado State University. She also completed "The
                      Art of the Cold Call."  Nancy is a member of
                      Toastmasters International.
    ReportsTo       : 2
    

Voir aussi

Création de fournisseurs Windows PowerShell

Concevez votre fournisseur PowerShell Windows

Extension des types d’objets et de la mise en forme

Implémenter un fournisseur PowerShell Windows pour conteneurs

Comment enregistrer des commandants, des fournisseurs et des applications hôtes

Guide du programmeur Windows PowerShell

Windows PowerShell SDK