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