0

正確な質問をする方法がわかりませんが、試してみてください。うまくいけば、段階的に改善できます:)

作成できる PowerShell セッションの数には制限があることを理解しています (例: PowerShell Exchange リモート セッションを開く簡単なプログラムを試しましたが、18 個以上の PowerShell セッションを作成することはできませんでした。番号)

一方で、いくつのランスペースを作成して開くことができますか? つまり、cmd を実行しようとするたびに新しい実行空間を単純に作成できますか? この方法では、cmd を実行しようとするたびに常に新しい実行空間が使用されるため、runsapce の状態について心配する必要はありません。

シナリオ: リモート セッションを作成しました (正確には、メールボックス交換サーバーへの psremote セッション - プログラムで C# .net を使用)。また、実行空間を作成し、実行空間と PowerShell セッションを使用して、ターゲット サーバーで PowerShell コマンドを実行しています (つまり、exchange サーバーで - コード スニペット #1 を参照して、リモート サーバーでスクリプト ブロックを実行する方法を確認してください)。 )

ケース: ターゲット サーバーが再起動されたと仮定します (つまり、リモート セッションを作成したメールボックス サーバーが再起動されました)。

問題: サーバーを再起動するとすぐに、実行空間が無効な状態であることをプログラムがスローします (InvalidRunspaceStateException - http://msdn.microsoft.com/en-us/library/system.management.automation.runspaces.invalidrunspacestateexception(v= vs.85).aspx )

質問: それを修正する最適な方法は何ですか :)?

これを修正する簡単な方法の 1 つは、invalidstate 例外をキャッチし、runsapce とリモート セッションを再度作成することだとわかっていますが、これは理想的な方法ですか?

例外をキャッチして実行空間とセッションを再度作成するのではなく、セッションを管理するための最適またはより良い方法はありますか?

    //(sample) CODE SNIPPET1 - EXECUTING PS CMDS ON REMOTE SERVER
    Runspace rs = RunspaceFactory.CreateRunspace();
    rs.Open();
    using (Pipeline pipeline = rs.CreatePipeline())
    {
        if (null == session)
        {
            pipeline.Commands.Add(command);
        }
        else
        {
            Command cmd = new Command("invoke-command");
            cmd.Parameters.Add("session", session);
            cmd.Parameters.Add("scriptblock", ScriptBlock.Create(command.ToString()));
            if (null != argumentList)
            {
                cmd.Parameters.Add("ArgumentList", argumentList);
            }
            pipeline.Commands.Add(cmd);
        }
        var results = pipeline.Invoke();
    }

ところで、いくつかのデバッグの後、これは私が見つけたものです:

添付の画像を参照してください (PSsession.Runspace.RunspaceInfo.State が壊れており、Pssession.runspace.runspaceinfo.reason が null ではありません (例外があります))。

おそらく、pssession の実行空間が開かれていないのを見るたびに、新しい pssession を作成する必要があります。

前もって感謝します、よろしく、ドリーマー

4

1 に答える 1

0

前述のように、セッションの実行空間の状態を確認しました。壊れている場合は、新しく作成されたセッションを破棄します。

次のコード スニペットを参照できます:デッドロック - ビジュアル スタジオ デバッガー (.net プログラミング) を使用して、どのスレッドがロックされているかを知るには?

よろしく、ドリーマー

于 2013-06-02T13:21:23.603 に答える