2017-04-24 54 views
0

我将如何使用用于在另一个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); 
    } 
} 
+0

什么是确切的问题?如何调用它? –

+0

是的,并从该WriteObject方法中读取 –

回答

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

提取逻辑在一个单独的类,并直接调用它。使用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。

+0

你能提供一个例子吗? –

+0

那里你去;) –

+1

@earloc虽然这可以说是更好的分离代码,你并没有真正解决的问题“我如何在C#中运行我的PowerShell cmdlet”? –