Partager via


Création d’une applet de commande sans paramètre

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.

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.

  1. Démarrez Windows PowerShell et obtenez les processus actuels en cours d’exécution sur l’ordinateur.

    Get-Proc
    

    La 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
    ...
    
  2. Affectez une variable aux résultats de l’applet de commande pour faciliter la manipulation.

    $p=Get-Proc
    
  3. Obtenez le nombre de processus.

    $p.Length
    

    La sortie suivante s’affiche.

    63
    
  4. Ré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  rundll32
    
  5. Obtenez l’heure de début de ce processus.

    $p[6].StartTime
    

    La sortie suivante s’affiche.

    Tuesday, July 26, 2005 9:34:15 AM
    
    $p[6].StartTime.DayOfYear
    
    207
    
  6. Obtenez 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 HandleCount
    

    La 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
    ...
    
  7. Utilisez l’applet de commande Get-Member pour répertorier les propriétés disponibles pour chaque processus.

    $p | Get-Member -MemberType Property
    
        TypeName: System.Diagnostics.Process
    

    La 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

de référence Windows PowerShell

Exemples d’applets de commande