我正在尝试以异步方式为20-30个文件调用Powershell cmdlet。 虽然以下代码正常工作,但是对每个处理的文件都运行Import-Module步骤。不幸的是,这个模块需要3到4秒才能导入。
在网上搜索我可以找到对RunspacePools& InitialSessionState,但是在尝试创建CreateRunspacePool重载所需的PSHost对象时遇到了问题。
任何帮助都将不胜感激。
由于
加文
我的应用程序中的代码示例:
我使用Parallel ForEach在线程之间分发文件。
Parallel.ForEach(files, (currentFile) =>
{
ProcessFile(currentfile);
});
private void ProcessFile(string filepath)
{
//
// Some non powershell related code removed for simplicity
//
// Start PS Session, Import-Module and Process file
using (PowerShell PowerShellInstance = PowerShell.Create())
{
PowerShellInstance.AddScript("param($path) Import-Module MyModule; Process-File -Path $path");
PowerShellInstance.AddParameter("path", filepath);
PowerShellInstance.Invoke();
}
}
答案 0 :(得分:0)
正如评论中已经解释的那样,这不会与PSJobs
一起使用,因为对象被序列化并且作业本身在一个单独的过程中运行。
您可以做的是创建一个RunspacePool
,其中InitialSessionState
已导入模块:
private RunspacePool rsPool;
public void ProcessFiles(string[] files)
{
// Set up InitialSessionState
InitialSessionState initState = InitialSessionState.Create();
initState.ImportPSModule(new string[] { "MyModule" });
initState.LanguageMode = PSLanguageMode.FullLanguage;
// Set up the RunspacePool
rsPool = RunspaceFactory.CreateRunspacePool(initialSessionState: initState);
rsPool.SetMinRunspaces(1);
rsPool.SetMaxRunspaces(8);
rsPool.Open();
// Run ForEach()
Parallel.ForEach(files, ProcessFile);
}
private void ProcessFile(string filepath)
{
// Start PS Session and Process file
using (PowerShell PowerShellInstance = PowerShell.Create())
{
// Assign the instance to the RunspacePool
PowerShellInstance.RunspacePool = rsPool;
// Run your script, MyModule has already been imported
PowerShellInstance.AddScript("param($path) Process-File @PSBoundParameters").AddParameter("path", filepath);
PowerShellInstance.Invoke();
}
}