You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 22:57:03