2012-05-22 42 views
2

我試圖運行從內VB.Net一些PowerShell代碼(C#程序員也可以幫助,如果你知道的!)。
代碼的第一部分,我需要連接到一個NA-控制器密碼,我需要保持連接打開。我還有其他命令需要點擊按鈕來運行(獲取文件,顯示文件,刪除特定的文件)。
如何保持運行空間處於打開狀態並分別運行每行代碼?我需要使用「CreateRunspacePool」嗎?如果是這樣,我該如何使用它?保持Powershell的運行空間打開的.Net

編輯:我現在在玩RunspaceStateInfo.State,但我不知道保持連接打開的方法。我已經嘗試過Page_Load和Page_Init事件,只讓它打開一次,但是沿着這條線的某處,它會關閉。我沒有刪除「.Close」命令

回答

5

您沒有提供很多信息,但是從你說的是在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顯示「世界」

所以sucesfully重用的運行空間。