0

我不知道如何问确切的问题,但让我试一试,希望我可以逐步改进:)

我知道可以创建的 powershell 会话的数量是有限制的(例如:我尝试了一个简单的程序来打开 powershell 交换远程会话,但它不允许我创建更多的 18 个 powershell 会话。所以我假设它是明确的数字)

另一方面,我可以创建和打开多少个运行空间?换句话说,每当我尝试执行 cmds 时,我是否可以简单地创建一个新的运行空间 - 这样我就不需要担心运行空间状态,因为每当我尝试执行 cmd 它总是使用新的运行空间。

场景:我创建了一个远程会话(准确地说是到邮箱交换服务器的 psremote 会话 - 在 C# .net 中以编程方式)。我还创建了一个运行空间并使用运行空间和 powershell 会话在目标服务器上执行 powershell cmds(即在我的 excahnge 服务器上 - 请参阅代码片段 #1 以了解我如何在远程服务器上执行脚本块)

案例:假设目标服务器重新启动(即;我创建的远程会话的邮箱服务器重新启动)

问题:一旦我重新启动服务器,程序就会抛出运行空间处于无效状态(InvalidRunspaceStateException - http://msdn.microsoft.com/en-us/library/system.management.automation.runspaces.invalidrunspacestateexception(v= vs.85).aspx )

问题:修复它的最佳方法是什么:)?

我知道修复它的一种简单方法是捕获 invalidstate 异常并再次创建运行空间和远程会话 - 但这是理想的方法吗?

是否有任何其他最佳或更好的方法来管理会话,而不是捕获异常并再次创建运行空间和会话?

    //(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 不为空(有异常)

可能,当我看到一个 pssession 的运行空间没有打开时,我应该只创建一个新的 pssession。

在此先感谢,问候,梦想家

4

1 回答 1

0

如前所述,我刚刚检查了会话的运行空间状态。如果它被打破,丢弃会话创建新的。

您可以参考代码片段:死锁 - 如何最好使用 Visual Studio 调试器(.net 编程)知道哪个线程有锁?

问候,梦想家

于 2013-06-02T13:21:23.603 回答