2017-04-24 10 views
0

powershellスクリプトではなく、別のC#メソッドでpowershellコマンドレットを作成するコードを使用するにはどうすればよいですか。C#で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

正確な問題は何ですか?それを呼び出す方法は? –

+0

はい、そのWriteObjectメソッドから読み取る –

答えて

1

GetCommandクラスをインスタンス化しないでください - PowerShellは、あなたのためにそれを行います!

まず、あなたがあなたのコマンドを実行するPowerShellクラスのインスタンスをスピンアップする必要があります:

PowerShell ps = PowerShell.Create(); 

その後AddCommand方法でCommandInfoの参照を追加します。その後、

ps.AddCommand(new CmdletInfo("Test-Get", typeof(GetCommand))); 

そして、パラメータの引数を追加してください:

ps.AddParameter("Text", "Hello World"); 
var output = ps.Invoke(); 
foreach(var obj in ouput) 
{ 
    Console.WriteLine("Output was: {0}", obj); 
} 
0

は別々のクラス内のロジックを抽出し、それを直接呼び出す:は今、あなたはInvoke()方法でそれを実行(および出力を収集する)ことができます。コマンドレットを使用して、この新しいクラスを囲む単なるシェルにすることができます。 この問題の分離(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()); 
} 

のTestCase

public static void SayingHelloUsesName() { 
    var sut = new Greeter("Arthur"); 

    var expected = "Hello Arthur"; 
    var actual = sut.SayHello(); 

    Assert.AreEqual(expected, actual); 
} 

ここ2つの懸念are - t実際のBusinessLogic(Greeter.cs) - PowerShellとの相互運用性、コマンドレットをパラメータ化するメカニズムの提供など(Get * Command.cs)。ご覧のように、コマンドレットは実際には呼び出しを通過するだけで、PowerShell経由での使用も可能です。

@Mathias R. Jessenの答えは、サードパーティのコマンドレットを呼び出す必要がある場合に便利ですが、ほとんどの場合、実行しようとしているものに対して適切な(非PowerShellの)APIが必要です。

+0

例を挙げることはできますか? –

+0

ありがとうございます; –

+1

@ariocこれは間違いなく分かりやすいコードですが、「PowerShellコマンドレットをC#でどのように実行すればよいのですか」という質問に本当に対処しているわけではありません。 –

関連する問題