如何用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
相关产品推荐
相关产品推荐

