您没有提供大量信息,但从您谈论 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 时,它会显示“世界”
这样就成功使用了运行空间。