2

我正在尝试从 VB.Net 中运行一些 PowerShell 代码(如果您知道,C# 编码器也可能会有所帮助!)。
代码的第一部分,我需要使用密码连接到 na-controller,并且需要保持连接打开。我还有其他需要通过单击按钮运行的命令(获取文件、显示文件、删除特定文件)。
如何保持运行空间打开并分别运行每一行代码?我需要使用“CreateRunspacePool”吗?如果是这样,我该如何使用它?

编辑: 我现在正在使用 RunspaceStateInfo.State,但我不知道保持连接打开的方法。我已经尝试了 Page_Load 和 Page_Init 事件来让它打开一次,但是在某个地方,它会关闭。我确实删除了“.Close”命令

4

1 回答 1

5

您没有提供很多信息,但是从您谈论 Page_Load 和 Page_Init 开始,我假设您正在尝试从 ASP.NET Web 应用程序中执行此操作。通过按下按钮和设置运行空间上的状态。

如果这是一个 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 时,它显示“世界”

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

于 2012-05-30T20:12:18.353 回答