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.
Cette section explique comment créer une applet de commande qui récupère des informations à partir de l’ordinateur local sans utiliser de paramètres, puis écrit les informations dans le pipeline. L’applet de commande décrite ici est une applet de commande Get-Proc qui récupère des informations sur les processus de l’ordinateur local, puis affiche ces informations sur la ligne de commande.
Remarque
N’oubliez pas que lors de l’écriture d’applets de commande, les assemblys de référence Windows PowerShell sont téléchargés sur disque (par défaut, à l’adresse C :\Program Files\Reference Assemblys\Microsoft\WindowsPowerShell®\v1.0). Ils ne sont pas installés dans le Global Assembly Cache (GAC).
Nommage de l’applet de commande
Un nom d’applet de commande se compose d’un verbe qui indique l’action effectuée par l’applet de commande et un nom qui indique les éléments sur utilisant l’applet de commande. Étant donné que cet exemple Get-Proc applet de commande récupère des objets de processus, il utilise le verbe « Get », défini par l’énumération System.Management.Automation.VerbsCommon et le nom « Proc » pour indiquer que l’applet de commande fonctionne sur les éléments de processus.
Lorsque vous nommez des applets de commande, n’utilisez aucun des caractères suivants : # , () {} [] & - /\ $ ; : " '<> | ? @ ` .
Choix d’un nom
Vous devez choisir un nom spécifique. Il est préférable d’utiliser un nom singulier précédé d’une version abrégée du nom du produit. Un exemple de nom d’applet de commande de ce type est «Get-SQLServer».
Choix d’un verbe
Vous devez utiliser un verbe à partir de l’ensemble de noms de verbes d’applet de commande approuvés. Pour plus d’informations sur les verbes d’applet de commande approuvés, consultez noms de verbes d’applet de commande.
Définition de la classe Cmdlet
Une fois que vous avez choisi un nom d’applet de commande, définissez une classe .NET pour implémenter l’applet de commande. Voici la définition de classe pour cet exemple d’applet de commande Get-Proc :
[Cmdlet(VerbsCommon.Get, "Proc")]
public class GetProcCommand : Cmdlet
<Cmdlet(VerbsCommon.Get, "Proc")> _
Public Class GetProcCommand
Inherits Cmdlet
Notez qu’avant la définition de classe, l’attribut System.Management.Automation.CmdletAttribute, avec la syntaxe [Cmdlet(verb, noun, ...)], est utilisé pour identifier cette classe en tant qu’applet de commande. Il s’agit du seul attribut requis pour toutes les applets de commande et permet au runtime Windows PowerShell de les appeler correctement. Vous pouvez définir des mots clés d’attribut pour déclarer davantage la classe si nécessaire. N’oubliez pas que la déclaration d’attribut de notre exemple de classe GetProcCommand déclare uniquement le nom et les noms de verbes de l’applet de commande Get-Proc.
Remarque
Pour toutes les classes d’attributs Windows PowerShell, les mots clés que vous pouvez définir correspondent aux propriétés de la classe d’attributs.
Lorsque vous nommez la classe de l’applet de commande, il est recommandé de refléter le nom de l’applet de commande dans le nom de la classe. Pour ce faire, utilisez le formulaire « VerbNounCommand » et remplacez « Verb » et « Noun » par le verbe et le nom utilisés dans le nom de l’applet de commande. Comme indiqué dans la définition de classe précédente, l’exemple d’applet de commande Get-Proc définit une classe appelée GetProcCommand, qui dérive de la classe de base System.Management.Automation.Cmdlet.
Important
Si vous souhaitez définir une applet de commande qui accède directement au runtime Windows PowerShell, votre classe .NET doit dériver de la classe de base System.Management.Automation.PSCmdlet. Pour plus d’informations sur cette classe, consultez Création d’une applet de commande qui définit des jeux de paramètres.
Remarque
La classe d’une applet de commande doit être explicitement marquée comme publique. Les classes qui ne sont pas marquées comme publiques sont par défaut internes et qui ne sont pas trouvées par le runtime Windows PowerShell.
Windows PowerShell utilise l’espace de noms Microsoft.PowerShell.Commands pour ses classes d’applets de commande. Il est recommandé de placer vos classes d’applet de commande dans un espace de noms Commands de votre espace de noms d’API, par exemple, xxx.PS. Commandes.
Substitution d’une méthode de traitement d’entrée
La classe System.Management.Automation.Cmdlet fournit trois méthodes de traitement d’entrée principales, dont au moins l’une de vos applets de commande doit être remplacée. Pour plus d’informations sur la façon dont Windows PowerShell traite les enregistrements, consultez Fonctionnement de Windows PowerShell.
Pour tous les types d’entrée, le runtime Windows PowerShell appelle System.Management.Automation.Cmdlet.BeginProcessing pour activer le traitement. Si votre applet de commande doit effectuer un prétraitement ou une configuration, elle peut effectuer cette opération en substituant cette méthode.
Remarque
Windows PowerShell utilise le terme « enregistrement » pour décrire l’ensemble de valeurs de paramètre fournies lorsqu’une applet de commande est appelée.
Si votre applet de commande accepte l’entrée de pipeline, elle doit remplacer la méthode System.Management.Automation.Cmdlet.ProcessRecord, et éventuellement la méthode System.Management.Automation.Cmdlet.EndProcessing. Par exemple, une applet de commande peut remplacer les deux méthodes si elle rassemble toutes les entrées à l’aide de System.Management.Automation.Cmdlet.ProcessRecord, puis fonctionne sur l’entrée dans son ensemble plutôt qu’un élément à la fois, comme l’applet de commande Sort-Object.
Si votre applet de commande ne prend pas d’entrée de pipeline, elle doit remplacer la méthode System.Management.Automation.Cmdlet.EndProcessing. N’oubliez pas que cette méthode est fréquemment utilisée à la place de System.Management.Automation.Cmdlet.BeginProcessing lorsque l’applet de commande ne peut pas fonctionner sur un élément à la fois, comme c’est le cas pour une applet de commande de tri.
Étant donné que cet exemple d’applet de commande Get-Proc doit recevoir une entrée de pipeline, il remplace la méthode System.Management.Automation.Cmdlet.ProcessRecord et utilise les implémentations par défaut pour System.Management.Automation.Cmdlet.BeginProcessing et System.Management.Automation.Cmdlet.EndProcessing. La substitution System.Management.Automation.Cmdlet.ProcessRecord récupère les processus et les écrit dans la ligne de commande à l’aide de la méthode System.Management.Automation.Cmdlet.WriteObject.
protected override void ProcessRecord()
{
// Get the current processes
Process[] processes = Process.GetProcesses();
// Write the processes to the pipeline making them available
// to the next cmdlet. The second parameter of this call tells
// PowerShell to enumerate the array, and send one process at a
// time to the pipeline.
WriteObject(processes, true);
}
Protected Overrides Sub ProcessRecord()
'/ Get the current processes.
Dim processes As Process()
processes = Process.GetProcesses()
'/ Write the processes to the pipeline making them available
'/ to the next cmdlet. The second parameter of this call tells
'/ PowerShell to enumerate the array, and send one process at a
'/ time to the pipeline.
WriteObject(processes, True)
End Sub 'ProcessRecord
Éléments à mémoriser sur le traitement d’entrée
La source par défaut de l’entrée est un objet explicite (par exemple, une chaîne) fourni par l’utilisateur sur la ligne de commande. Pour plus d’informations, consultez Création d’une applet de commande pour traiter l’entrée de ligne de commande.
Une méthode de traitement d’entrée peut également recevoir une entrée de l’objet de sortie d’une applet de commande en amont sur le pipeline. Pour plus d’informations, consultez Création d’une applet de commande pour traiter lesd’entrée de pipeline. N’oubliez pas que votre applet de commande peut recevoir une entrée à partir d’une combinaison de sources de ligne de commande et de pipeline.
L’applet de commande en aval peut ne pas retourner longtemps, ou pas du tout. Pour cette raison, la méthode de traitement d’entrée de votre applet de commande ne doit pas contenir de verrous pendant les appels à System.Management.Automation.Cmdlet.WriteObject, en particulier les verrous pour lesquels l’étendue s’étend au-delà de l’instance d’applet de commande.
Important
Les applets de commande ne doivent jamais appeler System.Console.Writeline* ou son équivalent.
- Votre applet de commande peut avoir des variables objet à nettoyer lorsqu’elle est terminée (par exemple, si elle ouvre un handle de fichier dans la méthode System.Management.Automation.Cmdlet.BeginProcessing et conserve le handle ouvert pour une utilisation par System.Management.Automation.Cmdlet.ProcessRecord). Il est important de se rappeler que le runtime Windows PowerShell n’appelle pas toujours la méthode System.Management.Automation.Cmdlet.EndProcessing, qui doit effectuer le nettoyage des objets.
Par exemple, System.Management.Automation.Cmdlet.EndProcessing peut ne pas être appelée si l’applet de commande est annulée à mi-chemin ou si une erreur de fin se produit dans une partie de l’applet de commande. Par conséquent, une applet de commande qui nécessite le nettoyage des objets doit implémenter le modèle de System.IDisposable complet, y compris le finaliseur, afin que le runtime puisse appeler à la fois System.Management.Automation.Cmdlet.EndProcessing et System.IDisposable.Dispose* à la fin du traitement.
Exemple de code
Pour obtenir l’exemple de code C# complet, consultez Exemple getProcessSample01.
Définition des types d’objets et de la mise en forme
Windows PowerShell transmet des informations entre les applets de commande à l’aide d’objets .NET. Par conséquent, une applet de commande peut avoir besoin de définir son propre type, ou l’applet de commande peut avoir besoin d’étendre un type existant fourni par une autre applet de commande. Pour plus d’informations sur la définition de nouveaux types ou l’extension de types existants, consultez Extension des types d’objets et de la mise en forme.
Génération de l’applet de commande
Après avoir implémenté une applet de commande, vous devez l’inscrire auprès de Windows PowerShell via un composant logiciel enfichable Windows PowerShell. Pour plus d’informations sur l’inscription d’applets de commande, consultez Guide pratique pour inscrire des applets de commande, des fournisseurs et des applications hôtes.
Test de l’applet de commande
Lorsque votre applet de commande a été inscrite auprès de Windows PowerShell, vous pouvez la tester en l’exécutant sur la ligne de commande. Le code de notre exemple d’applet de commande Get-Proc est petit, mais il utilise toujours le runtime Windows PowerShell et un objet .NET existant, ce qui suffit pour le rendre utile. Testons-le pour mieux comprendre ce que Get-Proc pouvez faire et comment sa sortie peut être utilisée. Pour plus d’informations sur l’utilisation d’applets de commande à partir de la ligne de commande, consultez la Prise en main de Windows PowerShell.
Démarrez Windows PowerShell et obtenez les processus actuels en cours d’exécution sur l’ordinateur.
Get-ProcLa sortie suivante s’affiche.
Handles NPM(K) PM(K) WS(K) VS(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ---------- 254 7 7664 12048 66 173.75 1200 QCTRAY 32 2 1372 2628 31 0.04 1860 DLG 271 6 1216 3688 33 0.03 3816 lg 27 2 560 1920 24 0.01 1768 TpScrex ...Affectez une variable aux résultats de l’applet de commande pour faciliter la manipulation.
$p=Get-ProcObtenez le nombre de processus.
$p.LengthLa sortie suivante s’affiche.
63Récupérez un processus spécifique.
$p[6]La sortie suivante s’affiche.
Handles NPM(K) PM(K) WS(K) VS(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 1033 3 2400 3336 35 0.53 1588 rundll32Obtenez l’heure de début de ce processus.
$p[6].StartTimeLa sortie suivante s’affiche.
Tuesday, July 26, 2005 9:34:15 AM$p[6].StartTime.DayOfYear207Obtenez les processus pour lesquels le nombre de handles est supérieur à 500 et triez le résultat.
$p | Where-Object {$_.HandleCount -gt 500 } | Sort-Object HandleCountLa sortie suivante s’affiche.
Handles NPM(K) PM(K) WS(K) VS(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ---------- 568 14 2164 4972 39 5.55 824 svchost 716 7 2080 5332 28 25.38 468 csrss 761 21 33060 56608 440 393.56 3300 WINWORD 791 71 7412 4540 59 3.31 492 winlogon ...Utilisez l’applet de commande
Get-Memberpour répertorier les propriétés disponibles pour chaque processus.$p | Get-Member -MemberType PropertyTypeName: System.Diagnostics.ProcessLa sortie suivante s’affiche.
Name MemberType Definition ---- ---------- ---------- BasePriority Property System.Int32 BasePriority {get;} Container Property System.ComponentModel.IContainer Conta... EnableRaisingEvents Property System.Boolean EnableRaisingEvents {ge... ...
Voir aussi
création d’une applet de commande pour traiter les d’entrée de ligne de commande
création d’une applet de commande pour traiter les d’entrée de pipeline
Comment créer une applet de commande Windows PowerShell
extension des types d’objets et de mise en forme
fonctionnement de Windows PowerShell
Comment inscrire des applets de commande, des fournisseurs et des applications hôtes