Compartir a través de


Ejemplo GetProcessSample04

En este ejemplo se muestra cómo implementar un cmdlet que recupera los procesos en el equipo local. Genera un error de no terminación si se produce un error al recuperar un proceso. Este cmdlet es una versión simplificada del cmdlet Get-Process proporcionado por Windows PowerShell 2.0.

Creación del ejemplo mediante Visual Studio

  1. Con el SDK de Windows PowerShell 2.0 instalado, vaya a la carpeta GetProcessSample04. La ubicación predeterminada es C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0\Samples\sysmgmt\WindowsPowerShell\csharp\GetProcessSample04.

  2. Haga doble clic en el icono del archivo de solución (.sln). Se abre el proyecto de ejemplo en Visual Studio.

  3. En el menú compilación de, seleccione Compilar solución para compilar la biblioteca para el ejemplo en las carpetas de \bin o \bin\debug predeterminadas.

Cómo ejecutar el ejemplo

  1. Cree la siguiente carpeta de módulo:

    [user]\Documents\WindowsPowerShell\Modules\GetProcessSample04

  2. Copie el ensamblado de ejemplo en la carpeta del módulo.

  3. Inicie Windows PowerShell.

  4. Ejecute el siguiente comando para cargar el ensamblado en Windows PowerShell:

    Import-Module getprossessample04

  5. Ejecute el siguiente comando para ejecutar el cmdlet :

    Get-Proc

Requisitos

Este ejemplo requiere Windows PowerShell 2.0.

Demostraciones

En este ejemplo se muestra lo siguiente.

  • Declarar una clase de cmdlet mediante el atributo Cmdlet.

  • Declarar un parámetro de cmdlet mediante el atributo Parameter.

  • Especificar la posición del parámetro.

  • Especificando que el parámetro toma la entrada de la canalización. La entrada se puede tomar de un objeto o un valor de una propiedad de un objeto cuyo nombre de propiedad es el mismo que el nombre del parámetro.

  • Declarar un atributo de validación para la entrada del parámetro.

  • Captura de un error de no terminación y escritura de un mensaje de error en la secuencia de errores.

Ejemplo

En este ejemplo se muestra cómo crear un cmdlet que controle errores sin terminación y escriba mensajes de error en la secuencia de errores.

namespace Microsoft.Samples.PowerShell.Commands
{
    using System;
    using System.Diagnostics;
    using System.Management.Automation;      // Windows PowerShell namespace.
   #region GetProcCommand

   /// <summary>
   /// This class implements the Get-Proc cmdlet.
   /// </summary>
   [Cmdlet(VerbsCommon.Get, "Proc")]
   public class GetProcCommand : Cmdlet
   {
      #region Parameters

       /// <summary>
       /// The names of the processes to act on.
       /// </summary>
       private string[] processNames;

      /// <summary>
      /// Gets or sets the list of process names on
      /// which the Get-Proc cmdlet will work.
      /// </summary>
      [Parameter(
         Position = 0,
         ValueFromPipeline = true,
         ValueFromPipelineByPropertyName = true)]
      [ValidateNotNullOrEmpty]
      public string[] Name
      {
         get { return this.processNames; }
         set { this.processNames = value; }
      }

      #endregion Parameters

      #region Cmdlet Overrides

      /// <summary>
      /// The ProcessRecord method calls the Process.GetProcesses
      /// method to retrieve the processes specified by the Name
      /// parameter. Then, the WriteObject method writes the
      /// associated processes to the pipeline.
      /// </summary>
      protected override void ProcessRecord()
      {
          // If no process names are passed to cmdlet, get all
          // processes.
          if (this.processNames == null)
          {
              WriteObject(Process.GetProcesses(), true);
          }
          else
          {
              // If process names are passed to the cmdlet, get and write
              // the associated processes.
              // If a non-terminating error occurs while retrieving processes,
              // call the WriteError method to send an error record to the
              // error stream.
              foreach (string name in this.processNames)
              {
                  Process[] processes;

                  try
                  {
                      processes = Process.GetProcessesByName(name);
                  }
                  catch (InvalidOperationException ex)
                  {
                      WriteError(new ErrorRecord(
                         ex,
                         "UnableToAccessProcessByName",
                         ErrorCategory.InvalidOperation,
                         name));
                      continue;
                  }

                  WriteObject(processes, true);
              } // foreach (string name...
          } // else
      } // ProcessRecord

      #endregion Overrides
    } // End GetProcCommand class.

   #endregion GetProcCommand
}

Véase también