2

我想知道是否可以从旧对象创建新的 Powershell Runspace 对象。

我将同时进行一些 powershell 操作。我每次都创建 powershell 运行空间并运行某些命令。假设前 5 个命令对于所有操作都是相同的。如果我可以为所有操作只运行一次这些命令并将运行空间的副本发送到多线程方法,那将会更有效率。

意思是,我首先通过管道运行一些命令。

Runspace runspace = RunspaceFactory.CreateRunspace()
runspace.Open();
Pipeline pipeline = runspace.CreatePipeline();
pipeline.Commands.AddScript("$var = 5"); //those 5 initial commands
pipeline.Invoke();

现在,我想同时运行某些命令。

Parallel.For(0, 5, new ParallelOptions { }, i => concurrentOperations(runspace, i));

concurrentOperations方法已定义为

private static void concurrentOperations(Runspace runspace, int i)
{
        Pipeline pipeline = runspace.CreatePipeline();
        pipeline.Commands.AddScript("$newVar = $var + " + i + "; $newVar"); //newer commands which differs for each operation
        runspace.Open();
        System.Collections.ObjectModel.Collection<PSObject> result = pipeline.Invoke();
        foreach (PSObject obj in result)
        {
            Console.WriteLine("obj" + i + " : " + obj);
        }
}

现在我遇到了一个异常,“管道不能同时运行”。

因此,如果我可以制作运行空间的副本,则将仅为不同的运行空间创建管道。但是运行空间中没有Clone()方法。

有什么办法可以做到这一点?

4

0 回答 0