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

如何用PowerShell从多源复制文件直至成功?排查脚本问题

多源文件复制脚本问题分析与修正

原脚本的核心问题

  • 源路径语法错误:$Source = C:\arun这类赋值未加引号,PowerShell会将C:\arun识别为命令而非字符串,路径含空格时直接报错,语法不规范。
  • 未实现多源重试逻辑:脚本仅遍历第一个源$Source的文件,完全未用到$Source2和$Source3,遇到访问拒绝等错误时不会自动切换到下一个源尝试。
  • 路径替换逻辑错误:Replace("$Source,$source2,$source3","$Destination")是把三个源路径用逗号拼接成的字符串替换成目标路径,不符合路径映射逻辑,无法正确生成目标路径。
  • 无错误处理机制:遇到访问拒绝、文件不存在等异常时,脚本会直接终止,不会继续尝试其他源。

修正后的多源重试复制脚本

# 定义多个源路径(注意加引号)
$sources = @("C:\arun", "C:\rana", "C:\pihu")
$destinationRoot = "C:\intunesccmclient"

# 遍历每个源,尝试复制文件
foreach ($source in $sources) {
    try {
        # 获取源目录下所有文件(递归),强制终止错误触发捕获
        Get-ChildItem -Path $source -Recurse -File -ErrorAction Stop | ForEach-Object {
            # 生成目标路径:提取文件相对路径后拼接目标根路径
            $relativePath = $_.FullName.Substring($source.Length)
            $targetPath = Join-Path -Path $destinationRoot -ChildPath $relativePath

            # 目标路径不存在则创建父目录,再执行复制
            if (-not (Test-Path -Path $targetPath)) {
                $null = New-Item -Path (Split-Path -Path $targetPath -Parent) -ItemType Directory -Force -ErrorAction Stop
                Copy-Item -Path $_.FullName -Destination $targetPath -Force -ErrorAction Stop
                Write-Host "成功从[$source]复制文件:$($_.FullName)"
            }
        }
        # 当前源复制完成,直接退出循环
        break
    }
    catch {
        Write-Warning "源[$source]访问失败:$($_.Exception.Message),尝试下一个源..."
        continue
    }
}

修正说明

  • 多源管理:用数组$sources存储所有源路径,便于遍历和后续扩展。
  • 错误处理:通过try/catch捕获访问拒绝、文件不存在等异常,遇到错误时自动切换到下一个源。
  • 路径映射:用Substring提取文件相对路径,再用Join-Path生成正确的目标路径,避免原脚本的替换逻辑错误。
  • 目录预创建:复制前自动创建目标文件的父目录,避免因目录不存在导致复制失败。
  • 终止逻辑:只要某一个源复制成功,就终止后续源的尝试,符合需求。

内容的提问来源于stack exchange,提问作者sccm InTune

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 15:22:49