PowerShell スクリプト式をC#から実行する

自宅に居さえすれば何していたっていいんだよな。つーことで。

話題にしたWindows PowerShellだが、思惑通りにDIの評価式に使うには、.NETプラットホームの言語中、具体的にはC#等から比較的簡単にスクリプト式を実行することができて、尚且つ結果を取得できなくてはならない訳で、できるかどうか早速試してみた。

最新のRC1パッケージをインストールするだけ。(要.NET Framework 2.0)
Download Windows PowerShell Release Candidate

インストールしたパッケージのディレクトリには以下の.NETアセンブリが含まれていた。

Microsoft.PowerShell.Security.dll
Microsoft.PowerShell.ConsoleHost.dll
Microsoft.PowerShell.Commands.Utility.dll
Microsoft.PowerShell.Commands.Management.dll
System.Management.Automation.dll

このうち、単純なスクリプトの実行に使用するのはSystem.Management.Automation.dllだけのようだ。早速簡単なアプリケーションを書いてみよう。

using System;
using System.Management.Automation;
namespace PowerShellInvokeTest {
    class Program {
        static void Main(string[] args) {
            try {
                RunspaceInvoke invoker = new RunspaceInvoke();

                //PowerShellでDateTime.Nowを取得
                string script = "[DateTime]::Now";
                object result = invoker.Invoke(script)[0].BaseObject;
                Console.WriteLine(result);

                //PowerShellでSizeオブジェクトを生成
                script = "new-object System.Drawing.Size(100, 100)";
                result = invoker.Invoke(script)[0].BaseObject;
                Console.WriteLine(result);

                //PowerShellでFormオブジェクトを生成して表示
                script = "new-object System.Windows.Forms.Form";
                result = invoker.Invoke(script)[0].BaseObject;
                (result as System.Windows.Forms.Form).Show();
            } finally {
                Console.WriteLine("Press any key to exit...");
                Console.ReadKey();
            }
        }
    }
}

スクリプトの実行と結果の取得はRunspaceInvokeクラスのインスタンスのInvokeメソッドにパラメタとしてスクリプト式を渡すだけであり、非常に簡単であることが判る。スクリプトの実行結果はCollectionという型のGenericsコレクションで戻るため、実際の結果オブジェクトを取得するためには、インデクサ経由でPSObjectを取得してPSObjectのBaseObjectプロパティを取得すればよい。

object result = invoker.Invoke(script)[0].BaseObject;

以下、実行した結果のスクリーンショット

PowerShellによって生成されたSystem.Windows.Forms.Formクラスのインスタンスに対して実行したShowメソッドも成功しているのが判る。

PowerShell自体が.NETで作られていることからして、.NET Frameworkへのアクセスには制限は無い訳で、式評価エンジンとして使うには、かなりいいかもしれない。