当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 如何从 PSCmdlet 内调用 PSCmdlet

作者:精品下载站 日期:2024-12-14 02:49:54 浏览:15 分类:玩电脑

如何从 PSCmdlet 内调用 PSCmdlet


此示例演示如何从二进制 cmdlet 中调用基于脚本的 cmdlet 或继承自 [System.Management.Automation.PSCmdlet] 的二进制 cmdlet。在此示例中,新 cmdlet Get-ClipboardReverse 调用 Get-Clipboard 来获取剪贴板的内容。 Get-ClipboardReverse 反转字符的顺序并返回反转的字符串。

笔记

[PSCmdlet] 类与 [Cmdlet] 类不同。 [PSCmdlet] 实现使用运行空间上下文信息,因此您必须使用 PowerShell 管道 API 调用另一个 cmdlet。在[Cmdlet]实现中,您可以直接调用cmdlet的.NET API。有关示例,请参阅如何从 Cmdlet 内调用 Cmdlet。

从 PSCmdlet 中调用 cmdlet

  1. 确保引用 [System.Management.Automation.PowerShell] API 的命名空间。在此示例中,添加了以下命名空间。

    using System.Management.Automation;   // PowerShell assembly.
    using System.Text;
    
  2. 要从另一个二进制 cmdlet 中调用命令,您必须使用[PowerShell] API 构建新管道并添加要调用的 cmdlet。调用 System.Management.Automation.PowerShell.Invoke() 方法来调用管道。

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

例子

要调用基于脚本的 cmdlet 或继承自 [PSCmdlet] 的二进制 cmdlet,您必须使用要执行的命令和参数构建 PowerShell 管道,然后调用该管道。

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));
            }
        }
    }
}

参见

编写 Windows PowerShell Cmdlet

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯