C# 在C中创建持久化Powershell会话#

C# 在C中创建持久化Powershell会话#,c#,asp.net,powershell,iis,C#,Asp.net,Powershell,Iis,我有一个项目,它调用了一堆Powershell脚本,其中一些脚本需要几分钟的时间来运行并导致页面超时。我曾考虑使用Start Job在后台运行多个进程,以避免页面超时,但每次运行Powershell命令时,它都会打开Powershell的一个新实例,并且找不到任何作业 protected void RunShell() { var Shell = PowerShell.Create(); Shell.Commands.AddScript(Textbox.Text); va

我有一个项目,它调用了一堆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的持久会话,以便能够向其发送命令并从中检索作业和状态。我不知道如何将这段代码设置为全局变量

任何指向正确方向的指针都将不胜感激。

您尝试过这个吗

PowerShell.Create(CurrentRunspace)

编辑:如果要共享PowerShell,可以这样做(要在整个应用程序中共享它,请将
会话
替换为
应用程序
):


你提到有一个页面超时。这些函数是从IIS下的ASP.NET调用的吗?是的。添加了标签。我没有。我将尝试此操作。我能够加载Powershell 4 System.Management.Automation参考,并使我的项目能够识别命令RunspaceMode.CurrentRunspace。我现在收到一个错误,无法创建使用当前运行空间的PowerShell对象,因为没有可用的当前运行空间。如何预加载运行空间以再次调用?我猜您第一次不使用该参数时。随后的调用将使用它。祝你好运我尝试添加一个开关,第一次运行Powershell.Create(),第二次运行Powershell.Create(RunspaceMode.CurrentRunspace)。首先,我得到的错误是“Shell”已经在此范围内定义。我将名称更改为“Shell2”,得到与以前相同的结果;'Get Jobs*| Out String'不返回任何内容。我缺少什么来为后续调用正确地构造此代码以使用该方法?很抱歉,这不起作用。我编辑了我的答案,以展示如何在Asp.Net中仅拥有一个PowerShell对象实例。
    private PowerShell GetPowerShell()
    {
        PowerShell Shell = Session["PowerShell"] as PowerShell;

        if (Shell == null)
        {
            Shell = PowerShell.Create();
            Session["PowerShell"] = Shell;
        }

        return Shell;
    }