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

「Runspace」というクラスについてわかった事。

例えば、以下のように「RunspaceInvoke」だけで変数を宣言して、その変数を出力する。

var pshEngine = new RunspaceInvoke();
pshEngine.Invoke("$global:msg = \"Hello\"");
var psObjects = pshEngine.Invoke("echo $global:msg");

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

出力

Hello

これを以下のように書き直す。

var pshEngine = new RunspaceInvoke();
pshEngine.Invoke("$global:msg = \"Hello\"");
// もっかいインスタンス化
pshEngine = new RunspaceInvoke();
var psObjects = pshEngine.Invoke("echo $global:msg");

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

出力

この場合、何も出力されない。これは「RunspaceInvoke」をもう一回インスタンス化した事でセッション情報が消去されて、宣言した変数が引き継がれない為。

でもこれを「Runspace」を使って書き直すと、

var runspace = RunspaceFactory.CreateRunspace();
var pshEngine = new RunspaceInvoke(runspace);
pshEngine.Invoke("$global:msg = \"Hello\"");
// もっかいインスタンス化
pshEngine = new RunspaceInvoke(runspace);
var psObjects = pshEngine.Invoke("echo $global:msg");

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

出力

Hello

こんな感じで「RunspaceInvoke」の複数のインスタンス間で同じセッション情報を共有する事ができる。
という事で「Runspace」はセッション情報を共有する時に使うということがわかった。