あなたは多くの情報を提供していませんが、Page_LoadとPage_Initについて話していることから、ASP.NETWebアプリケーションからこれを実行しようとしていると思います。ボタンを押して、Runspaceの状態を設定します。
これがwinformsアプリケーションの場合は、単純にランスペースを作成できます。
Runspace runspace = RunspaceFactory.CreateRunspace(Host);
次に、PowerShellインスタンスを作成し、この実行スペースを再利用します。
var ps1 = PowerShell.Create();
ps1.Runspace = runspace;
ps1.AddScript("Write-Host 'hello'")
var ps2 = PowerShell.Create();
ps2.Runspace = runspace;
ps2.AddScript("Write-Host 'world'")
ランスペースを維持し、同じランスペースに対してボタンクリックの間にスクリプトを実行するだけです。
ただし、asp.netを使用している場合、これは異なります。明らかに、ボタンをクリックするたびに新しいスレッドが生成され、実行スペースを変数に保持できないため、保持するなどの操作を行う必要があります。次のようなセッション:
protected PSHost Host
{
get
{
if (this.Session["Host"] == null)
{
var host = new MyHost();
this.Session["Host"] = host;
}
return (PSHost)this.Session["Host"];
}
}
protected Runspace Runspace
{
get
{
if (this.Session["Runspace"] == null)
{
var rs = RunspaceFactory.CreateRunspace(Host);
this.Session["Runspace"] = rs;
rs.Open();
}
return (Runspace)this.Session["Runspace"];
}
}
そして、これが機能することをテストしました。
protected void Page_Load(object sender, EventArgs e)
{
Button1.Click += new EventHandler(Button1_Click);
Button2.Click += new EventHandler(Button2_Click);
Button3.Click += new EventHandler(Button3_Click);
}
void Button3_Click(object sender, EventArgs e)
{
var ps = PowerShell.Create();
ps.Runspace = this.Runspace;
ps.AddScript("$test | ft | out-string");
var input = new List<object>();
var output = new List<object>();
ps.Invoke(input, output);
TextBox1.Text = output.First().ToString();
}
void Button2_Click(object sender, EventArgs e)
{
var ps = PowerShell.Create();
ps.Runspace = this.Runspace;
ps.AddScript("$test = 'world'");
ps.Invoke();
}
void Button1_Click(object sender, EventArgs e)
{
var ps = PowerShell.Create();
ps.Runspace = this.Runspace;
ps.AddScript("$test = 'hello'");
ps.Invoke();
}
ボタン1をクリックしてから3をクリックすると、「こんにちは」と表示されます。
ボタン2、3の順にクリックすると、「ワールド」と表示されます。
そのため、ランスペースを正常に再利用しました。