2

VB.Net内からPowerShellコードを実行しようとしています(ご存知の場合は、C#コーダーも役立つ場合があります)。
コードの最初の部分では、パスワードを使用してna-controllerに接続する必要があり、接続を開いたままにしておく必要があります。ボタンをクリックするだけで実行する必要のある他のコマンドがあります(ファイルの取得、ファイルの表示、特定のコマンドの削除)。
ランスペースを開いたままにして、コードの各行を個別に実行するにはどうすればよいですか?「CreateRunspacePool」を使用する必要がありますか?もしそうなら、私はそれをどのように使用しますか?

編集: 私は今RunspaceStateInfo.Stateで遊んでいますが、接続を開いたままにする方法がわかりません。Page_LoadイベントとPage_Initイベントを一度だけ開いてみましたが、途中で閉じます。「.Close」コマンドを削除しました

4

1 に答える 1

5

あなたは多くの情報を提供していませんが、Page_LoadとPage_Initについて話していることから、ASP.NETWebアプリケーションからこれを実行しようとしていると思います。ボタンを押して、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の順にクリックすると、「ワールド」と表示されます。

そのため、ランスペースを正常に再利用しました。

于 2012-05-30T20:12:18.353 に答える