C#异步调用PowerShell但只导入模块一次

时间:2016-06-11 21:43:49

标签: c# powershell asynchronous runspace

我正在尝试以异步方式为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();
    }
}

1 个答案:

答案 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();
    }
}