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

我看着this问题。但是,它不能回答我的问题。

最佳答案

如果您可以引用实现该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}'");
        }
    }
}

需要注意的几件事:
  • 您可能希望将调用Cmdlet对象的Cmdlet.CommandRuntime属性的值传递给被调用Cmdlet对象。这将确保,如果您调用的cmdlet写入对象流(例如,通过调用WriteObject),则这些对象将进入主机。替代方法是调用cmdlet枚举在调用cmdlet上调用Invoke<T>()方法的结果。
  • 在调用cmdlet上调用Invoke<T>()方法不会立即调用该cmdlet,因为方法名称可能会建议。相反,它返回一个IEnumberable<T>对象。枚举对象将调用命令。
  • 关于c# - 如何从二进制(C#)模块调用PowerShell Cmdlet?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32467054/

    10-13 01:40