我试图在从PSCmdlet派生的类中调用\ create runspace。由于PSCmdlet包含一个默认会话状态,其中包含我想在运行空间中重用的共享数据,我想知道是否有一种编程方式将当前sessionState转换为运行空间的InitialSessionState?
如果没有这种方式,我真的不明白为什么不能在不同的运行空间内共享这样的会话状态信息。这看起来像是为我运行远程运行空间。谁能解释一下?
例如,
namespace CustomCmdlet.Test
{
[Cmdlet("Get", "Test1")]
public class GetTest1 : PSCmdlet
{
protected override void ProcessRecord()
{ WriteObject("1"); }
}
[Cmdlet("Get", "Test2")]
public class GetTest2 : PSCmdlet
{
protected override void ProcessRecord()
{
// instead of import the module dll using Runspace
// InitialSessionState.ImportModule(new string[] {"CustomCmdlet.Test.dll"});
// Runspace runspace = RunspaceFactory.CreateRunspace(InitialSessionState)
// is it any way to import the PSCmdlet.SessionState into the InitialSessionState?
}
}
我们正在使用PowerShell 4.0,如果这是相关的。
答案 0 :(得分:3)
会话状态肯定不能跨运行空间共享,它保存会话特定数据,如变量。
用于创建运行空间的InitialSessionState是运行空间的属性。您可以使用Runspace.DefaultRunspace属性通过线程本地存储访问当前的运行空间:http://msdn.microsoft.com/en-us/library/system.management.automation.runspaces.runspace.defaultrunspace(v=vs.85).aspx
也就是说,您可能希望查看RunspacePool - 所有运行空间池都将从相同的InitialSessionState创建。这样就可以避免创建比必要更多的运行空间,而只是重用池中的运行空间。