2012-05-22 2 views
2

Я пытаюсь запустить некоторый код PowerShell из VB.Net (кодеры C# также могут помочь, если вы знаете!).
В первой части кода мне нужно подключиться к контроллеру na с паролем, и мне нужно сохранить соединение открытым. У меня есть другие команды, которые мне нужно запустить одним нажатием кнопки (получить файлы, показать файлы, удалить конкретные).
Как я могу сохранить пробел открытым и запустить каждую строку кода отдельно? Нужно ли использовать «CreateRunspacePool»? Если да, то как его использовать?Сохранение рабочего пространства Powershell открыто в .Net

Редактировать: Я сейчас играю с RunspaceStateInfo.State, но я не знаю, как открыть соединение. Я пробовал события Page_Load и Page_Init, чтобы просто открыть его один раз, но где-то вдоль линии он закрывается. Я удалил команду «.Close»

ответ

5

Вы не предоставили много информации, но от вас говорят о Page_Load и Page_Init Я предполагаю, что вы пытаетесь сделать это из веб-приложения ASP.NET. Нажатием кнопок и установкой состояния в 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 отображает «Hello» и

Когда я нажимаю кнопку 2, а затем 3 отображает «Мир»

Так что он с готовностью повторно использовал пробел.

Смежные вопросы