How to invoke a PSCmdlet from within a PSCmdlet
This example shows how to invoke a script based cmdlet or binary cmdlet inheriting from
[System.Management.Automation.PSCmdlet]
from within a binary cmdlet. In this example, the new
cmdlet Get-ClipboardReverse
calls Get-Clipboard
to get the contents of the clipboard. The
Get-ClipboardReverse
reverses the order of the characters and returns the reversed string.
Note
The [PSCmdlet]
class differs from the [Cmdlet]
class. [PSCmdlet]
implementations use
runspace context information so you must invoke another cmdlet using the PowerShell pipeline API.
In [Cmdlet]
implementations you can call the cmdlet's .NET API directly. For an example, see
How to invoke a Cmdlet from within a Cmdlet.
To invoke a cmdlet from within a PSCmdlet
Ensure that the namespace for the
[System.Management.Automation.PowerShell]
API is referenced. In this example, the following namespaces are added.using System.Management.Automation; // PowerShell assembly. using System.Text;
To invoke a command from within another binary cmdlet you must use the
[PowerShell]
API to construct a new pipeline and add the cmdlet to be invoked. Call the System.Management.Automation.PowerShell.Invoke<T>() method to invoke the pipeline.using var ps = PowerShell.Create(RunspaceMode.CurrentRunspace); ps.AddCommand("Get-Clipboard").AddParameter("Raw"); var output = ps.Invoke<string>();
Example
To invoke a script based cmdlet or binary cmdlet inheriting from [PSCmdlet]
you must build a
PowerShell pipeline with the command and parameters you want to execute, then invoke the pipeline.
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));
}
}
}
}