您沒有提供很多信息,但是從你說的是在Page_Load和Page_Init我假設你正在試圖從ASP.NET Web應用程序做到這一點。通過按下按鈕並在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顯示「世界」
所以sucesfully重用的運行空間。