我不知道如何问确切的问题,但让我试一试,希望我可以逐步改进:)
我知道可以创建的 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。
在此先感谢,问候,梦想家