Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
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));
}
}
}
}