C#からPowerShellをいじくりたおす 1

C#からPowerShellスクリプトを呼び出す方法を調べてみる。開発環境にはVisualC# 2008 Expressを使う。

前提条件として「System.Management.Automation.dll」を参照していることと、以下の名前空間をusingしていること。

using System.Management.Automation;
using System.Management.Automation.Runspaces;

まずは簡単にPowerShellのコマンドを実行する。

var pshEngine = new RunspaceInvoke();
var psObjects = pshEngine.Invoke("dir");

foreach(var obj in psObjects) Console.WriteLine(obj);

これを実行するとカレントディレクトリにあるファイルとディレクトリの名前だけが表示される。

↓こんな感じにパイプでつないだスクリプトも普通に実行できる。

var pshEngine = new RunspaceInvoke();
var psObjects = pshEngine.Invoke("dir | sort Name -descending");

foreach(var obj in psObjects) Console.WriteLine(obj);

これは以下のように書く事もできる。

var runspace = RunspaceFactory.CreateRunspace();
// パイプラインオブジェクト
var pshEngine = runspace.CreatePipeline();
// dir Cmdlet
pshEngine.Commands.Add(
    new Command("dir")
);
// sort Cmdlet
pshEngine.Commands.Add(
    new Command("sort") {
        Parameters = {
            // new CommandParameter("property", "Name") でもいい
            new CommandParameter(null, "Name"),
            new CommandParameter("descending", null)
        }
    }
);
var psObjects = pshEngine.Invoke();

foreach(var obj in psObjects) Console.WriteLine(obj);

「Pipeline」クラスを使えば、コマンドのパラメータとしてプリミティブな型だけでなく、オブジェクトも渡す事ができる。実行するコマンドは「Commands」プロパティに「Command」クラスのインスタンスを追加するだけ。
最終的に「Invoke」メソッドで実行すると、「Commands」プロパティに追加されている最初のコマンドから順に実行され、その結果が次のコマンドにパイプラインで渡される。ちなみに「Pipeline」クラスには「Input」プロパティといのがあって、これの「Write」メソッドでパイプラインに直接オブジェクトを書き込む事もできる。

まだまだいろいろできそう。