Compartir a través de


Adición de parámetros que procesan la entrada de la canalización

Un origen de entrada para un cmdlet es un objeto de la canalización que se origina a partir de un cmdlet ascendente. En esta sección se describe cómo agregar un parámetro al cmdlet Get-Proc (descrito en Creating Your First Cmdlet) para que el cmdlet pueda procesar objetos de canalización.

Este cmdlet Get-Proc usa un parámetro Name que acepta la entrada de un objeto de canalización, recupera la información del proceso del equipo local en función de los nombres proporcionados y, a continuación, muestra información sobre los procesos en la línea de comandos.

Definición de la clase de cmdlet

El primer paso en la creación de cmdlets siempre es asignar un nombre al cmdlet y declarar la clase .NET que implementa el cmdlet. Este cmdlet recupera la información del proceso, por lo que el nombre del verbo elegido aquí es "Get". (Casi cualquier tipo de cmdlet que sea capaz de recuperar información puede procesar la entrada de la línea de comandos). Para obtener más información sobre los verbos de cmdlet aprobados, consulte Nombres de verbos de cmdlet.

A continuación se muestra la definición de este cmdlet Get-Proc. Los detalles de esta definición se proporcionan en Creación del primer cmdlet.

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

Definición de la entrada desde la canalización

En esta sección se describe cómo definir la entrada de la canalización para un cmdlet. Este cmdlet Get-Proc define una propiedad que representa el parámetro Name como se describe en Agregar parámetros que procesan la entrada de la línea de comandos. (Vea ese tema para obtener información general sobre cómo declarar parámetros).

Sin embargo, cuando un cmdlet necesita procesar la entrada de canalización, debe tener sus parámetros enlazados a los valores de entrada por el entorno de ejecución de Windows PowerShell. Para ello, debe agregar la palabra clave ValueFromPipeline o agregar la palabra clave ValueFromPipelineByProperty a la declaración de atributo System.Management.Automation.ParameterAttribute. Especifique la palabra clave ValueFromPipeline si el cmdlet tiene acceso al objeto de entrada completo. Especifique el ValueFromPipelineByProperty si el cmdlet solo tiene acceso a una propiedad del objeto .

Esta es la declaración de parámetros del parámetro Name de este cmdlet de Get-Proc que acepta la entrada de canalización.

[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 declaración anterior establece la palabra clave ValueFromPipeline en true para que el tiempo de ejecución de Windows PowerShell enlace el parámetro al objeto entrante si el objeto es el mismo tipo que el parámetro o si se puede coertar al mismo tipo. La palabra clave ValueFromPipelineByPropertyName también se establece en true para que el entorno de ejecución de Windows PowerShell compruebe el objeto entrante de una propiedad Name. Si el objeto entrante tiene dicha propiedad, el tiempo de ejecución enlazará el parámetro Name a la propiedad Name del objeto entrante.

Nota:

El valor de la palabra clave de atributo ValueFromPipeline para un parámetro tiene prioridad sobre la configuración de la palabra clave ValueFromPipelineByPropertyName.

Invalidación de un método de procesamiento de entrada

Si el cmdlet va a controlar la entrada de canalización, debe invalidar los métodos de procesamiento de entrada adecuados. Los métodos básicos de procesamiento de entrada se presentan en Creating Your First Cmdlet.

Este cmdlet de Get-Proc invalida el método System.Management.Automation.Cmdlet.ProcessRecord para controlar la entrada del parámetro Name proporcionada por el usuario o un script. Este método obtendrá los procesos de cada nombre de proceso solicitado o de todos los procesos si no se proporciona ningún nombre. Observe que en system.Management.Automation.Cmdlet.ProcessRecord, la llamada a WriteObject(System.Object,System.Boolean) es el mecanismo de salida para enviar objetos de salida a la canalización. El segundo parámetro de esta llamada, enumerateCollection, se establece en true para indicar al runtime de Windows PowerShell que enumere la matriz de objetos de proceso y escriba un proceso cada vez en la línea de comandos.

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

Ejemplo de código

Para obtener el código de ejemplo de C# completo, vea Ejemplo GetProcessSample03.

Definición de tipos de objeto y formato

Windows PowerShell pasa información entre cmdlets mediante objetos .NET. Por lo tanto, es posible que un cmdlet tenga que definir su propio tipo o que el cmdlet tenga que extender un tipo existente proporcionado por otro cmdlet. Para obtener más información sobre cómo definir nuevos tipos o ampliar tipos existentes, vea Extensión de tipos de objeto y formato.

Compilación del cmdlet

Después de implementar un cmdlet, debe registrarse con Windows PowerShell a través de un complemento de Windows PowerShell. Para obtener más información sobre el registro de cmdlets, consulte Registro de cmdlets, proveedores y aplicaciones host.

Prueba del cmdlet

Cuando el cmdlet se haya registrado con Windows PowerShell, pruébelo ejecutándolo en la línea de comandos. Por ejemplo, pruebe el código del cmdlet de ejemplo. Para obtener más información sobre el uso de cmdlets desde la línea de comandos, consulte la Introducción a Windows PowerShell.

  • En el símbolo del sistema de Windows PowerShell, escriba los siguientes comandos para recuperar los nombres de proceso a través de la canalización.

    PS> type ProcessNames | Get-Proc
    

    Aparece la salida siguiente.

    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
    
  • Escriba las líneas siguientes para obtener los objetos de proceso que tienen una propiedad Name de los procesos denominados "IEXPLORE". En este ejemplo se usa el cmdlet Get-Process (proporcionado por Windows PowerShell) como comando ascendente para recuperar los procesos "IEXPLORE".

    PS> Get-Process iexplore | Get-Proc
    

    Aparece la salida siguiente.

    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
    

Véase también

agregar parámetros que procesan la entrada de la línea de comandos

crear el primer cmdlet

extensión de tipos de objeto y formato

Registro de cmdlets, proveedores y aplicaciones host

referencia de Windows PowerShell

ejemplos de cmdlets de