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

本文关键字:Powershell 会话 持久性 创建 | 更新日期: 2023-09-27 18:31:20

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

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

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

你试过这个吗?

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