Búsqueda de sitios web

Cómo invocar un PSCmdlet desde dentro de un PSCmdlet


Este ejemplo muestra cómo invocar un cmdlet basado en script o un cmdlet binario heredado de [System.Management.Automation.PSCmdlet] desde un cmdlet binario. En este ejemplo, el nuevo cmdlet Get-ClipboardReverse llama a Get-Clipboard para obtener el contenido del portapapeles. Get-ClipboardReverse invierte el orden de los caracteres y devuelve la cadena invertida.

Nota

La clase [PSCmdlet] difiere de la clase [Cmdlet]. Las implementaciones de [PSCmdlet] usan información de contexto del espacio de ejecución, por lo que debe invocar otro cmdlet mediante la API de canalización de PowerShell. En las implementaciones de [Cmdlet], puede llamar directamente a la API .NET del cmdlet. Para ver un ejemplo, consulte Cómo invocar un cmdlet desde dentro de un cmdlet.

Para invocar un cmdlet desde un PSCmdlet

  1. Asegúrese de que se haga referencia al espacio de nombres de la API [System.Management.Automation.PowerShell]. En este ejemplo, se agregan los siguientes espacios de nombres.

    using System.Management.Automation;   // PowerShell assembly.
    using System.Text;
    
  2. Para invocar un comando desde otro cmdlet binario, debe usar la API [PowerShell] para construir una nueva canalización y agregar el cmdlet que se va a invocar. Llame al método System.Management.Automation.PowerShell.Invoke() para invocar la canalización.

    using var ps = PowerShell.Create(RunspaceMode.CurrentRunspace);
    ps.AddCommand("Get-Clipboard").AddParameter("Raw");
    var output = ps.Invoke<string>();
    

Ejemplo

Para invocar un cmdlet basado en script o un cmdlet binario heredado de [PSCmdlet], debe crear una canalización de PowerShell con el comando y los parámetros que desea ejecutar y luego invocar la canalización.

using System;
using System.Management.Automation;   // PowerShell assembly.
using System.Text;

namespace ClipboardReverse
{
    [Cmdlet(VerbsCommon.Get,"ClipboardReverse")]
    [OutputType(typeof(string))]
    public class ClipboardReverse : PSCmdlet
    {
        protected override void EndProcessing()
        {
            using var ps = PowerShell.Create(RunspaceMode.CurrentRunspace);
            ps.AddCommand("Get-Clipboard").AddParameter("Raw");
            var output = ps.Invoke<string>();
            if (ps.HadErrors)
            {
                WriteError(new ErrorRecord(ps.Streams.Error[0].Exception,
                           "Get-Clipboard Error", ErrorCategory.NotSpecified, null));
            }
            else
            {
                var sb = new StringBuilder();
                foreach (var text in output)
                {
                    sb.Append(text);
                }

                var reversed = sb.ToString().ToCharArray();
                Array.Reverse(reversed);
                WriteObject(new string(reversed));
            }
        }
    }
}

Ver también

Escribir un cmdlet de Windows PowerShell

Artículos relacionados