您没有提供很多信息,但是从您谈论 Page_Load 和 Page_Init 开始,我假设您正在尝试从 ASP.NET Web 应用程序中执行此操作。通过按下按钮和设置运行空间上的状态。
如果这是一个 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 时,它会显示“Hello”和
当我单击按钮 2 和 3 时,它显示“世界”
所以它成功地重用了运行空间。