父Runspace内调用RunspacePool无文件生成问题排查求助
RunspacePool嵌套调用时文件无法生成的问题排查
尝试使用RunspacePool并行执行文件创建操作,单独运行RunspacePool相关代码时功能正常,但在父Runspace中调用该RunspacePool时,文件始终无法生成。以下是相关代码,请指出问题所在:
function RunTestpool { param() # Worker线程:用于创建文件,由Worker2线程调用 $Worker = { param($Filename) Write-Output "Inside the script tag" $Item = New-Item -Name $Filename -Path 'D:\Test' Write-Output "$($Item.FullName)" } # Worker2线程:遍历文件名,调用上面的Worker线程创建文件 $Worker2 = { param() $MaxRunspaces = 5 $RunspacePool = [runspacefactory]::CreateRunspacePool(1, $MaxRunspaces) $RunspacePool.Open() $Jobs = New-Object System.Collections.ArrayList $Filenames = @("file1.txt", "file2.txt", "file3.txt", "file4.txt", "file5.txt", "file6.txt", "file7.txt", "file8.txt", "file9.txt", "file10.txt", "file11.txt") foreach ($File in $Filenames) { Write-Host "Creating runspace for $File" $p1 = [powershell]::Create() $p1.RunspacePool = $RunspacePool $inputparams =@{ Filename=$File } $p1.AddScript($Worker).AddParameters($inputparams) | Out-Null $JobObj = New-Object -TypeName PSObject -Property @{ Job = $p1.BeginInvoke() Instance = $p1 } $Jobs.Add($JobObj) | Out-Null } while ($Jobs.Job.IsCompleted -contains $false) { Write-Output "$($(Get-date).Tostring()) Still running..." Start-Sleep 1 } foreach($j in $Jobs) { $j.Instance.EndInvoke($j.Job) } } if ($global:TestpoolJob) { $global:TestpoolJob.Instance.EndInvoke($global:TestpoolJob.Job) | Out-Null $global:TestpoolJob.Job.AsyncWaitHandle.Dispose() $global:TestpoolJob.Instance.Runspace.Close() $global:TestpoolJob.Instance.Runspace.Dispose() $global:TestpoolJob.Instance.Dispose() $global:TestpoolJob = $null $job=$null } # 父Runspace $path = Convert-Path . $k = [PowerShell]::Create() $k.Runspace = [RunspaceFactory]::CreateRunspace() $k.Runspace.Open() $inputparams =@{ #Filename="file1.txt" path=$path } $k.AddScript($Worker2).AddParameters($inputparams)| Out-Null $job = $k.BeginInvoke() $global:TestpoolJob = New-Object PSObject -Property @{ Instance = $k Job = $job } }
核心问题及修复方案
$Worker脚本块语法错误
原代码中$Worker里的Write-Output "Inside the script tag未闭合字符串引号,导致整个脚本块语法失效,无法执行后续的文件创建逻辑。修复方法是给该语句添加闭合引号(如上述代码中修正后的写法)。目标目录存在性检查
如果D:\Test目录不存在,New-Item会执行失败。可以添加-Force参数自动创建目录(若不存在):$Item = New-Item -Name $Filename -Path 'D:\Test' -Force父Runspace异步调用等待(可选)
当前父Runspace使用BeginInvoke异步调用$Worker2,函数执行完毕后不会等待$Worker2完成。若需要确保所有文件创建完成后再结束函数,可在末尾添加等待逻辑:while (!$job.IsCompleted) { Start-Sleep 1 } $k.EndInvoke($job)
内容的提问来源于stack exchange,提问作者Rudrani Angira
相关产品推荐
相关产品推荐

