在C#中执行Powershell Cmdlet代码#
我将如何使用用于在另一个c#方法而不是powershell脚本中创建powershell cmdlet的代码。在C#中执行Powershell Cmdlet代码#
我有以下代码:
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();
然后添加一个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);
}
提取逻辑在一个单独的类,并直接调用它。使用cmdlet就可以成为这个新课程的外壳。 这种关注点分离(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!";
}
}
命令行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);
}
}
命令行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);
}
}
控制台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(Greeter.cs) - 与PowerShell的互操作性,提供参数化cmdlet的机制等(Get * Command.cs)。如您所见,cmdlet只能通过调用,而通过PowerShell启用。
@Mathias R. Jessen的答案可能是有用的,如果您需要调用第三方cmdlet,但在大多数情况下,应该为您正在尝试执行的操作提供适当的(非PowerShell)API。
你能提供一个例子吗? –
那里你去;) –
@earloc虽然这可以说是更好的分离代码,你并没有真正解决的问题“我如何在C#中运行我的PowerShell cmdlet”? –
什么是确切的问题?如何调用它? –
是的,并从该WriteObject方法中读取 –