Note
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier les répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de changer de répertoire.
Ce sujet décrit comment créer un fournisseur Windows PowerShell capable de fonctionner sur des entrepôts de données multi-couches. Pour ce type de stockage de données, le niveau supérieur du magasin contient les éléments racines et chaque niveau suivant est appelé un nœud d’éléments enfants. En permettant à l’utilisateur de travailler sur ces nœuds enfants, l’utilisateur peut interagir hiérarchiquement via le stockage de données.
Les fournisseurs capables de travailler sur des réservoirs de données multi-niveaux sont appelés fournisseurs de conteneurs Windows PowerShell. Cependant, sachez qu’un fournisseur de conteneurs Windows PowerShell ne peut être utilisé que lorsqu’il y a un conteneur (sans conteneurs imbriqués) contenant des éléments. S’il existe des conteneurs imbriqués, alors vous devez implémenter un fournisseur de navigation Windows PowerShell. Pour plus d’informations sur la mise en œuvre du fournisseur de navigation Windows PowerShell, voir Créer un fournisseur de navigation Windows PowerShell.
Note
Vous pouvez télécharger le fichier source C# (AccessDBSampleProvider04.cs) de ce fournisseur en utilisant le Microsoft Windows Software Development Kit for 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 <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 de conteneurs Windows PowerShell décrit ici définit la base de données comme son unique conteneur, les tables et lignes de la base de données étant définies comme des éléments du 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éfinition d’une classe de fournisseur de conteneurs Windows PowerShell
Un fournisseur de conteneurs Windows PowerShell doit définir une classe .NET dérivée 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
Remarquez 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, aucune fonctionnalité spécifique à Windows PowerShell n’est ajoutée.
Définition de la fonctionnalité de base
Comme décrit dans Designing Your Windows PowerShell Provider, la classe System.Management.Automation.Provider.ContainerCmdletProvider dérive de plusieurs autres classes qui offraient différentes fonctionnalités de fournisseurs. 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 à chaque session et de libérer les ressources utilisées par le fournisseur, voir Créer un fournisseur Windows PowerShell 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, le fournisseur doit 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.
Récupération des objets enfants
Pour récupérer un élément enfant, le fournisseur de conteneurs PowerShell Windows doit passer outre la méthode System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* afin de prendre en charge les appels depuis le Get-ChildItem cmdlet. Cette méthode récupère les éléments enfants du magasin de données et les écrit dans le pipeline sous forme d’objets. Si le recurse paramètre du cmdlet est spécifié, la méthode récupère tous les enfants quel que soit leur niveau. Si le recurse paramètre n’est pas spécifié, la méthode ne récupère qu’un seul niveau d’enfants.
Voici l’implémentation de la méthode System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* pour ce fournisseur. Remarquez que cette méthode récupère les éléments enfants dans toutes les tables de la base de données lorsque le chemin indique la base de données Access, et récupère les éléments enfants dans les 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
Choses à retenir concernant la mise en œuvre de GetChildItems
Les conditions suivantes peuvent s’appliquer à votre implémentation de System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* :
Lors de la définition de la classe fournisseur, un fournisseur de conteneurs Windows PowerShell peut déclarer les capacités du fournisseur ExpandWildcards, Filtrer, Inclure ou Exclure, de l’énumération System.Management.Automation.Provider.ProviderCapabilities . Dans ces cas, la mise en œuvre de la méthode System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* doit s’assurer que le chemin transmis à la méthode répond aux exigences des capacités spécifiées. Pour cela, 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* propriétés.
La mise en œuvre de cette méthode doit prendre en compte toute forme d’accès à l’élément qui pourrait rendre l’élément visible à l’utilisateur. Par exemple, si un utilisateur a un accès en écriture à un fichier via le fournisseur du système de fichiers (fourni par Windows PowerShell), mais pas 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 du temps. Vous pouvez concevoir votre fournisseur pour qu’il écrive les éléments en utilisant la méthode System.Management.Automation.Provider.CmdletProvider.WriteItemObject* un par un. Cette technique présentera 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écursion infinie lorsqu’il y a des liens circulaires, et autres. Une exception de terminaison appropriée doit être lancée pour refléter une telle condition.
Attacher des paramètres dynamiques au Get-ChildItem cmdlet
Parfois, le Get-ChildItem cmdlet qui appelle System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* nécessite des paramètres supplémentaires spécifiés dynamiquement à 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 sur le chemin indiqué et renvoie 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 . L’exécution PowerShell de Windows utilise l’objet retourné pour ajouter les paramètres au Get-ChildItem cmdlet.
Ce fournisseur de conteneurs 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ération des noms d’objets enfants
Pour récupérer les noms des éléments enfants, le fournisseur de conteneurs PowerShell Windows doit passer outre la méthode System.Management.Automation.Provider.ContainerCmdletProvider.GetChildNames* afin de supporter les appels depuis le Get-ChildItem cmdlet lorsque son Name paramètre est spécifié. Cette méthode récupère les noms des éléments enfants pour le chemin spécifié ou les noms d’éléments enfants pour tous les conteneurs si le returnAllContainers paramètre du cmdlet est spécifié. Un nom d’enfant est la partie feuille d’un chemin. Par exemple, le nom enfant du chemin C:\windows\system32\abc.dll est «abc.dll». Le nom enfant du répertoire C :\windows\system32 est « system32 ».
Voici la mise en œuvre de la méthode System.Management.Automation.Provider.ContainerCmdletProvider.GetChildNames* pour ce fournisseur. Remarquez que la méthode récupère les noms des tables si le chemin spécifié indique la base de données Access (disque) et les numéros de lignes 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
Choses à retenir concernant la mise en œuvre de GetChildNames
Les conditions suivantes peuvent s’appliquer à votre implémentation de System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* :
Lors de la définition de la classe fournisseur, un fournisseur de conteneurs Windows PowerShell peut déclarer les capacités du fournisseur ExpandWildcards, Filtrer, Inclure ou Exclure, de l’énumération System.Management.Automation.Provider.ProviderCapabilities . Dans ces cas, la mise en œuvre de la méthode System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* doit s’assurer que le chemin transmis à la méthode répond aux exigences des capacités spécifiées. Pour cela, 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* propriétés.
Note
Une exception à cette règle se produit lorsque le
returnAllContainersparamètre du cmdlet est spécifié. Dans ce cas, la méthode doit récupérer tout nom enfant pour un conteneur, même s’il ne correspond pas aux valeurs des propriétés System.Management.Automation.Provider.CmdletProvider*, System.Management.Automation.Provider.CmdletProvider.Include*, ou System.Management.Automation.Provider.CmdletProvider.Exclude* .Par défaut, les contournements de cette méthode ne doivent pas récupérer les noms d’objets généralement cachés à 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 requise.
Votre implémentation de System.Management.Automation.Provider.ContainerCmdletProvider.GetChildNames* est responsable de prévenir la récursion infinie lorsqu’il y a des liens circulaires, et autres. Une exception de terminaison appropriée doit être lancée pour refléter une telle condition.
Attacher des paramètres dynamiques au Get-ChildItem cmdlet (nom)
Parfois, le Get-ChildItem cmdlet (avec le Name paramètre) nécessite des paramètres supplémentaires spécifiés dynamiquement à 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 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-ChildItem 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.
Renommage des objets
Pour renommer un élément, un fournisseur de conteneurs Windows PowerShell doit passer outre la méthode System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem* afin de supporter les appels depuis le Rename-Item cmdlet. Cette méthode modifie le nom de l’élément sur le chemin spécifié pour le nouveau nom fourni. Le nouveau nom doit toujours être relatif à l’élément parent (conteneur).
Ce fournisseur ne supprime pas la méthode System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem* . Cependant, voici l’implémentation par défaut.
Choses à retenir concernant la mise en œuvre de RenameItem
Les conditions suivantes peuvent s’appliquer à votre implémentation de System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem* :
Lors de la définition de la classe fournisseur, un fournisseur de conteneurs Windows PowerShell peut déclarer les capacités du fournisseur ExpandWildcards, Filtrer, Inclure ou Exclure, de l’énumération System.Management.Automation.Provider.ProviderCapabilities . Dans ces cas, la mise en œuvre de la méthode System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* doit s’assurer que le chemin transmis à la méthode répond aux exigences des capacités spécifiées. Pour cela, 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* propriétés.
La méthode System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem* est destinée uniquement à la modification du nom d’un article, et non aux opérations de déplacement. Votre implémentation de la méthode devrait écrire une erreur si le
newNameparamètre contient des séparateurs de chemin, ou pourrait autrement faire changer l’élément de son emplacement parent.Par défaut, les overries de cette méthode ne doivent pas renommer les objets à moins que la propriété System.Management.Automation.Provider.CmdletProvider.Force * ne soit spécifiée. Si le chemin spécifié indique un conteneur, la propriété System.Management.Automation.Provider.CmdletProvider.Force* n’est pas requise.
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’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 d’état système est effectué, par exemple le renommage de fichiers. System.Management.Automation.Provider.CmdletProvider.ShouldProcess envoie le nom de la ressource à changer à l’utilisateur, le runtime 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é.
Après les retours
truede l’appel vers System.Management.Automation.Provider.CmdletProvider.ShouldProcess, 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, un message de confirmation, à l’utilisateur pour permettre un retour supplémentaire afin de savoir si l’opération doit être poursuivie. Un fournisseur doit appeler System.Management.Automation.Provider.CmdletProvider.ShouldContinue comme vérification supplémentaire pour détecter des modifications potentiellement dangereuses du système.
Attacher des paramètres dynamiques au Rename-Item cmdlet
Parfois, le Rename-Item cmdlet nécessite des paramètres supplémentaires spécifiés dynamiquement à 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 sur le chemin indiqué et renvoie 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 . L’exécution PowerShell de Windows utilise l’objet retourné pour ajouter les paramètres au Rename-Item cmdlet.
Ce fournisseur de conteneurs n’implémente pas cette méthode. Cependant, le code suivant est l’implémentation par défaut de cette méthode.
Création de nouveaux objets
Pour créer de nouveaux éléments, un fournisseur de conteneurs doit implémenter la méthode System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* pour supporter les appels depuis le New-Item cmdlet. Cette méthode crée un élément de données situé sur le chemin spécifié. Le type paramètre du cmdlet contient le type défini par le fournisseur pour le nouvel élément. Par exemple, le fournisseur du système de fichiers utilise un type paramètre avec la valeur « fichier » ou « répertoire ». Le newItemValue paramètre du cmdlet spécifie une valeur spécifique au fournisseur pour le nouvel élément.
Voici la mise en œuvre 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];
Points à retenir concernant la mise en œuvre 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 insensible à la casse de la chaîne passée dans le
typeparamètre. Cela devrait aussi permettre les correspondances les moins ambiguës. Par exemple, pour les types « file » et « directory », seule la première lettre est requise pour clarifier l’ambiguïté. Si letypeparamètre indique un type que votre fournisseur ne peut pas créer, la méthode System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* doit écrire une ArgumentException avec un message indiquant les types que le fournisseur peut créer.Pour ce
newItemValueparamètre, il est recommandé d’accepter au minimum des chaînes de caractères la méthode System.Management.Automation.Provider.Provider.ContainerCmdletProvider.NewItem* pour l’implémentation de la méthode System.Management.Automation.Provider.ContainerCmdletProvider.NewItem * afin d’accepter au minimum les chaînes de caractères. 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. 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 désiré.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’effectuer toute modification du magasin de données. Après que l’appel à System.Management.Automation.Provider.CmdletProvider.ShouldProcess revienne vrai, 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 pour les modifications potentiellement dangereuses du système.
Attacher des paramètres dynamiques au New-Item cmdlet
Parfois, le New-Item cmdlet nécessite des paramètres supplémentaires spécifiés dynamiquement à l’exécution. Pour fournir ces paramètres dynamiques, le fournisseur du conteneur 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 sur le chemin indiqué et renvoie 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 . L’exécution PowerShell de Windows utilise l’objet retourné pour ajouter les paramètres au New-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.
Suppression des éléments
Pour supprimer des éléments, le fournisseur Windows PowerShell doit passer outre la méthode System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem* afin de supporter les appels depuis le Remove-Item cmdlet. Cette méthode supprime un élément du stockage de données sur le chemin spécifié. Si le recurse paramètre du Remove-Item cmdlet est défini à true, la méthode supprime tous les éléments enfants, quel que soit leur niveau. Si le paramètre est fixé à false, la méthode ne retire qu’un seul élément sur le chemin spécifié.
Ce fournisseur ne supporte pas le retrait d’articles. Cependant, le code suivant est l’implémentation par défaut de System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem*.
Choses à retenir concernant la mise en œuvre de RemoveItem
Les conditions suivantes peuvent s’appliquer à votre implémentation de System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* :
Lors de la définition de la classe fournisseur, un fournisseur de conteneurs Windows PowerShell peut déclarer les capacités du fournisseur ExpandWildcards, Filtrer, Inclure ou Exclure, de l’énumération System.Management.Automation.Provider.ProviderCapabilities . Dans ces cas, la mise en œuvre de la méthode System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* doit s’assurer que le chemin transmis à la méthode répond aux exigences des capacités spécifiées. Pour cela, 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* propriétés.
Par défaut, les dérogations de cette méthode ne devraient pas supprimer les objets à moins que la propriété System.Management.Automation.Provider.CmdletProvider.Force* ne soit réglée sur true. Si le chemin spécifié indique un conteneur, la propriété System.Management.Automation.Provider.CmdletProvider.Force* n’est pas requise.
Votre implémentation de System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem* est responsable de la prévention de la récursion infinie lorsqu’il y a des liens circulaires, et autres. Une exception de terminaison appropriée doit être lancé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’effectuer toute modification dans le magasin de données. Après le retour
truede l’appel à System.Management.Automation.Provider.CmdletProvider.ShouldProcess , 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 pour les modifications potentiellement dangereuses du système.
Attacher des paramètres dynamiques au Remove-Item cmdlet
Parfois, le Remove-Item cmdlet nécessite des paramètres supplémentaires spécifiés dynamiquement à l’exécution. Pour fournir ces paramètres dynamiques, le fournisseur du conteneur 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 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 Remove-Item cmdlet.
Ce fournisseur de conteneurs n’implémente pas cette méthode. Cependant, le code suivant est l’implémentation par défaut de System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItemDynamicParameters*.
Requête pour les éléments enfants
Pour vérifier si des éléments enfants existent sur le chemin spécifié, le fournisseur de conteneurs PowerShell de Windows doit écraser la méthode System.Management.Automation.Provider.ContainerCmdletProvider.HasChildItems* . Cette méthode revient true si l’élément a des enfants, et false sinon. Pour un chemin nul ou vide, la méthode considère tous les éléments du magasin de données comme étant des enfants et renvoie true.
Voici la dérogation pour la méthode System.Management.Automation.Provider.ContainerCmdletProvider.HasChildItems* . S’il y a plus de deux parties de chemin créées par la méthode d’aide ChunkPath, la méthode retourne false, puisque seuls 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, voir la méthode ChunkPath expliquée dans Créer un fournisseur d’éléments PowerShell Windows.
protected override bool HasChildItems( string path )
{
return false;
} // HasChildItems
ErrorCategory.InvalidOperation, tableName));
}
return results;
Choses à retenir concernant la mise en œuvre de HasChildItems
Les conditions suivantes peuvent s’appliquer à votre implémentation de System.Management.Automation.Provider.ContainerCmdletProvider.HasChildItems* :
- Si le fournisseur du conteneur expose une racine contenant des points de montage intéressants, l’implémentation de la méthode System.Management.Automation.Provider.ContainerCmdletProvider.HasChildItems* devrait revenir
truelorsqu’une chaîne nulle ou vide est passée pour le chemin.
Copie des objets
Pour copier les éléments, le fournisseur du conteneur doit implémenter la méthode System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem pour supporter les appels depuis le Copy-Item cmdlet. Cette méthode copie un élément de données de l’emplacement indiqué par le path paramètre du cmdlet à l’emplacement indiqué par le copyPath paramètre. Si le recurse paramètre est spécifié, la méthode copie tous les sous-conteneurs. Si le paramètre n’est pas spécifié, la méthode ne copie qu’un seul niveau d’éléments.
Ce fournisseur ne met pas en œuvre cette méthode. Cependant, le code suivant est l’implémentation par défaut de System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem.
Choses à retenir concernant la mise en œuvre de CopyItem
Les conditions suivantes peuvent s’appliquer à votre implémentation de System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem :
Lors de la définition de la classe fournisseur, un fournisseur de conteneurs Windows PowerShell peut déclarer les capacités du fournisseur ExpandWildcards, Filtrer, Inclure ou Exclure, de l’énumération System.Management.Automation.Provider.ProviderCapabilities . Dans ces cas, la mise en œuvre de la méthode System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* doit s’assurer que le chemin transmis à la méthode répond aux exigences des capacités spécifiées. Pour cela, 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* propriétés.
Par défaut, les dérogations de cette méthode ne devraient pas copier 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:\abc.txt existant à moins que la propriété System.Management.Automation.Provider.CmdletProvider.Force* ne soit définie àtrue. Si le chemin spécifié dans lecopyPathparamètre existe et indique un conteneur, la propriété System.Management.Automation.Provider.CmdletProvider.Force* n’est pas requise. Dans ce cas, System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem doit copier l’élément indiqué par lepathparamètre dans le conteneur indiqué par cecopyPathparamètre en tant qu’enfant.Votre implémentation de System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem est responsable d’empêcher la récursivité infinie lorsqu’il y a des liens circulaires, et autres. Une exception de terminaison appropriée doit être lancé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’effectuer toute modification du stockage de données. Après que l’appel à System.Management.Automation.Provider.CmdletProvider.ShouldProcess revienne à « true, » la méthode System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem doit appeler la méthode System.Management.Automation.Provider.CmdletProvider comme vérification supplémentaire pour les modifications potentiellement dangereuses du système. Pour plus d’informations sur l’appel de ces méthodes, voir Renommer les éléments.
Attacher des paramètres dynamiques au Copy-Item cmdlet
Parfois, le Copy-Item cmdlet nécessite des paramètres supplémentaires spécifiés dynamiquement à l’exécution. Pour fournir ces paramètres dynamiques, le fournisseur de conteneurs PowerShell Windows 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 sur le chemin indiqué et renvoie 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 . L’exécution PowerShell de Windows utilise l’objet retourné pour ajouter les paramètres au Copy-Item cmdlet.
Ce fournisseur ne met pas en œuvre cette méthode. Cependant, le code suivant est l’implémentation par défaut de System.Management.Automation.Provider.ContainerCmdletProvider.CopyItemDynamicParameters*.
Exemple de code
Pour un code d’exemple complet, voir AccessDbProviderSample04 Code Example.
Construire le fournisseur Windows PowerShell
Voir comment enregistrer les commandants, les fournisseurs et les applications hôtes.
Test du fournisseur Windows PowerShell
Lorsque votre fournisseur Windows PowerShell est enregistré auprès de Windows PowerShell, vous pouvez le tester en exécutant les cmdlets supportés en ligne de commande. Sachez que l’exemple suivant utilise une base de données Access fictive.
Exécutez le
Get-ChildItemcmdlet pour récupérer la liste des éléments enfants à partir d’une table Clients dans la base de données Access.Get-ChildItem mydb:customersLa sortie suivante apparaît.
PSPath : AccessDB::customers PSDrive : mydb PSProvider : System.Management.Automation.ProviderInfo PSIsContainer : True Data : System.Data.DataRow Name : Customers RowCount : 91 Columns :Exécutez à nouveau le
Get-ChildItemcmdlet pour récupérer les données d’une table.(Get-ChildItem mydb:customers).DataLa sortie suivante apparaît.
TABLE_CAT : C:\PS\northwind TABLE_SCHEM : TABLE_NAME : Customers TABLE_TYPE : TABLE REMARKS :Utilisez maintenant le
Get-Itemcmdlet pour récupérer les éléments à la rangée 0 dans la table de données.Get-Item mydb:\customers\0La sortie suivante apparaît.
PSPath : AccessDB::customers\0 PSDrive : mydb PSProvider : System.Management.Automation.ProviderInfo PSIsContainer : False Data : System.Data.DataRow RowNumber : 0Réutiliser
Get-Itempour récupérer les données des éléments de la ligne 0.(Get-Item mydb:\customers\0).DataLa sortie suivante apparaît.
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-0101Utilisez maintenant le
New-Itemcmdlet pour ajouter une ligne à une table existante. LePathparamètre spécifie le chemin complet vers la ligne, et doit indiquer un numéro de ligne supérieur au nombre existant de lignes dans le tableau. LeTypeparamètre indiqueRowde spécifier ce type d’élément à ajouter. Enfin, leValueparamètre spécifie une liste délimitée par des virgules des valeurs de colonnes 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 du fonctionnement du nouvel élément comme suit.
PS mydb:\> cd Customers PS mydb:\Customers> (Get-Item 3).DataLa sortie suivante apparaît.
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
Concevoir votre fournisseur Windows PowerShell
Implémentation d’un fournisseur Windows PowerShell d’élément
Implémentation d’un fournisseur PowerShell Windows pour la navigation
Comment enregistrer des commandants, des fournisseurs et des applications hôtes