Partager via


Ajout de jeux de paramètres à une applet de commande

Informations sur les ensembles de paramètres

Windows PowerShell définit un jeu de paramètres en tant que groupe de paramètres qui fonctionnent ensemble. En regroupant les paramètres d’une applet de commande, vous pouvez créer une applet de commande unique qui peut modifier ses fonctionnalités en fonction du groupe de paramètres spécifié par l’utilisateur.

Un exemple d’applet de commande qui utilise deux ensembles de paramètres pour définir différentes fonctionnalités est l’applet de commande Get-EventLog fournie par Windows PowerShell. Cette applet de commande retourne des informations différentes lorsque l’utilisateur spécifie le paramètre List ou LogName. Si le paramètre LogName est spécifié, l’applet de commande retourne des informations sur les événements dans un journal des événements donné. Si le paramètre List est spécifié, l’applet de commande retourne des informations sur les fichiers journaux eux-mêmes (et non les informations d’événement qu’ils contiennent). Dans ce cas, les paramètres List et LogName identifient deux jeux de paramètres distincts.

Deux éléments importants à retenir concernant les jeux de paramètres sont que le runtime Windows PowerShell utilise un seul jeu de paramètres pour une entrée particulière, et que chaque jeu de paramètres doit avoir au moins un paramètre unique pour ce jeu de paramètres.

Pour illustrer ce dernier point, cette applet de commande Stop-Proc utilise trois jeux de paramètres : ProcessName, ProcessIdet InputObject. Chacun de ces jeux de paramètres a un paramètre qui n’est pas dans les autres jeux de paramètres. Les jeux de paramètres peuvent partager d’autres paramètres, mais l’applet de commande utilise les paramètres uniques ProcessName, ProcessIdet InputObject pour identifier l’ensemble de paramètres que le runtime Windows PowerShell doit utiliser.

Déclaration 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. Pour cette applet de commande, le verbe de cycle de vie « Stop » est utilisé, car l’applet de commande arrête les processus système. Le nom de nom « Proc » est utilisé, car l’applet de commande fonctionne sur les processus. Dans la déclaration ci-dessous, notez que le verbe et le nom de l’applet de commande sont reflétés dans le nom de la classe d’applet de commande.

Remarque

Pour plus d’informations sur les noms de verbes d’applet de commande approuvés, consultez noms de verbes d’applet de commande.

Le code suivant est la définition de classe pour cette applet de commande Stop-Proc.

[Cmdlet(VerbsLifecycle.Stop, "Proc",
        DefaultParameterSetName = "ProcessId",
        SupportsShouldProcess = true)]
public class StopProcCommand : PSCmdlet
<Cmdlet(VerbsLifecycle.Stop, "Proc", DefaultParameterSetName:="ProcessId", _
SupportsShouldProcess:=True)> _
Public Class StopProcCommand
    Inherits PSCmdlet

Déclaration des paramètres de l’applet de commande

Cette applet de commande définit trois paramètres nécessaires en entrée à l’applet de commande (ces paramètres définissent également les jeux de paramètres), ainsi qu’un paramètre Force qui gère ce que fait l’applet de commande et un paramètre PassThru qui détermine si l’applet de commande envoie un objet de sortie via le pipeline. Par défaut, cette applet de commande ne transmet pas d’objet via le pipeline. Pour plus d’informations sur ces deux derniers paramètres, consultez Création d’une applet de commande qui modifie le système.

Déclaration du paramètre Name

Ce paramètre d’entrée permet à l’utilisateur de spécifier les noms des processus à arrêter. Notez que le mot clé d’attribut ParameterSetName de l’attribut System.Management.Automation.ParameterAttribute spécifie le paramètre ProcessName défini pour ce paramètre.

[Parameter(
   Position = 0,
   ParameterSetName = "ProcessName",
   Mandatory = true,
   ValueFromPipeline = true,
   ValueFromPipelineByPropertyName = true,
   HelpMessage = "The name of one or more processes to stop. Wildcards are permitted."
)]
[Alias("ProcessName")]
public string[] Name
{
    get { return processNames; }
    set { processNames = value; }
}
private string[] processNames;
<Parameter(Position:=0, ParameterSetName:="ProcessName", _
Mandatory:=True, _
ValueFromPipeline:=True, ValueFromPipelineByPropertyName:=True, _
HelpMessage:="The name of one or more processes to stop. " & _
    "Wildcards are permitted."), [Alias]("ProcessName")> _
Public Property Name() As String()
    Get
        Return processNames
    End Get
    Set(ByVal value As String())
        processNames = value
    End Set
End Property

Private processNames() As String

Notez également que l’alias « ProcessName » est attribué à ce paramètre.

Déclaration du paramètre ID

Ce paramètre d’entrée permet à l’utilisateur de spécifier les identificateurs des processus à arrêter. Notez que le mot clé d’attribut ParameterSetName de l’attribut System.Management.Automation.ParameterAttribute spécifie le jeu de paramètres ProcessId.

[Parameter(
           ParameterSetName = "ProcessId",
           Mandatory = true,
           ValueFromPipelineByPropertyName = true,
           ValueFromPipeline = true
)]
[Alias("ProcessId")]
public int[] Id
{
  get { return processIds; }
  set { processIds = value; }
}
private int[] processIds;
<Parameter(ParameterSetName:="ProcessId", _
Mandatory:=True, _
ValueFromPipelineByPropertyName:=True, _
ValueFromPipeline:=True), [Alias]("ProcessId")> _
Public Property Id() As Integer()
    Get
        Return processIds
    End Get
    Set(ByVal value As Integer())
        processIds = value
    End Set
End Property
Private processIds() As Integer

Notez également que l’alias « ProcessId » est attribué à ce paramètre.

Déclaration du paramètre InputObject

Ce paramètre d’entrée permet à l’utilisateur de spécifier un objet d’entrée qui contient des informations sur les processus à arrêter. Notez que le mot clé d’attribut ParameterSetName de l’attribut System.Management.Automation.ParameterAttribute spécifie le paramètre InputObject défini pour ce paramètre.

[Parameter(
           ParameterSetName = "InputObject",
           Mandatory = true,
           ValueFromPipeline = true)]
public Process[] InputObject
{
  get { return inputObject; }
  set { inputObject = value; }
}
private Process[] inputObject;
<Parameter(ParameterSetName:="InputObject", _
Mandatory:=True, ValueFromPipeline:=True)> _
Public Property InputObject() As Process()
    Get
        Return myInputObject
    End Get
    Set(ByVal value As Process())
        myInputObject = value
    End Set
End Property
Private myInputObject() As Process

Notez également que ce paramètre n’a pas d’alias.

Déclaration de paramètres dans plusieurs jeux de paramètres

Bien qu’il doit y avoir un paramètre unique pour chaque jeu de paramètres, les paramètres peuvent appartenir à plusieurs ensembles de paramètres. Dans ce cas, attribuez au paramètre partagé un System.Management.Automation.ParameterAttribute déclaration d’attribut pour chaque jeu auquel appartient le paramètre. Si un paramètre se trouve dans tous les jeux de paramètres, vous devez uniquement déclarer l’attribut de paramètre une seule fois et n’avez pas besoin de spécifier le nom du jeu de paramètres.

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

Chaque applet de commande doit remplacer une méthode de traitement d’entrée, le plus souvent, il s’agit de la méthode System.Management.Automation.Cmdlet.ProcessRecord. Dans cette applet de commande, la méthode System.Management.Automation.Cmdlet.ProcessRecord est substituée afin que l’applet de commande puisse traiter n’importe quel nombre de processus. Il contient une instruction Select qui appelle une autre méthode en fonction du paramètre spécifié par l’utilisateur.

protected override void ProcessRecord()
{
  switch (ParameterSetName)
  {
    case "ProcessName":
         ProcessByName();
         break;

    case "ProcessId":
         ProcessById();
         break;

    case "InputObject":
         foreach (Process process in inputObject)
         {
           SafeStopProcess(process);
         }
         break;

    default:
         throw new ArgumentException("Bad ParameterSet Name");
  } // switch (ParameterSetName...
} // ProcessRecord
Protected Overrides Sub ProcessRecord()
    Select Case ParameterSetName
        Case "ProcessName"
            ProcessByName()

        Case "ProcessId"
            ProcessById()

        Case "InputObject"
            Dim process As Process
            For Each process In myInputObject
                SafeStopProcess(process)
            Next process

        Case Else
            Throw New ArgumentException("Bad ParameterSet Name")
    End Select

End Sub 'ProcessRecord ' ProcessRecord

Les méthodes d’assistance appelées par l’instruction Select ne sont pas décrites ici, mais vous pouvez voir leur implémentation dans l’exemple de code complet dans la section suivante.

Exemple de code

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

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, testez-la en l’exécutant sur la ligne de commande. Voici quelques tests qui montrent comment les paramètres ProcessId et InputObject peuvent être utilisés pour tester leurs ensembles de paramètres pour arrêter un processus.

  • Avec Windows PowerShell démarré, exécutez l’applet de commande Stop-Proc avec le paramètre ProcessId défini pour arrêter un processus en fonction de son identificateur. Dans ce cas, l’applet de commande utilise le paramètre ProcessId défini pour arrêter le processus.

    PS> Stop-Proc -Id 444
    Confirm
    Are you sure you want to perform this action?
    Performing operation "Stop-Proc" on Target "notepad (444)".
    [Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "Y"): Y
    
  • Lorsque Windows PowerShell a démarré, exécutez l’applet de commande Stop-Proc avec le paramètre InputObject défini pour arrêter les processus sur l’objet Bloc-notes récupéré par la commande Get-Process.

    PS> Get-Process notepad | Stop-Proc
    Confirm
    Are you sure you want to perform this action?
    Performing operation "Stop-Proc" on Target "notepad (444)".
    [Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "Y"): N
    

Voir aussi

Création d’une applet de commande qui modifie le système

Comment créer une applet de commande Windows PowerShell

extension des types d’objets et de mise en forme

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

sdk Windows PowerShell