我将如何使用用于在另一个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来尝试做。