簡體   English   中英

在 .Net 中保持 Powershell 運行空間打開

[英]Keeping Powershell runspace open in .Net

我正在嘗試從 VB.Net 中運行一些 PowerShell 代碼(如果您知道,C# 編碼人員也可能會有所幫助!)。
代碼的第一部分,我需要使用密碼連接到 na-controller 並且我需要保持連接打開。 我還有其他命令需要單擊按鈕來運行(獲取文件、顯示文件、刪除特定文件)。
如何保持運行空間打開並分別運行每一行代碼? 我需要使用“CreateRunspacePool”嗎? 如果是這樣,我該如何使用它?

編輯:我現在正在使用 RunspaceStateInfo.State,但我不知道保持連接打開的方法。 我已經嘗試過 Page_Load 和 Page_Init 事件讓它打開一次,但在某處,它關閉了。 我確實刪除了“.Close”命令

您沒有提供很多信息,但是從您談論 Page_Load 和 Page_Init 我假設您正在嘗試從 ASP.NET Web 應用程序執行此操作。 通過按下按鈕並在 Runspace 上設置狀態。

如果這是一個 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 時,它顯示“你好”和

當我單擊按鈕 2 然后單擊按鈕 3 時,它顯示“世界”

所以它成功地重用了運行空間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM