gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:30:11 25 4
gpt4 key购买 nike

我正在编写一个自定义二进制 (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}'");
}
}
}

有几点需要注意:

  1. 您可能希望传递 Cmdlet.CommandRuntime 的值将调用 Cmdlet 对象的属性传递给被调用 Cmdlet 对象。这将确保,如果您调用的 cmdlet 写入对象流(例如,通过调用 WriteObject ),这些对象将进入主机。另一种方法是让调用 cmdlet 枚举调用 Invoke<T>() 的结果。调用 cmdlet 上的方法。

  2. 调用 Invoke<T>()调用 cmdlet 上的方法不会像方法名称所暗示的那样立即调用 cmdlet。它反而返回 IEnumerable<T>目的。枚举对象将调用命令。

关于c# - 如何从二进制 (C#) 模块调用 PowerShell Cmdlet?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32467054/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com