如何在另一个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);
}
}
答案 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用于你想要做的事情。