![](/img/trans.png)
[英]How to access module's privatedata from a binary PowerShell Cmdlet?
[英]How to call PowerShell Cmdlet from a binary (C#) module?
如果可以引用实现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>
对象。 枚举对象将调用该命令。 您是对的,正确的方法是创建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.