在C#中执行PowerShell CMDLET代码



我将如何使用用于在另一个C#方法中创建PowerShell cmdlet的代码而不是PowerShell脚本。

我有以下代码:

public class Program
{
    static void Main(string[] args)
    {
        var getCommand = new GetCommand { Text = "Hello World"};
        //help needed here
    }
}
[Cmdlet("Test", "Get")]
public class GetCommand : Cmdlet
{
    [Parameter(Mandatory = true)]
    public string Text { get; set; }
    protected override void ProcessRecord()
    {
        WriteObject(Text);
    }
}

不要实例化GetCommand类 - PowerShell将为您做到这一点!

首先,您需要旋转PowerShell类的实例才能执行您的命令:

PowerShell ps = PowerShell.Create();

然后使用AddCommand方法添加CommandInfo参考:

ps.AddCommand(new CmdletInfo("Test-Get", typeof(GetCommand)));

,然后添加您的参数参数:

ps.AddParameter("Text", "Hello World");

现在您可以使用Invoke()方法执行(并收集输出(:

var output = ps.Invoke();
foreach(var obj in ouput)
{
    Console.WriteLine("Output was: {0}", obj);
}

在单独的类中提取逻辑并将其直接调用。使用CMDLET,只是在这个新课程周围只有一个外壳。关注(SOC(的这种分开也可以更轻松地进行单元测试,并导致整体清洁架构。

提取的class engreter.cs

public class Greeter {
    public Greeter(string name) {
        _Name = name;
    }
    private string _Name;
    public string SayHello() {
        return $"Hello {_Name}";
    }
    public string SayGoodBye() {
        return $"So long {_Name}, and thanks for all the fish!";
    }
}

Commandlet getGreetingCommand.cs

[Cmdlet("Greeting", "Get")]
public class GetGreetingCommand : Cmdlet {
    [Parameter(Mandatory = true)]
    public string Name { get; set; }
    protected override void ProcessRecord() {
        var greeter = new Greeter(Name);
        var greeting = greeter.SayHello();
        WriteObject(greeting);
    }
}

Commandlet GetGoodByeCommand .cs

[Cmdlet("GoodBye", "Get")]
public class GetGoodByeCommand : Cmdlet {
    [Parameter(Mandatory = true)]
    public string Name { get; set; }
    protected override void ProcessRecord() {
        var greeter = new Greeter(Name);
        var goodBye = greeter.SayGoodBye();
        WriteObject(goodBye);
    }
}

Console Main.cs(或任何其他客户端代码的问候级(

public static void main(string[] args) {
    var greeter = new Greeter(args.FirstOrDefault());
    Console.WriteLine(greeter.SayHello());
    Console.WriteLine(greeter.SayGoodBye());
}

测试柜

public static void SayingHelloUsesName() {
    var sut = new Greeter("Arthur");
    var expected = "Hello Arthur";
    var actual = sut.SayHello();
    Assert.AreEqual(expected, actual);
}

这里的两个问题是 - 实际的BusinessLogic(preeter.cs( - 与PowerShell的互操作性,提供了参数化cmdlet等的机制(get*command.cs(。如您所见,CMDLET实际上仅通过呼叫,同时通过PowerShell启用。

@mathias R. Jessen´如果您需要致电第三方CMDLET,答案可能很有用,但是在大多数情况下,应该有适当的(非Powershell(API来尝试做。

最新更新