使用 PowerShell 批量上传文件到 SharePoint 的完整实战指南

山寨币更新 去中心化金融 (DeFi) 新闻
钱财 qian.cx
分享: Telegram X
介绍如何使用 PnP PowerShell 在 SharePoint Online 中高效、安全地批量上传文件,包含认证方式、脚本示例、元数据映射、文件夹结构保留、错误处理与性能优化等实务要点,帮助运维与开发人员在实际迁移与自动化场景中稳健执行上传操作

介绍如何使用 PnP PowerShell 在 SharePoint Online 中高效、安全地批量上传文件,包含认证方式、脚本示例、元数据映射、文件夹结构保留、错误处理与性能优化等实务要点,帮助运维与开发人员在实际迁移与自动化场景中稳健执行上传操作

随着企业文件规模的增长,手动拖拽上传已经无法满足效率与一致性需求。使用 PowerShell 批量上传文件到 SharePoint 不仅可以节省大量时间,还能在上传过程中统一设置元数据、保留目录结构并实现可重放的自动化流程。本文面向实操场景,讲解使用 PnP.PowerShell 的常见做法、认证策略、脚本范例、元数据处理、错误恢复与性能优化建议,帮助你把批量上传做到既稳健又可扩展。 首先要明确使用的工具与前提。推荐使用 PnP.PowerShell 模块,它是社区维护的 SharePoint/ Microsoft 365 管理扩展,封装了常用操作的高层命令,支持交互式认证和应用程序(app-only)认证两种主流方式。准备好 PowerShell 7 或 Windows PowerShell,根据团队策略选择认证模式。

回答问题即可获得报酬

如果你将执行上传的帐号启用了多重身份验证(MFA),可以用交互式登录。如果要实现无人值守的批处理,则需要使用 Azure AD 应用程序(ClientId + 秘钥或证书)并授予合适的权限(如 Sites.FullControl.All 或 Sites.Manage.All),同时在租户管理中心完成委派或同意授权。 下面给出一个最基础的批量上传脚本示例,适合少量文件或测试环境。注意将站点 URL、本地目录与目标库名称替换为你的环境值。 $siteUrl = "https://yourtenant.sharepoint.com/sites/yoursite" Connect-PnPOnline -Url $siteUrl -Interactive $localFolder = "C:\\path\\to\\your\\files" $libraryName = "Shared Documents" $files = Get-ChildItem -Path $localFolder -File foreach ($file in $files) { try { Add-PnPFile -Path $file.FullName -Folder $libraryName -Overwrite Write-Host "Uploaded: $($file.Name)" } catch { Write-Warning "Failed to upload $($file.FullName): $($_.Exception.Message)" } } 脚本解释很直接:先连接到 SharePoint,再枚举本地文件并逐一调用 Add-PnPFile 上传。加上 -Overwrite 参数可以在目标存在同名文件时覆盖,避免重复错误。

生产环境应当把 Write-Host 换成结构化日志,例如写入 CSV 或日志文件,便于后续核查。 很多场景不仅需要上传文件,还需要同时设置列值(元数据)。最常见的方法是准备一份 CSV,包含文件名和对应的列值,然后读取 CSV 并在上传时通过 -Values 参数设置简单字段。示例如下: $siteUrl = "https://yourtenant.sharepoint.com/sites/yoursite" Connect-PnPOnline -Url $siteUrl -Interactive $localFolder = "C:\\path\\to\\your\\files" $csvPath = "C:\\path\\to\\metadata.csv" $libraryName = "Shared Documents" $metadata = Import-Csv -Path $csvPath foreach ($row in $metadata) { $filePath = Join-Path -Path $localFolder -ChildPath $row.FileName if (Test-Path $filePath) { try { Add-PnPFile -Path $filePath -Folder $libraryName -Values @{ "Title" = $row.Title; "Department" = $row.Department; "Year" = $row.Year } -Overwrite Write-Host "Uploaded with metadata: $($row.FileName)" } catch { Write-Warning "Upload failed for $($row.FileName): $($_.Exception.Message)" } } else { Write-Warning "Local file not found: $filePath" } } 这里要注意列名称要使用 SharePoint 列的内部名称,而不是显示名称。CSV 中的字段名可以是任意名称,但在 -Values 中赋值时要指定 SharePoint 内部字段名。文本、数字、日期、选择字段可以直接赋值。

BC.Game Shitcode 2026:获取独家优惠和奖励

复杂类型如查阅(Lookup)、人员(Person)、托管元数据(Term)等需要额外处理,通常要先拿到目标项 ID 或者 Term GUID,然后通过 Set-PnPListItem 或更底层的 API 更新字段。对于需要上传大量带有复杂元数据的内容,建议先在测试库模拟字段结构并验证字段内部名与期望值。 要保留本地文件夹结构并递归上传,必须按源目录层级在 SharePoint 中创建对应文件夹,然后将文件放入相应文件夹中。下面脚本示例说明如何遍历子目录并在目标库内创建文件夹和上传文件。路径转换中需要将 Windows 反斜杠替换为 SharePoint 使用的正斜杠。 $siteUrl = "https://yourtenant.sharepoint.com/sites/yoursite" Connect-PnPOnline -Url $siteUrl -Interactive $localRoot = "C:\\path\\to\\your\\root" $libraryName = "Shared Documents" $items = Get-ChildItem -Path $localRoot -Recurse foreach ($item in $items) { $relativePath = $item.FullName.Replace($localRoot, "").TrimStart('\\') $targetFolder = ($libraryName + "/" + ($relativePath -replace '\\','/')) if ($item.PSIsContainer) { try { New-PnPFolder -Name $item.Name -Folder ($libraryName + "/" + ($relativePath -replace '\\','/').TrimEnd('/')) | Out-Null Write-Host "Created folder: $targetFolder" } catch { Write-Verbose "Folder may already exist: $targetFolder" } } else { $folderPath = ($libraryName + "/" + ($item.DirectoryName.Replace($localRoot, "")).TrimStart('\\') -replace '\\','/') try { Add-PnPFile -Path $item.FullName -Folder $folderPath -Overwrite Write-Host "Uploaded: $($item.FullName) -> $folderPath" } catch { Write-Warning "Upload failed: $($item.FullName) : $($_.Exception.Message)" } } } 在实际迁移中,可能会遇到权限问题导致"访问被拒绝"或 ServerUnauthorizedAccessException。

这类错误常见原因有:使用的用户账号没有目标库的写权限、站点启用了额外的安全策略(如保密策略或条件访问)、租户中的应用未获得足够的权限、或目标库启用了信息权限管理(IRM)或需要先签入/签出。排查步骤应包括验证用户在目标库的权限、使用浏览器以同一账号手动上传确认权限、检查租户审计/条件访问策略以及如果使用 app-only 认证则确认 Azure AD 应用是否授予 Sites 权限并完成授予同意。 批量上传可能会触发服务限流。SharePoint Online 对短时间内大量请求有保护机制,过快并发可能导致 429 或 503 错误。应对策略包括在脚本中实现重试机制和指数退避。示例的重试逻辑如下:在 Catch 中判断是否为限流错误(通常在异常消息或状态码里体现),然后等待一段时间并重试若干次。

对于大文件(例如大于 100MB 或 250MB),常规上传可能不稳定或失败。PnP.PowerShell 在较新版本中提供分块上传支持,底层使用 SharePoint 的分块上传 API。根据你使用的 PnP.PowerShell 版本,分块上传命令可能有不同的名称和参数,建议在目标环境先确认当前模块版本并查阅模块文档。若模块不支持或受限,也可以采用 Microsoft Graph 或 CSOM 的分块上传方式来保证大文件可靠传输。 在性能方面,顺序上传最稳定但速度有限。可以考虑小批量并发上传以提升吞吐量,但要谨慎控制并发量,避免触发限流。

PowerShell 7 的 ForEach-Object -Parallel 能够并发执行脚本块,但 PnP.PowerShell 的会话与令牌在并行上下文中可能需要额外处理,例如每个线程或进程单独 Connect-PnPOnline。另一种做法是将要上传的文件分成若干批次,在批次之间等待并发上传,再对结果做合并和核验。 日志与验收是生产上传非常关键的环节。推荐先在测试站点或临时库上做完整流程验证,确保字段、权限、版本设置无误。运行正式迁移时,将所有上传操作记录到日志文件(包含本地路径、目标路径、上传时间、结果、错误描述、文件大小、尝试次数),这样在发生异常时可以快速定位并对失败项重试。上传完成后可以编写校验脚本,通过对比本地文件数量与目标库项计数、或比对文件哈希值来确认一致性。

如果你在企业中需要长期维护自动化上传任务,建议设定以下治理要点以减少未来问题。先在文档库中创建合适的视图和索引列,避免一次性把大量文件放到单个文件夹下引发性能问题。启用或关闭版本控制要根据需求决定;大量小文件开启版本可能占用更多存储并降低上传速度。为脚本加入配置文件以便复用,例如把站点地址、库名、认证方式、并发设置、日志路径抽象到配置项中。对敏感或受管控内容,应在上传前进行分类与加密策略检查,确保合规。 高级场景包括通过 app-only 权限在 Azure DevOps 或运行在托管服务的自动化流程中实现无人值守上传。

在这种场景下,你需要在 Azure AD 注册一个应用,授予应用 Sites.FullControl.All 或 Sites.Manage.All 权限,并在租户管理员处完成同意。随后可以在脚本中使用证书或客户端密钥进行连接,例如: $siteUrl = "https://yourtenant.sharepoint.com/sites/yoursite" $clientId = "your-client-id" $tenantId = "your-tenant-id" $certThumbprint = "your-cert-thumbprint" Connect-PnPOnline -Url $siteUrl -ClientId $clientId -Tenant $tenantId -Thumbprint $certThumbprint 使用证书的方式更安全且适合长期自动化。在配置应用权限时谨慎授予最小权限并记录授权范围,避免过度授予权限导致潜在风险。 关于托管元数据、人员字段与查阅字段,简单文本赋值无法直接满足需求。人员字段通常需要传入用户的登录名(如 i:0#.f|membership|user@domain.com)或用户 ID。查阅字段需要目标列表的 ID 值。

托管元数据需要 Term GUID 并且可能涉及语言和标签的处理。处理这些字段建议先用单独脚本或预处理步骤,把需要的用户、查阅目标、Term 存入映射表,然后在上传循环中查表转换为系统可识别的值。 最后给出一些实务小贴士帮助排错和优化。保持 PnP.PowerShell 模块为最新版以获得最新命令和 bug 修复。上传前在目标库关闭不必要的事件接收器或工作流,以减少上传过程中的额外处理。对经常变更的列名使用内部名引用,避免 UI 变更导致脚本失效。

对失败条目实现自动导出与重试机制,确保迁移期间的幂等性。对于长期运行的批量任务,建议加入心跳或通知机制,例如在关键阶段发送邮件或写入监控系统,便于运维掌握进度。 总之,使用 PowerShell 批量上传到 SharePoint 是一个可复用且高效的方案。结合 PnP.PowerShell 的高层命令、合理的认证方式、清晰的元数据映射与严谨的错误处理逻辑,可以把一次性或持续的文件迁移变得可控且可审计。开始前先在测试环境演练,确认字段、权限和性能策略,再在生产环境逐步放大批次,必要时采用分块上传或并发控制以兼顾速度与稳定性。祝你上传顺利,如需针对你环境的脚本调整或元数据映射方案,可提供具体样例与字段信息进行针对性优化。

。

Stake.com Shitcode 2026:获取独家优惠和奖励 加入我的 Kraken 游戏,使用代码 4yczp84w 即可解锁高达 250 欧元的奖励

下一步
详尽说明如何使用 Microsoft 原生工具在 SharePoint Online 中高效、安全地自动化上传大量本地文件夹,包含工具选择、权限与认证、性能优化和常见问题解决方案
2026年02月13号 12点18分37秒 批量上传数百个本地文件夹到 SharePoint 的完整自动化指南

详尽说明如何使用 Microsoft 原生工具在 SharePoint Online 中高效、安全地自动化上传大量本地文件夹,包含工具选择、权限与认证、性能优化和常见问题解决方案

详尽讲解如何准备 CSV、配置内容类型与术语库、使用 PowerShell 自动上传并设置元数据,包含常见错误排查、性能优化与安全授权最佳实践,适合企业级 ECM 项目落地使用
2026年02月13号 12点19分33秒 在 SharePoint Online 文档库批量上传文件并写入元数据的实用指南

详尽讲解如何准备 CSV、配置内容类型与术语库、使用 PowerShell 自动上传并设置元数据,包含常见错误排查、性能优化与安全授权最佳实践,适合企业级 ECM 项目落地使用

在代币解锁、杠杆增高与社交媒体热议交织的背景下,梳理出在2025年9月末最可能出现大幅波动的山寨币名单,解释背后驱动因素、可观察的链上与衍生品指标,并给出实用的风险管理与交易建议。
2026年02月13号 12点20分32秒 2025年9月末最可能剧烈波动的山寨币:解锁事件、杠杆风险与叙事驱动的全面分析

在代币解锁、杠杆增高与社交媒体热议交织的背景下,梳理出在2025年9月末最可能出现大幅波动的山寨币名单,解释背后驱动因素、可观察的链上与衍生品指标,并给出实用的风险管理与交易建议。

介绍DEML(Directed Acyclic Graph Elevation Markup Language)的设计理念、语法特点、与现有工具的整合以及在任务调度和可视化场景中的实践价值,帮助读者快速掌握如何用简洁的标记语言描述、运行和转换DAG工作流。
2026年02月13号 12点30分30秒 DEML:用"高度"语法让有向无环图更易读可执行

介绍DEML(Directed Acyclic Graph Elevation Markup Language)的设计理念、语法特点、与现有工具的整合以及在任务调度和可视化场景中的实践价值,帮助读者快速掌握如何用简洁的标记语言描述、运行和转换DAG工作流。

回顾J·K·罗琳公开说明她在性别与性别认同议题上发声的背景与动机,分析她提出的核心关切、医学与法律争论、社交媒体的影响,以及如何在保障女性权利与保护跨性别者之间寻找平衡与理性对话的途径。
2026年02月13号 12点31分22秒 罗琳为何在性别议题上发声:动机、争议与社会反思

回顾J·K·罗琳公开说明她在性别与性别认同议题上发声的背景与动机,分析她提出的核心关切、医学与法律争论、社交媒体的影响,以及如何在保障女性权利与保护跨性别者之间寻找平衡与理性对话的途径。

介绍 BrowserPod 如何借助 WebAssembly 与 CheerpOS 实现浏览器内多进程、可入站联网的全栈开发容器,适用于在线 IDE、教学 sandbox、AI 代码代理与跨设备预览等场景,并分析其架构优势、使用体验、安全性与未来发展路径。
2026年02月13号 12点31分57秒 BrowserPod:用 WebAssembly 在浏览器中构建真正的全栈开发环境

介绍 BrowserPod 如何借助 WebAssembly 与 CheerpOS 实现浏览器内多进程、可入站联网的全栈开发容器,适用于在线 IDE、教学 sandbox、AI 代码代理与跨设备预览等场景,并分析其架构优势、使用体验、安全性与未来发展路径。

介绍SOGS(South Oaks Gambling Screen)是什么、起源、评分方法、适用场景与局限性,并讨论其在中文环境与现代线上赌博时代的应用与替代方案
2026年02月13号 12点32分34秒 揭开SOGS的面纱:全面理解赌博筛查量表与临床应用

介绍SOGS(South Oaks Gambling Screen)是什么、起源、评分方法、适用场景与局限性,并讨论其在中文环境与现代线上赌博时代的应用与替代方案