从共享文件夹复制270GB/90万文件到SharePoint的最优方式咨询
针对270GB、近90万文件的复制需求,以下是各方案的对比及最优选择:
不推荐:拖拽模式
拖拽完全不适合这类海量文件场景:
- 稳定性差:文件数量过多时极易出现无响应、中断,且中断后无法断点续传,需重新开始
- 进度不可控:无法跟踪具体复制进度,也没有错误日志排查问题
- 效率极低:单线程复制,速度远低于工具化方案
推荐方案1:Robocopy命令行(优先选择)
利用Windows原生的Robocopy工具结合映射SharePoint网络驱动器,是最稳定高效的方案:
步骤:
映射SharePoint文档库为网络驱动器
- 打开文件资源管理器,右键「此电脑」→「映射网络驱动器」
- 输入目标文档库的完整URL(例如
https://yourtenant.sharepoint.com/sites/yoursite/Documents) - 勾选「使用其他凭据连接」,登录SharePoint账号完成映射(假设映射为
Z:盘)
执行Robocopy复制命令
打开命令提示符,运行以下命令:robocopy "\\your-shared-folder-path" Z:\ /E /COPYALL /R:3 /W:5 /MT:16 /LOG:sp_copy_log.txt参数说明:
/E:复制所有子文件夹(含空文件夹)/COPYALL:完整复制文件属性(权限、时间戳、所有者等)/R:3:文件复制失败时重试3次/W:5:重试间隔5秒/MT:16:启用16线程并行复制,大幅提升速度(可根据服务器性能调整线程数)/LOG:生成详细复制日志,便于跟踪进度和排查错误
优势:
- 原生工具,无需额外安装
- 断点续传能力强,中断后可从断点继续
- 多线程复制,速度快
- 完善的日志和错误处理机制
推荐方案2:PowerShell脚本(适合自定义需求)
如果需要自定义复制逻辑(如过滤文件、修改元数据),可以使用PnP PowerShell脚本:
步骤:
安装PnP PowerShell模块
Install-Module -Name PnP.PowerShell -Force -AllowClobber执行批量上传脚本
# 配置参数 $sourcePath = "\\your-shared-folder-path" $siteUrl = "https://yourtenant.sharepoint.com/sites/yoursite" $libraryName = "Documents" # 连接SharePoint站点 Connect-PnPOnline -Url $siteUrl -Interactive # 获取目标文档库 $library = Get-PnPList -Identity $libraryName # 递归遍历源文件夹并上传 Get-ChildItem -Path $sourcePath -Recurse -File | ForEach-Object { # 构建目标文件夹路径(保持原结构) $relativePath = $_.FullName.Substring($sourcePath.Length).TrimStart('\').Replace('\', '/') $targetFolderUrl = "$($library.RootFolder.ServerRelativeUrl)/$relativePath" -replace '//', '/' # 创建不存在的目标文件夹 $parentFolder = Split-Path $targetFolderUrl -Parent if (-not (Get-PnPFolder -Url $parentFolder -ErrorAction SilentlyContinue)) { $folderNames = ($targetFolderUrl -split '/') | Where-Object { $_ } $currentPath = $library.RootFolder.ServerRelativeUrl foreach ($name in $folderNames) { if (-not (Get-PnPFolder -Url "$currentPath/$name" -ErrorAction SilentlyContinue)) { New-PnPFolder -Name $name -Folder $currentPath } $currentPath = "$currentPath/$name" } } # 上传文件(跳过已存在的文件) try { Add-PnPFile -Path $_.FullName -Folder $targetFolderUrl -SkipIfAlreadyExists Write-Host "成功上传: $($_.FullName)" } catch { $errorMsg = "$(Get-Date): 上传失败 - $($_.FullName) | 错误: $($_.Exception.Message)" Write-Error $errorMsg Add-Content -Path ".\sp_upload_errors.log" -Value $errorMsg } }
优势:
- 灵活自定义复制逻辑
- 保持原文件夹结构
- 支持跳过已上传文件,适合断点续传
- 详细的错误日志记录
总结
- 优先选择Robocopy命令行方案:稳定、高效、易操作,适合大规模文件复制
- 若需自定义需求,选择PnP PowerShell脚本
- 绝对避免使用拖拽模式,完全不适合海量文件场景
内容的提问来源于stack exchange,提问作者ulisses
相关产品推荐
相关产品推荐

