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

时间:2014-11-21 16:51:09

标签: c# asp.net powershell iis

我有一个调用一堆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会话,我能够发送命令并从中检索作业和状态。我无法弄清楚如何将这段代码设置为全局变量。

任何指向正确方向的人都会受到赞赏。

1 个答案:

答案 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;
    }