Partager via


Ajout de paramètres qui traitent l’entrée du pipeline

Une source d’entrée pour une applet de commande est un objet sur le pipeline qui provient d’une applet de commande en amont. Cette section explique comment ajouter un paramètre à l’applet de commande Get-Proc (décrite dans Création de votre première applet de commande) afin que l’applet de commande puisse traiter les objets de pipeline.

Cette applet de commande Get-Proc utilise un paramètre Name qui accepte l’entrée d’un objet de pipeline, récupère les informations de processus de l’ordinateur local en fonction des noms fournis, puis affiche des informations sur les processus sur la ligne de commande.

Définition de la classe Cmdlet

La première étape de la création de l’applet de commande consiste toujours à nommer l’applet de commande et à déclarer la classe .NET qui implémente l’applet de commande. Cette applet de commande récupère les informations de processus. Le nom du verbe choisi ici est « Get ». (Presque n’importe quelle sorte d’applet de commande capable de récupérer des informations peut traiter l’entrée de ligne de commande.) Pour plus d’informations sur les verbes d’applet de commande approuvés, consultez noms de verbes d’applet de commande.

Voici la définition de cette applet de commande Get-Proc. Les détails de cette définition sont indiqués dans Création de votre première applet de commande.

[Cmdlet(VerbsCommon.Get, "proc")]
public class GetProcCommand : Cmdlet
<Cmdlet(VerbsCommon.Get, "Proc")> _
Public Class GetProcCommand
    Inherits Cmdlet

Définition d’une entrée à partir du pipeline

Cette section explique comment définir l’entrée à partir du pipeline pour une applet de commande. Cette applet de commande Get-Proc définit une propriété qui représente le paramètre Name, comme décrit dans Ajout de paramètres qui traitent lesd’entrée de ligne de commande. (Consultez cette rubrique pour obtenir des informations générales sur la déclaration de paramètres.)

Toutefois, lorsqu’une applet de commande doit traiter l’entrée du pipeline, ses paramètres doivent être liés aux valeurs d’entrée par le runtime Windows PowerShell. Pour ce faire, vous devez ajouter le mot clé ValueFromPipeline ou ajouter le mot clé ValueFromPipelineByProperty à la déclaration d’attribut System.Management.Automation.ParameterAttribute. Spécifiez le mot clé ValueFromPipeline si l’applet de commande accède à l’objet d’entrée complet. Spécifiez l'ValueFromPipelineByProperty si l’applet de commande accède uniquement à une propriété de l’objet.

Voici la déclaration de paramètre pour le paramètre Name de cette applet de commande Get-Proc qui accepte l’entrée de pipeline.

[Parameter(
   Position = 0,
   ValueFromPipeline = true,
   ValueFromPipelineByPropertyName = true)]
[ValidateNotNullOrEmpty]
public string[] Name
{
   get { return this.processNames; }
   set { this.processNames = value; }
}
<Parameter(Position:=0, ValueFromPipeline:=True, _
ValueFromPipelineByPropertyName:=True), ValidateNotNullOrEmpty()> _
Public Property Name() As String()
    Get
        Return processNames
    End Get

    Set(ByVal value As String())
        processNames = value
    End Set

End Property

La déclaration précédente définit le mot clé ValueFromPipeline sur true afin que le runtime Windows PowerShell lie le paramètre à l’objet entrant si l’objet est le même type que le paramètre, ou s’il peut être coéré au même type. Le mot clé ValueFromPipelineByPropertyName est également défini sur true afin que le runtime Windows PowerShell vérifie l’objet entrant pour une propriété Name. Si l’objet entrant possède une telle propriété, le runtime lie le paramètre Name à la propriété Name de l’objet entrant.

Remarque

Le paramètre du mot clé d’attribut ValueFromPipeline pour un paramètre est prioritaire sur le paramètre du mot clé ValueFromPipelineByPropertyName.

Substitution d’une méthode de traitement d’entrée

Si votre applet de commande doit gérer l’entrée de pipeline, elle doit remplacer les méthodes de traitement d’entrée appropriées. Les méthodes de traitement d’entrée de base sont introduites dans Création de votre première applet de commande.

Cette applet de commande Get-Proc remplace la méthode System.Management.Automation.Cmdlet.ProcessRecord pour gérer l’entrée de paramètre Name fournie par l’utilisateur ou un script. Cette méthode obtient les processus pour chaque nom de processus demandé ou tous les processus si aucun nom n’est fourni. Notez que dans System.Management.Automation.Cmdlet.ProcessRecord, l’appel à WriteObject(System.Object,System.Boolean) est le mécanisme de sortie permettant d’envoyer des objets de sortie au pipeline. Le deuxième paramètre de cet appel, enumerateCollection, est défini sur true pour indiquer au runtime Windows PowerShell d’énumérer le tableau d’objets de processus et d’écrire un processus à la fois dans la ligne de commande.

protected override void ProcessRecord()
{
  // If no process names are passed to the cmdlet, get all processes.
  if (processNames == null)
  {
      // Write the processes to the pipeline making them available
      // to the next cmdlet. The second argument of this call tells
      // PowerShell to enumerate the array, and send one process at a
      // time to the pipeline.
      WriteObject(Process.GetProcesses(), true);
  }
  else
  {
    // If process names are passed to the cmdlet, get and write
    // the associated processes.
    foreach (string name in processNames)
    {
      WriteObject(Process.GetProcessesByName(name), true);
    } // End foreach (string name...).
  }
}
Protected Overrides Sub ProcessRecord()
    Dim processes As Process()

    '/ If no process names are passed to the cmdlet, get all processes.
    If processNames Is Nothing Then
        processes = Process.GetProcesses()
    Else

        '/ If process names are specified, write the processes to the
        '/ pipeline to display them or make them available to the next cmdlet.
        For Each name As String In processNames
            '/ The second parameter of this call tells PowerShell to enumerate the
            '/ array, and send one process at a time to the pipeline.
            WriteObject(Process.GetProcessesByName(name), True)
        Next
    End If

End Sub 'ProcessRecord

Exemple de code

Pour obtenir l’exemple de code C# complet, consultez Exemple GetProcessSample03.

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, elle doit être inscrite 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, testez-la en l’exécutant sur la ligne de commande. Par exemple, testez le code de l’exemple d’applet de commande. 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.

  • À l’invite Windows PowerShell, entrez les commandes suivantes pour récupérer les noms de processus via le pipeline.

    PS> type ProcessNames | Get-Proc
    

    La sortie suivante s’affiche.

    Handles  NPM(K)  PM(K)   WS(K)  VS(M)  CPU(s)    Id  ProcessName
    -------  ------  -----   ----- -----   ------    --  -----------
        809      21  40856    4448    147    9.50  2288  iexplore
        737      21  26036   16348    144   22.03  3860  iexplore
         39       2   1024     388     30    0.08  3396  notepad
       3927      62  71836   26984    467  195.19  1848  OUTLOOK
    
  • Entrez les lignes suivantes pour obtenir les objets de processus qui ont une propriété Name à partir des processus appelés « IEXPLORE ». Cet exemple utilise l’applet de commande Get-Process (fournie par Windows PowerShell) comme commande en amont pour récupérer les processus « IEXPLORE ».

    PS> Get-Process iexplore | Get-Proc
    

    La sortie suivante s’affiche.

    Handles  NPM(K)  PM(K)   WS(K)  VS(M)  CPU(s)    Id  ProcessName
    -------  ------  -----   ----- -----   ------    --  -----------
        801      21  40720    6544    142    9.52  2288  iexplore
        726      21  25872   16652    138   22.09  3860  iexplore
        801      21  40720    6544    142    9.52  2288  iexplore
        726      21  25872   16652    138   22.09  3860  iexplore
    

Voir aussi

Ajout de paramètres qui traitent les d’entrée de ligne de commande

création de votre premier d’applet de commande

extension des types d’objets et de mise en forme

Comment inscrire des applets de commande, des fournisseurs et des applications hôtes

de référence Windows PowerShell

Exemples d’applets de commande