我有一个调用一堆Powershell脚本的项目,其中一些脚本需要几分钟才能运行并导致页面超时。我考虑过使用Start-Job在后台运行多个进程以释放页面超时,但每次运行Powershell命令时都会打开一个新的Powershell实例,但找不到任何作业。
protected void RunShell()
{
var Shell = PowerShell.Create();
Shell.Commands.AddScript(Textbox.Text);
var results = Shell.Invoke();
if (results.Count > 0)
{
var builder = new StringBuilder();
foreach (var psObject in results)
{
builder.AppendLine(psObject.BaseObject.ToString();
}
Textbox2.Text = builder.ToString();
}
}
protected void button1_Click(object sender, EventAgrs e)
{
Textbox1.Text = "Start-Job -ScriptBlock{.\\script.ps1} | Out-String";
RunShell();
}
protected void button2_Click(object sender, EventArgs e)
{
Textbox1.Text = "Get-Job * | Out-String";
RunShell();
}
我现在希望创建一个持久的powershell会话,我能够发送命令并从中检索作业和状态。我无法弄清楚如何将这段代码设置为全局变量。
任何指向正确方向的人都会受到赞赏。
答案 0 :(得分:1)
你试过这个吗?
PowerShell.Create(CurrentRunspace)
http://msdn.microsoft.com/en-us/library/system.management.automation.runspacemode%28v=vs.85%29.aspx
编辑:如果您要共享PowerShell,可以执行此操作(在整个应用程序中共享它,将Session
替换为Application
):
private PowerShell GetPowerShell()
{
PowerShell Shell = Session["PowerShell"] as PowerShell;
if (Shell == null)
{
Shell = PowerShell.Create();
Session["PowerShell"] = Shell;
}
return Shell;
}