Création d’un fournisseur de conteneurs Windows PowerShell
Cette rubrique explique comment créer un fournisseur Windows PowerShell qui peut fonctionner sur des magasins de données multicouches. Pour ce type de magasin de données, le niveau supérieur du magasin contient les éléments racines et chaque niveau suivant est appelé nœud d’éléments enfants. En permettant à l’utilisateur de travailler sur ces nœuds enfants, un utilisateur peut interagir hiérarchiquement via le magasin de données.
Les fournisseurs qui peuvent fonctionner sur des magasins de données multiniveaux sont appelés fournisseurs de conteneurs Windows PowerShell. Toutefois, n’oubliez pas qu’un fournisseur de conteneurs Windows PowerShell ne peut être utilisé qu’en présence d’un seul conteneur (aucun conteneur imbriqué) avec des éléments qu’il contient. S’il existe des conteneurs imbriqués, vous devez implémenter un fournisseur de navigation Windows PowerShell. Pour plus d’informations sur l’implémentation du fournisseur de navigation Windows PowerShell, consultez Création d’un fournisseur de navigation Windows PowerShell.
Remarque
Vous pouvez télécharger le fichier source C# (AccessDBSampleProvider04.cs) pour ce fournisseur à l’aide du Kit de développement logiciel Microsoft Windows pour Windows Vista et .NET Framework 3.0 Runtime Components. Pour obtenir des instructions de téléchargement, consultez Comment installer Windows PowerShell et télécharger le Kit de développement logiciel (SDK) Windows PowerShell. Les fichiers sources téléchargés sont disponibles dans le répertoire <Exemples PowerShell>. Pour plus d’informations sur les autres implémentations de fournisseurs Windows PowerShell, consultez Conception de votre fournisseur Windows PowerShell.
Le fournisseur de conteneurs Windows PowerShell décrit ici définit la base de données comme conteneur unique, avec les tables et les lignes de la base de données définies comme éléments du conteneur.
Avertissement
N’oubliez pas que cette conception suppose qu’une base de données a un champ portant l’ID de nom et que le type du champ est LongInteger.
Définition d’une classe de fournisseur de conteneurs Windows PowerShell
Un fournisseur de conteneurs Windows PowerShell doit définir une classe .NET qui dérive de la classe de base System.Management.Automation.Provider.ContainerCmdletProvider. Voici la définition de classe pour le fournisseur de conteneurs Windows PowerShell décrit dans cette section.
[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : ContainerCmdletProvider
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 deuxième paramètre spécifie les fonctionnalités spécifiques de Windows PowerShell exposées par le fournisseur au runtime Windows PowerShell pendant le traitement des commandes. Pour ce fournisseur, aucune fonctionnalité spécifique à Windows PowerShell n’est ajoutée.
Définition des fonctionnalités de base
Comme décrit dans Conception de votre fournisseur Windows PowerShell, la classe System.Management.Automation.Provider.ContainerCmdletProvider dérive de plusieurs autres classes qui ont fourni différentes fonctionnalités de fournisseur. Un fournisseur de conteneurs 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 à la session et de libérer des ressources utilisées par le fournisseur, consultez Création d’un fournisseur Windows PowerShell de base. Toutefois, la plupart des fournisseurs (y compris le fournisseur décrit ici) peuvent utiliser l’implémentation par défaut de cette fonctionnalité fournie par Windows PowerShell.
Pour accéder au magasin de données, le fournisseur doit implémenter les méthodes de l'System.Management.Automation.Provider.DriveCmdletProvider classe de base. Pour plus d’informations sur l’implémentation de ces méthodes, consultez Création d’un fournisseur de lecteur Windows PowerShell.
Pour manipuler les éléments d’un magasin de données, tels que l’obtention, la définition et l’effacement des éléments, le fournisseur doit implémenter les méthodes fournies par l'System.Management.Automation.Provider.ItemCmdletProvider classe de base. Pour plus d’informations sur l’implémentation de ces méthodes, consultez Création d’un fournisseur d’éléments Windows PowerShell.
Récupération d’éléments enfants
Pour récupérer un élément enfant, le fournisseur de conteneurs Windows PowerShell doit remplacer la méthode System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* pour prendre en charge les appels à partir de l’applet de commande Get-ChildItem
. Cette méthode récupère les éléments enfants du magasin de données et les écrit dans le pipeline en tant qu’objets. Si le paramètre recurse
de l’applet de commande est spécifié, la méthode récupère tous les enfants quel que soit le niveau auquel ils se trouvent. Si le paramètre recurse
n’est pas spécifié, la méthode récupère un seul niveau d’enfants.
Voici l’implémentation de la méthode System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* pour ce fournisseur. Notez que cette méthode récupère les éléments enfants dans toutes les tables de base de données lorsque le chemin d’accès indique la base de données Access et récupère les éléments enfants à partir des lignes de cette table si le chemin indique une table de données.
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
Éléments à mémoriser à propos de l’implémentation de GetChildItems
Les conditions suivantes peuvent s’appliquer à votre implémentation de System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems*:
Lorsque vous définissez la classe de fournisseur, un fournisseur de conteneurs Windows PowerShell peut déclarer des fonctionnalités de fournisseur de ExpandWildcards, Filter, Include ou Exclude, à partir de l’énumération System.Management.Automation.Provider.ProviderCapabilities. Dans ce cas, l’implémentation de la méthode System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* doit s’assurer que le chemin passé à la méthode répond aux exigences des fonctionnalités spécifiées. Pour ce faire, la méthode doit accéder à la propriété appropriée, par exemple, les propriétés System.Management.Automation.Provider.CmdletProvider.Exclude* et System.Management.Automation.Provider.CmdletProvider.Include*.
L’implémentation de cette méthode doit tenir compte de toute forme d’accès à l’élément susceptible de rendre l’élément visible par l’utilisateur. Par exemple, si un utilisateur a accès en écriture à un fichier via le fournisseur FileSystem (fourni par Windows PowerShell), mais pas l’accès en lecture, le fichier existe toujours et System.Management.Automation.Provider.ItemCmdletProvider.ItemExists* retourne
true
. Votre implémentation peut nécessiter la vérification d’un élément parent pour voir si l’enfant peut être énuméré.Lors de l’écriture de plusieurs éléments, la méthode System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* peut prendre un certain temps. Vous pouvez concevoir votre fournisseur pour écrire les éléments à l’aide de l'System.Management.Automation.Provider.CmdletProvider.WriteItemObject* méthode un par un. L’utilisation de cette technique présente les éléments à l’utilisateur dans un flux.
Votre implémentation de System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* est responsable de la prévention de la récursivité infinie lorsqu’il existe des liens circulaires, et comme. Une exception de fin appropriée doit être levée pour refléter une telle condition.
Attachement de paramètres dynamiques à l’applet de commande Get-ChildItem
Parfois, l’applet de commande Get-ChildItem
qui appelle System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* nécessite des paramètres supplémentaires spécifiés dynamiquement au moment de l’exécution. Pour fournir ces paramètres dynamiques, le fournisseur de conteneurs Windows PowerShell doit implémenter la méthode System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItemsDynamicParameters*. Cette méthode récupère les paramètres dynamiques de l’élément au niveau du chemin indiqué et retourne un objet qui a des propriétés et des champs avec des attributs d’analyse similaires à une classe d’applet de commande ou à un objet System.Management.Automation.RuntimeDefinedParameterDictionary. Le runtime Windows PowerShell utilise l’objet retourné pour ajouter les paramètres à l’applet de commande Get-ChildItem
.
Ce fournisseur de conteneurs Windows PowerShell n’implémente pas cette méthode. Toutefois, le code suivant est l’implémentation par défaut de cette méthode.
Récupération des noms d’éléments enfants
Pour récupérer les noms des éléments enfants, le fournisseur de conteneurs Windows PowerShell doit remplacer la méthode System.Management.Automation.Provider.ContainerCmdletProvider.GetChildNames* pour prendre en charge les appels à partir de l’applet de commande Get-ChildItem
lorsque son paramètre Name
est spécifié. Cette méthode récupère les noms des éléments enfants pour le chemin d’accès spécifié ou les noms d’éléments enfants pour tous les conteneurs si le paramètre returnAllContainers
de l’applet de commande est spécifié. Un nom enfant est la partie feuille d’un chemin d’accès. Par exemple, le nom enfant du chemin d’accès C:\windows\system32\abc.dll est «abc.dll». Le nom enfant du répertoire C :\windows\system32 est « system32 ».
Voici l’implémentation de la méthode System.Management.Automation.Provider.ContainerCmdletProvider.GetChildNames* pour ce fournisseur. Notez que la méthode récupère les noms de table si le chemin spécifié indique la base de données Access (lecteur) et les numéros de ligne si le chemin indique une table.
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
Éléments à mémoriser sur l’implémentation de GetChildNames
Les conditions suivantes peuvent s’appliquer à votre implémentation de System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems*:
Lorsque vous définissez la classe de fournisseur, un fournisseur de conteneurs Windows PowerShell peut déclarer des fonctionnalités de fournisseur de ExpandWildcards, Filter, Include ou Exclude, à partir de l’énumération System.Management.Automation.Provider.ProviderCapabilities. Dans ce cas, l’implémentation de la méthode System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* doit s’assurer que le chemin passé à la méthode répond aux exigences des fonctionnalités spécifiées. Pour ce faire, la méthode doit accéder à la propriété appropriée, par exemple, les propriétés System.Management.Automation.Provider.CmdletProvider.Exclude* et System.Management.Automation.Provider.CmdletProvider.Include*.
Remarque
Une exception à cette règle se produit lorsque le paramètre
returnAllContainers
de l’applet de commande est spécifié. Dans ce cas, la méthode doit récupérer un nom enfant pour un conteneur, même si elle ne correspond pas aux valeurs de l'System.Management.Automation.Provider.CmdletProvider.Filter*, System.Management.Automation.Provider.CmdletProvider.Include*, ou Propriétés System.Management.Automation.Provider.CmdletProvider.Exclude*.Par défaut, les remplacements de cette méthode ne doivent pas récupérer les noms d’objets généralement masqués par l’utilisateur, sauf si la propriété System.Management.Automation.Provider.CmdletProvider.Force* est spécifiée. Si le chemin spécifié indique un conteneur, la propriété System.Management.Automation.Provider.CmdletProvider.Force* n’est pas nécessaire.
Votre implémentation de System.Management.Automation.Provider.ContainerCmdletProvider.GetChildNames* est responsable de la prévention de la récursivité infinie lorsqu’il existe des liens circulaires, ainsi que des liens similaires. Une exception de fin appropriée doit être levée pour refléter une telle condition.
Attachement de paramètres dynamiques à l’applet de commande Get-ChildItem (nom)
Parfois, l’applet de commande Get-ChildItem
(avec le paramètre Name
) nécessite des paramètres supplémentaires spécifiés dynamiquement au moment de l’exécution. Pour fournir ces paramètres dynamiques, le fournisseur de conteneurs Windows PowerShell doit implémenter la méthode System.Management.Automation.Provider.ContainerCmdletProvider.GetChildNamesDynamicParameters*. Cette méthode récupère les paramètres dynamiques de l’élément au niveau du chemin indiqué et retourne un objet qui a des propriétés et des champs avec des attributs d’analyse similaires à une classe d’applet de commande ou à un objet System.Management.Automation.RuntimeDefinedParameterDictionary. Le runtime Windows PowerShell utilise l’objet retourné pour ajouter les paramètres à l’applet de commande Get-ChildItem
.
Ce fournisseur n’implémente pas cette méthode. Toutefois, le code suivant est l’implémentation par défaut de cette méthode.
Renommage d’éléments
Pour renommer un élément, un fournisseur de conteneurs Windows PowerShell doit remplacer la méthode System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem* pour prendre en charge les appels à partir de l’applet de commande Rename-Item
. Cette méthode modifie le nom de l’élément au chemin d’accès spécifié au nouveau nom fourni. Le nouveau nom doit toujours être relatif à l’élément parent (conteneur).
Ce fournisseur ne remplace pas la méthode System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem*. Toutefois, voici l’implémentation par défaut.
Éléments à mémoriser à propos de l’implémentation de RenameItem
Les conditions suivantes peuvent s’appliquer à votre implémentation de System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem*:
Lorsque vous définissez la classe de fournisseur, un fournisseur de conteneurs Windows PowerShell peut déclarer des fonctionnalités de fournisseur de ExpandWildcards, Filter, Include ou Exclude, à partir de l’énumération System.Management.Automation.Provider.ProviderCapabilities. Dans ce cas, l’implémentation de la méthode System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* doit s’assurer que le chemin passé à la méthode répond aux exigences des fonctionnalités spécifiées. Pour ce faire, la méthode doit accéder à la propriété appropriée, par exemple, les propriétés System.Management.Automation.Provider.CmdletProvider.Exclude* et System.Management.Automation.Provider.CmdletProvider.Include*.
La méthode System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem* est destinée à la modification du nom d’un élément uniquement, et non pour les opérations de déplacement. Votre implémentation de la méthode doit écrire une erreur si le paramètre
newName
contient des séparateurs de chemin d’accès, ou peut entraîner la modification de son emplacement parent par l’élément.Par défaut, les remplacements de cette méthode ne doivent pas renommer des objets, sauf si la propriété System.Management.Automation.Provider.CmdletProvider.Force* est spécifiée. Si le chemin spécifié indique un conteneur, la propriété System.Management.Automation.Provider.CmdletProvider.Force* n’est pas nécessaire.
Votre implémentation de la méthode System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem* doit appeler System.Management.Automation.Provider.CmdletProvider.ShouldProcess et vérifier sa valeur de retour avant d’apporter des modifications au magasin de données. Cette méthode est utilisée pour confirmer l’exécution d’une opération lorsqu’une modification est apportée à l’état du système, par exemple en renommant des fichiers. System.Management.Automation.Provider.CmdletProvider.ShouldProcess envoie le nom de la ressource à modifier à l’utilisateur, avec le runtime Windows PowerShell prenant en compte les paramètres de ligne de commande ou les variables de préférence pour déterminer ce qui doit être affiché.
Après l’appel à System.Management.Automation.Provider.CmdletProvider.ShouldProcess retourne
true
, la méthode System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem* doit appeler la méthode System.Management.Automation.Provider.CmdletProvider.ShouldContinue. Cette méthode envoie un message de confirmation à l’utilisateur afin d’autoriser des commentaires supplémentaires à dire si l’opération doit être poursuivie. Un fournisseur doit appeler System.Management.Automation.Provider.CmdletProvider.ShouldContinue comme vérification supplémentaire des modifications système potentiellement dangereuses.
Attachement de paramètres dynamiques à l’applet de commande Rename-Item
Parfois, l’applet de commande Rename-Item
nécessite des paramètres supplémentaires spécifiés dynamiquement au moment de l’exécution. Pour fournir ces paramètres dynamiques, le fournisseur de conteneurs Windows PowerShell doit implémenter la méthode System.Management.Automation.Provider.ContainerCmdletProvider.RenameItemDynamicParameters*. Cette méthode récupère les paramètres de l’élément au niveau du chemin indiqué et retourne un objet qui a des propriétés et des champs avec des attributs d’analyse similaires à une classe d’applet de commande ou à un objet System.Management.Automation.RuntimeDefinedParameterDictionary. Le runtime Windows PowerShell utilise l’objet retourné pour ajouter les paramètres à l’applet de commande Rename-Item
.
Ce fournisseur de conteneurs n’implémente pas cette méthode. Toutefois, le code suivant est l’implémentation par défaut de cette méthode.
Création d’éléments
Pour créer de nouveaux éléments, un fournisseur de conteneurs doit implémenter la méthode System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* pour prendre en charge les appels à partir de l’applet de commande New-Item
. Cette méthode crée un élément de données situé au chemin spécifié. Le paramètre type
de l’applet de commande contient le type défini par le fournisseur pour le nouvel élément. Par exemple, le fournisseur FileSystem utilise un paramètre type
avec la valeur « file » ou « directory ». Le paramètre newItemValue
de l’applet de commande spécifie une valeur spécifique au fournisseur pour le nouvel élément.
Voici l’implémentation de la méthode System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* pour ce fournisseur.
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];
Éléments à mémoriser sur l’implémentation de NewItem
Les conditions suivantes peuvent s’appliquer à votre implémentation de System.Management.Automation.Provider.ContainerCmdletProvider.NewItem*:
La méthode System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* doit effectuer une comparaison qui ne respecte pas la casse de la chaîne passée dans le paramètre
type
. Il doit également autoriser les correspondances les moins ambiguës. Par exemple, pour les types « fichier » et « répertoire », seule la première lettre est requise pour lever l’ambiguïté. Si le paramètretype
indique un type que votre fournisseur ne peut pas créer, la méthode System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* doit écrire une exception ArgumentException avec un message indiquant les types que le fournisseur peut créer.Pour le paramètre
newItemValue
, l’implémentation de la méthode System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* est recommandée pour accepter les chaînes au minimum. Il doit également accepter le type d’objet récupéré par la méthode System.Management.Automation.Provider.ItemCmdletProvider.GetItem* pour le même chemin d’accès. La méthode System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* peut utiliser la méthode System.Management.Automation.LanguagePrimitives.ConvertTo* pour convertir les types en type souhaité.Votre implémentation de la méthode System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* doit appeler System.Management.Automation.Provider.CmdletProvider.ShouldProcess et vérifier sa valeur de retour avant d’apporter des modifications au magasin de données. Une fois l’appel à System.Management.Automation.Provider.CmdletProvider.ShouldProcess retourne la valeur true, la méthode System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* doit appeler la méthode System.Management.Automation.Provider.CmdletProvider.ShouldContinue comme vérification supplémentaire des modifications système potentiellement dangereuses.
Attachement de paramètres dynamiques à l’applet de commande New-Item
Parfois, l’applet de commande New-Item
nécessite des paramètres supplémentaires spécifiés dynamiquement au moment de l’exécution. Pour fournir ces paramètres dynamiques, le fournisseur de conteneurs doit implémenter la méthode System.Management.Automation.Provider.ContainerCmdletProvider.NewItemDynamicParameters*. Cette méthode récupère les paramètres de l’élément au niveau du chemin indiqué et retourne un objet qui a des propriétés et des champs avec des attributs d’analyse similaires à une classe d’applet de commande ou à un objet System.Management.Automation.RuntimeDefinedParameterDictionary. Le runtime Windows PowerShell utilise l’objet retourné pour ajouter les paramètres à l’applet de commande New-Item
.
Ce fournisseur n’implémente pas cette méthode. Toutefois, le code suivant est l’implémentation par défaut de cette méthode.
Suppression d’éléments
Pour supprimer des éléments, le fournisseur Windows PowerShell doit remplacer la méthode System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem* pour prendre en charge les appels de l’applet de commande Remove-Item
. Cette méthode supprime un élément du magasin de données au chemin d’accès spécifié. Si le paramètre recurse
de l’applet de commande Remove-Item
est défini sur true
, la méthode supprime tous les éléments enfants indépendamment de leur niveau. Si le paramètre est défini sur false
, la méthode supprime un seul élément au niveau du chemin spécifié.
Ce fournisseur ne prend pas en charge la suppression d’éléments. Toutefois, le code suivant est l’implémentation par défaut de System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem*.
Éléments à mémoriser à propos de l’implémentation de RemoveItem
Les conditions suivantes peuvent s’appliquer à votre implémentation de System.Management.Automation.Provider.ContainerCmdletProvider.NewItem*:
Lorsque vous définissez la classe de fournisseur, un fournisseur de conteneurs Windows PowerShell peut déclarer des fonctionnalités de fournisseur de ExpandWildcards, Filter, Include ou Exclude, à partir de l’énumération System.Management.Automation.Provider.ProviderCapabilities. Dans ce cas, l’implémentation de la méthode System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* doit s’assurer que le chemin passé à la méthode répond aux exigences des fonctionnalités spécifiées. Pour ce faire, la méthode doit accéder à la propriété appropriée, par exemple, les propriétés System.Management.Automation.Provider.CmdletProvider.Exclude* et System.Management.Automation.Provider.CmdletProvider.Include*.
Par défaut, les remplacements de cette méthode ne doivent pas supprimer d’objets, sauf si la propriété System.Management.Automation.Provider.CmdletProvider.Force* est définie sur true. Si le chemin spécifié indique un conteneur, la propriété System.Management.Automation.Provider.CmdletProvider.Force* n’est pas nécessaire.
Votre implémentation de System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem* est responsable de la prévention de la récursivité infinie lorsqu’il existe des liens circulaires, ainsi que des éléments similaires. Une exception de fin appropriée doit être levée pour refléter une telle condition.
Votre implémentation de la méthode System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem* doit appeler System.Management.Automation.Provider.CmdletProvider.ShouldProcess et vérifier sa valeur de retour avant d’apporter des modifications au magasin de données. Après l’appel à System.Management.Automation.Provider.CmdletProvider.ShouldProcess retourne
true
, la méthode System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem* doit appeler la méthode System.Management.Automation.Provider.CmdletProvider.ShouldContinue comme vérification supplémentaire des modifications système potentiellement dangereuses.
Attachement de paramètres dynamiques à l’applet de commande Remove-Item
Parfois, l’applet de commande Remove-Item
nécessite des paramètres supplémentaires spécifiés dynamiquement au moment de l’exécution. Pour fournir ces paramètres dynamiques, le fournisseur de conteneurs doit implémenter la méthode System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItemDynamicParameters* pour gérer ces paramètres. Cette méthode récupère les paramètres dynamiques de l’élément au niveau du chemin indiqué et retourne un objet qui a des propriétés et des champs avec des attributs d’analyse similaires à une classe d’applet de commande ou à un objet System.Management.Automation.RuntimeDefinedParameterDictionary. Le runtime Windows PowerShell utilise l’objet retourné pour ajouter les paramètres à l’applet de commande Remove-Item
.
Ce fournisseur de conteneurs n’implémente pas cette méthode. Toutefois, le code suivant est l’implémentation par défaut de System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItemDynamicParameters*.
Interrogation d’éléments enfants
Pour vérifier si des éléments enfants existent sur le chemin spécifié, le fournisseur de conteneurs Windows PowerShell doit remplacer la méthode System.Management.Automation.Provider.ContainerCmdletProvider.HasChildItems*. Cette méthode retourne true
si l’élément a des enfants et false
sinon. Pour un chemin null ou vide, la méthode considère tous les éléments du magasin de données comme des enfants et retourne true
.
Voici le remplacement de la méthode System.Management.Automation.Provider.ContainerCmdletProvider.HasChildItems*. S’il existe plus de deux parties de chemin créées par la méthode d’assistance ChunkPath, la méthode retourne false
, car seul un conteneur de base de données et un conteneur de table sont définis. Pour plus d’informations sur cette méthode d’assistance, consultez la méthode ChunkPath décrite dans Création d’un fournisseur d’éléments Windows PowerShell.
protected override bool HasChildItems( string path )
{
return false;
} // HasChildItems
ErrorCategory.InvalidOperation, tableName));
}
return results;
Éléments à mémoriser sur l’implémentation de HasChildItems
Les conditions suivantes peuvent s’appliquer à votre implémentation de System.Management.Automation.Provider.ContainerCmdletProvider.HasChildItems*:
- Si le fournisseur de conteneurs expose une racine qui contient des points de montage intéressants, l’implémentation de la méthode System.Management.Automation.Provider.ContainerCmdletProvider.HasChildItems* doit retourner
true
lorsqu’une chaîne null ou vide est passée pour le chemin d’accès.
Copie d’éléments
Pour copier des éléments, le fournisseur de conteneurs doit implémenter la méthode System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem pour prendre en charge les appels à partir de l’applet de commande Copy-Item
. Cette méthode copie un élément de données à partir de l’emplacement indiqué par le paramètre path
de l’applet de commande à l’emplacement indiqué par le paramètre copyPath
. Si le paramètre recurse
est spécifié, la méthode copie tous les sous-conteneurs. Si le paramètre n’est pas spécifié, la méthode copie un seul niveau d’éléments.
Ce fournisseur n’implémente pas cette méthode. Toutefois, le code suivant est l’implémentation par défaut de System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem.
Éléments à mémoriser sur l’implémentation de CopyItem
Les conditions suivantes peuvent s’appliquer à votre implémentation de System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem:
Lorsque vous définissez la classe de fournisseur, un fournisseur de conteneurs Windows PowerShell peut déclarer des fonctionnalités de fournisseur de ExpandWildcards, Filter, Include ou Exclude, à partir de l’énumération System.Management.Automation.Provider.ProviderCapabilities. Dans ce cas, l’implémentation de la méthode System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* doit s’assurer que le chemin passé à la méthode répond aux exigences des fonctionnalités spécifiées. Pour ce faire, la méthode doit accéder à la propriété appropriée, par exemple, les propriétés System.Management.Automation.Provider.CmdletProvider.Exclude* et System.Management.Automation.Provider.CmdletProvider.Include*.
Par défaut, les remplacements de cette méthode ne doivent pas copier d’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 FileSystem ne copie pas C:\temp\abc.txt sur un fichier C:\abc.txt existant, sauf si la propriété System.Management.Automation.Provider.CmdletProvider.Force* est définie surtrue
. Si le chemin d’accès spécifié dans le paramètrecopyPath
existe et indique un conteneur, la propriété System.Management.Automation.Provider.CmdletProvider.Force* n’est pas nécessaire. Dans ce cas, System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem doit copier l’élément indiqué par le paramètrepath
dans le conteneur indiqué par le paramètrecopyPath
en tant qu’enfant.Votre implémentation de System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem est responsable de la prévention de la récursivité infinie lorsqu’il existe des liens circulaires, ainsi que des éléments similaires. Une exception de fin appropriée doit être levée pour refléter une telle condition.
Votre implémentation de la méthode System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem doit appeler System.Management.Automation.Provider.CmdletProvider.ShouldProcess et vérifier sa valeur de retour avant d’apporter des modifications au magasin de données. Après l’appel à System.Management.Automation.Provider.CmdletProvider.ShouldProcess retourne true, la méthode System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem doit appeler la méthode System.Management.Automation.Provider.CmdletProvider.ShouldContinue comme vérification supplémentaire des modifications du système potentiellement dangereuses. Pour plus d’informations sur l’appel de ces méthodes, consultez Renommer des éléments.
Attachement de paramètres dynamiques à l’applet de commande Copy-Item
Parfois, l’applet de commande Copy-Item
nécessite des paramètres supplémentaires spécifiés dynamiquement au moment de l’exécution. Pour fournir ces paramètres dynamiques, le fournisseur de conteneurs Windows PowerShell doit implémenter la méthode System.Management.Automation.Provider.ContainerCmdletProvider.CopyItemDynamicParameters* pour gérer ces paramètres. Cette méthode récupère les paramètres de l’élément au niveau du chemin indiqué et retourne un objet qui a des propriétés et des champs avec des attributs d’analyse similaires à une classe d’applet de commande ou à un objet System.Management.Automation.RuntimeDefinedParameterDictionary. Le runtime Windows PowerShell utilise l’objet retourné pour ajouter les paramètres à l’applet de commande Copy-Item
.
Ce fournisseur n’implémente pas cette méthode. Toutefois, le code suivant est l’implémentation par défaut de System.Management.Automation.Provider.ContainerCmdletProvider.CopyItemDynamicParameters*.
Exemple de code
Pour obtenir un exemple de code complet, consultez AccessDbProviderSample04 Code Sample.
Génération du fournisseur Windows PowerShell
Consultez Comment inscrire des applets de commande, des fournisseurs et des applications hôtes.
Test du fournisseur Windows PowerShell
Lorsque votre fournisseur Windows PowerShell a été inscrit auprès de Windows PowerShell, vous pouvez le tester en exécutant les applets de commande prises en charge sur la ligne de commande. N’oubliez pas que l’exemple de sortie suivant utilise une base de données Access fictive.
Exécutez l’applet de commande
Get-ChildItem
pour récupérer la liste des éléments enfants d’une table Customers dans la base de données Access.Get-ChildItem mydb:customers
La sortie suivante s’affiche.
PSPath : AccessDB::customers PSDrive : mydb PSProvider : System.Management.Automation.ProviderInfo PSIsContainer : True Data : System.Data.DataRow Name : Customers RowCount : 91 Columns :
Réexécutez l’applet de commande
Get-ChildItem
pour récupérer les données d’une table.(Get-ChildItem mydb:customers).Data
La sortie suivante s’affiche.
TABLE_CAT : C:\PS\northwind TABLE_SCHEM : TABLE_NAME : Customers TABLE_TYPE : TABLE REMARKS :
Utilisez maintenant l’applet de commande
Get-Item
pour récupérer les éléments de la ligne 0 dans la table de données.Get-Item mydb:\customers\0
La sortie suivante s’affiche.
PSPath : AccessDB::customers\0 PSDrive : mydb PSProvider : System.Management.Automation.ProviderInfo PSIsContainer : False Data : System.Data.DataRow RowNumber : 0
Réutilisez
Get-Item
pour récupérer les données des éléments de la ligne 0.(Get-Item mydb:\customers\0).Data
La sortie suivante s’affiche.
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
Utilisez maintenant l’applet de commande
New-Item
pour ajouter une ligne à une table existante. Le paramètrePath
spécifie le chemin d’accès complet à la ligne et doit indiquer un numéro de ligne supérieur au nombre de lignes existant dans la table. Le paramètreType
indiqueRow
pour spécifier ce type d’élément à ajouter. Enfin, le paramètreValue
spécifie une liste délimitée par des virgules de valeurs de colonne pour la ligne.New-Item -Path mydb:\Customers\3 -ItemType "Row" -Value "3,CustomerFirstName,CustomerLastName,CustomerEmailAddress,CustomerTitle,CustomerCompany,CustomerPhone, CustomerAddress,CustomerCity,CustomerState,CustomerZip,CustomerCountry"
Vérifiez la justesse de la nouvelle opération d’élément comme suit.
PS mydb:\> cd Customers PS mydb:\Customers> (Get-Item 3).Data
La sortie suivante s’affiche.
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
Voir aussi
création de fournisseurs Windows PowerShell
conception de votre fournisseur Windows PowerShell
implémentation d’un fournisseur Windows PowerShell d’élément
implémentation d’un fournisseur Windows PowerShell de navigation
Comment inscrire des applets de commande, des fournisseurs et des applications hôtes