在.Net中保持Powershell运行空间

Use*_*834 2 .net powershell

我正在尝试从VB.Net中运行一些PowerShell代码(如果你知道,C#编码器也可以提供帮助!).
代码的第一部分,我需要用密码连接到一个控制器,我需要保持连接打开.我只需点击一下按钮就可以运行其他命令(获取文件,显示文件,删除特定文件).
如何保持运行空间打开并分别运行每行代码?我需要使用"CreateRunspacePool"吗?如果是这样,我该如何使用它?

编辑: 我现在正在玩RunspaceStateInfo.State,但我不知道如何保持连接打开.我已经尝试过将Page_Load和Page_Init事件打开一次,但是在某个地方,它会关闭.我确实删除了".Close"命令

And*_*dre 5

你还没有提供很多信息,但是你在谈论Page_Load和Page_Init我假设你试图从ASP.NET Web应用程序中执行此操作.通过按下按钮并在Runspace上设置状态.

如果这是一个winforms应用程序,您只需创建一个运行空间:

Runspace runspace = RunspaceFactory.CreateRunspace(Host);
Run Code Online (Sandbox Code Playgroud)

然后创建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'")
Run Code Online (Sandbox Code Playgroud)

您可以保留运行空间,只需在按钮单击与同一个运行空间之间运行脚本.

如果你在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"];
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我测试了它的工作原理:

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();
}
Run Code Online (Sandbox Code Playgroud)

当我单击按钮1然后单击3时,它显示"Hello"和

当我点击按钮2然后按3时它显示"世界"

所以它成功地重用了运行空间.