Ensembles d’applets de commande

Lorsque vous concevez vos applets de commande, vous pouvez rencontrer des cas dans lesquels vous devez effectuer plusieurs actions sur le même élément de données. Par exemple, vous pouvez avoir besoin d’obtenir et de définir des données, ou de démarrer et d’arrêter un processus. Bien que vous deviez créer des applets de commande distinctes pour exécuter chaque action, votre conception d’applet de commande doit inclure une classe de base à partir de laquelle les classes des applets de commande individuelles sont dérivées.

Gardez les points suivants à l’esprit lors de l’implémentation d’une classe de base.

  • Déclarez tous les paramètres communs utilisés par toutes les applets de commande dérivées dans la classe de base.

  • Ajoutez des paramètres propres à l’applet de commande à la classe d’applet de commande appropriée.

  • Substituez la méthode de traitement d’entrée appropriée dans la classe de base.

  • Déclarez l’attribut System. Management. Automation. CmdletAttribute sur toutes les classes d’applet de commande, mais ne le déclarez pas sur la classe de base.

  • Implémentez une classe System. Management. Automation. PSSnapin ou System. Management. Automation. CustomPSSnapIn dont le nom et la description reflètent le jeu d’applets de commande.

Exemple

L’exemple suivant illustre l’implémentation d’une classe de base utilisée par Get-Proc et Stop-Proc applet de commande qui dérivent de la même classe de base.

using System;
using System.Diagnostics;
using System.Management.Automation;             //Windows PowerShell namespace.

namespace Microsoft.Samples.PowerShell.Commands
{

  #region ProcessCommands

  /// <summary>
  /// This class implements a Stop-Proc cmdlet. The parameters
  /// for this cmdlet are defined by the BaseProcCommand class.
  /// </summary>
  [Cmdlet(VerbsLifecycle.Stop, "Proc", SupportsShouldProcess = true)]
  public class StopProcCommand : BaseProcCommand
  {
    public override void ProcessObject(Process process)
    {
      if (ShouldProcess(process.ProcessName, "Stop-Proc"))
      {
        process.Kill();
      }
    }
  }

  /// <summary>
  /// This class implements a Get-Proc cmdlet. The parameters
  /// for this cmdlet are defined by the BaseProcCommand class.
  /// </summary>

  [Cmdlet(VerbsCommon.Get, "Proc")]
  public class GetProcCommand : BaseProcCommand
  {
    public override void ProcessObject(Process process)
    {
      WriteObject(process);
    }
  }

  /// <summary>
  /// This class is the base class that defines the common
  /// functionality used by the Get-Proc and Stop-Proc
  /// cmdlets.
  /// </summary>
  public class BaseProcCommand : Cmdlet
  {
    #region Parameters

    // Defines the Name parameter that is used to
    // specify a process by its name.
    [Parameter(
               Position = 0,
               Mandatory = true,
               ValueFromPipeline = true,
               ValueFromPipelineByPropertyName = true
    )]
    public string[] Name
    {
      get { return processNames; }
      set { processNames = value; }
    }
    private string[] processNames;

    // Defines the Exclude parameter that is used to
    // specify which processes should be excluded when
    // the cmdlet performs its action.
    [Parameter()]
    public string[] Exclude
    {
      get { return excludeNames; }
      set { excludeNames = value; }
    }
    private string[] excludeNames = new string[0];
    #endregion Parameters

    public virtual void ProcessObject(Process process)
    {
      throw new NotImplementedException("This method should be overridden.");
    }

    #region Cmdlet Overrides
    // <summary>
    // For each of the requested process names, retrieve and write
    // the associated processes.
    // </summary>
    protected override void ProcessRecord()
    {
      // Set up the wildcard characters used in resolving
      // the process names.
      WildcardOptions options = WildcardOptions.IgnoreCase |
                                WildcardOptions.Compiled;

      WildcardPattern[] include = new WildcardPattern[Name.Length];
      for (int i = 0; i < Name.Length; i++)
      {
        include[i] = new WildcardPattern(Name[i], options);
      }

      WildcardPattern[] exclude = new WildcardPattern[Exclude.Length];
      for (int i = 0; i < Exclude.Length; i++)
      {
        exclude[i] = new WildcardPattern(Exclude[i], options);
      }

      foreach (Process p in Process.GetProcesses())
      {
        foreach (WildcardPattern wIn in include)
        {
          if (wIn.IsMatch(p.ProcessName))
          {
            bool processThisOne = true;
            foreach (WildcardPattern wOut in exclude)
            {
              if (wOut.IsMatch(p.ProcessName))
              {
                processThisOne = false;
                break;
              }
            }
            if (processThisOne)
            {
              ProcessObject(p);
            }
            break;
          }
        }
      }
    }
    #endregion Cmdlet Overrides
  }
    #endregion ProcessCommands
}

Voir aussi

Écriture d’une applet de commande Windows PowerShell