在C#中执行Powershell Cmdlet代码

时间:2017-04-24 13:30:31

标签: c# powershell

如何在另一个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);
    }
}

2 个答案:

答案 0 :(得分:1)

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

首先,您需要启动PowerShell类的实例来执行命令:

PowerShell ps = PowerShell.Create();

然后使用CommandInfo方法添加AddCommand引用:

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);
}

答案 1 :(得分:0)

在单独的类中提取逻辑并直接调用它。使用cmdlet就是这个新类的shell。 这种关注点分离(SoC)还可以使单元测试更容易,并使整体结构更整洁。

  

提取的类Greeter.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(或Greeter-class的任何其他客户端代码)

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(Greeter.cs) - 与PowerShell的互操作性,提供参数化cmdlet的机制等(Get * Command.cs)。如您所见,cmdlet实际上只通过调用,同时通过PowerShell启用。

如果你需要调用第三方cmdlet,那么@Mathias R. Jessen的回答可能会很有用,但在大多数情况下,应该有适当的(非powershell)API用于你想要做的事情。