繁体   English   中英

如何从二进制 (C#) 模块调用 PowerShell Cmdlet?

[英]How to call PowerShell Cmdlet from a binary (C#) module?

我正在编写一个自定义二进制 (C#) Cmdlet,从这个 CmdLet 中,我想调用另一个 PowerShell 二进制 Cmdlet(例如 Get-ADUser)并将结果带回我的 Cmdlet。 实现这一目标的最佳方法是什么? 注:似乎创建PowerShell中的另一个实例(如描述在这里我的自定义Cmdlet的内部)不做到这一点的最有效方法。

我看着这个问题。 但是,它没有回答我的问题。

如果可以引用实现cmdlet的类,则可以通过创建类的实例来“调用”cmdlet,设置表示参数的任何属性并调用Cmdlet.Invoke<T>()方法。 这是一个例子:

using System.Linq;
using System.Management.Automation;

namespace MyModule.Commands
{

    [Cmdlet(VerbsLifecycle.Invoke, "AnotherCmdlet")]
    public class InvokeAnotherCmdlet : Cmdlet
    {
        [Parameter(Mandatory = true)]
        public string Username { get; set; }

        protected override void ProcessRecord()
        {
            GetADUserCommand anotherCmdlet = new GetADUserCommand() {
                // Pass CommandRuntime of calling cmdlet to the called cmdlet (note 1)
                CommandRuntime = this.CommandRuntime, 

                // Set parameters
                Username = this.Username
            };

            // Cmdlet code isn't ran until the resulting IEnumerable is enumerated (note 2)
            anotherCmdlet.Invoke<object>().ToArray();
        }
    }

    [Cmdlet(VerbsCommon.Get, "ADUser")]
    public class GetADUserCommand : Cmdlet
    {
        [Parameter(Mandatory = true)]
        public string Username { get; set; }

        protected override void ProcessRecord()
        {
            WriteVerbose($"Getting AD User '{Username}'");
        }
    }
}

有几点需要注意:

  1. 您可能希望将调用Cmdlet对象的Cmdlet.CommandRuntime属性的值传递给调用的Cmdlet对象。 这将确保,如果被调用的cmdlet写入对象流(例如,通过调用WriteObject ),那些对象将进入主机。 另一种方法是调用cmdlet枚举在调用cmdlet上调用Invoke<T>()方法的结果。
  2. 在调用cmdlet上Invoke<T>()方法不会立即调用cmdlet,因为方法名称可能会建议。 它改为返回一个IEnumberable<T>对象。 枚举对象将调用该命令。

您是对的,正确的方法是创建PowerShell的实例。 强类型方法是

PowerShell ps = PowerShell.Create();
ps.AddCommand(new CmdletInfo("Get-Cmdlet", typeof(GetCmdletCommand)));

虽然从 C# 调用 PowerShell 有其优点,但如果您想这样做,您可能应该重新考虑您的方法,因为您可能遵循了一种反模式。 通过将一个 cmdlet 的输出与另一个的输入进行匹配并在管道中调用它们来使您的 cmdlet“适合”在一起会更明智。 另一个问题的更好答案描述了粘在一起的 cmdlet“单元”的设计选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM