PowerShell用Start-ThreadJob并行运行Robocopy时Target参数为空报错
问题原因
$input是PowerShell的自动枚举器变量,而非数组类型。第一次调用Write-Host "$($input[0]) $($input[1])"时,枚举器已经遍历完所有传入的元素,指针走到末尾,后续再访问$input[0]和$input[1]就会返回空值,所以才会出现参数能正常打印但绑定的时候为空的矛盾现象。- 现有写法中启动作业后立即调用
Receive-Job -Wait,会逐个等待作业执行完成,无法实现并行运行的预期效果。
解决方案
修改作业内的逻辑,先将传入的$input值转存为本地数组变量,避免重复访问枚举器;如果需要真并行,先批量启动所有作业再统一等待结果。
修正后的完整代码如下:
function Invoke-Robocopy { param ( [Parameter(Mandatory=$true)][string]$Source, [Parameter(Mandatory=$true)][string]$Target, [string]$File = $null ) $common_args = ( '/dcopy:dat', '/r:2', '/w:5', '/log+:robocopy.log', '/mt:2', '/ns', '/nc', '/nfl', '/ndl', '/np' ) if (-Not $File) { $common_args += ('/e', '/purge') } robocopy "$Source" "$Target" "$File" $common_args } $dir_pairs = ( ('O:\projects', 'N:\projects'), ("$env:SystemRoot\System32\GroupPolicy\Machine", 'N:\sys\Windows\System32\GroupPolicy\Machine'), ("$env:SystemRoot\System32\GroupPolicy\User", 'N:\sys\Windows\System32\GroupPolicy\User') ) # 先批量启动所有作业实现并行 $jobs = foreach ($pair in $dir_pairs) { Start-ThreadJob -InputObject $pair { ${Function:Invoke-Robocopy} = ${using:Function:Invoke-Robocopy} # 先把枚举器转存为本地数组,避免重复访问问题 $paths = @($input) Write-Host "$($paths[0]) $($paths[1])" $robo_args = @{ Source = $paths[0] Target = $paths[1] } Invoke-Robocopy @robo_args } } # 统一等待所有作业完成并接收结果 $jobs | Receive-Job -Wait -AutoRemoveJob
内容的提问来源于stack exchange,提问作者gargoylebident
相关产品推荐
相关产品推荐

