Вопрос по .net – Сохранение пространства выполнения Powershell в .Net

2

Я пытаюсь запустить некоторый код PowerShell из VB.Net (кодеры C # также могут помочь, если вы знаете!).
Первая часть кода, мне нужно подключиться к na-контроллеру с паролем, и мне нужно держать соединение открытым. У меня есть другие команды, которые мне нужно выполнить одним нажатием кнопки (получить файлы, показать файлы, удалить определенные).
Как я могу держать пространство выполнения открытым и запускать каждую строку кода отдельно? Нужно ли использовать & quot; CreateRunspacePool & quot ;? Если да, то как мне его использовать?

Edit:  Сейчас я играю с RunspaceStateInfo.State, но я не знаю, как сохранить соединение открытым. Я пробовал события Page_Load и Page_Init, чтобы он просто был открыт один раз, но где-то вдоль линии он закрывается. Я действительно удалил & quot; .Close & quot; команда

Ваш Ответ

1   ответ
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, отображается «Привет» а также

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

Так что он успешно использовал пространство.

Похожие вопросы