【FAQ】Script导出SharePoint 目录文件列表并统计大小
一、只导出文件列表的方法
1) 保存脚本(建议名:D:\tmp\Export-SharePoint-FileList.ps1
)
<#
导出 SharePoint 指定文件夹(含子文件夹)的文件列表到 CSV(不统计大小)
前提:已安装 PowerShell 7 + PnP.PowerShell;已在 Entra 注册并拿到 ClientId
#># =====[ 需要修改的 3 个参数 ]=====
$SiteUrl = "https://<你的租户>.sharepoint.com/sites/<站点名>" # 例:https://suniatechnologyinc.sharepoint.com/sites/SuniaDUP2
$ClientId = "<你的ClientID>" # 你们自建的 App Registration 的 Application (client) ID
$FolderSiteRelativeUrl = "Shared Documents/路径/到/目标目录" # 例:Shared Documents/5 - Projects/2025 - OCR - EDU/1 - Raw Data/1 - Shenzen/OCR_data_collection_china
# 也可以用“文档/...”;以浏览器地址栏显示为准,注意把 %20 换成空格# =====[ 连接站点 ]=====
Connect-PnPOnline -Url $SiteUrl -ClientId $ClientId -Interactive# =====[ 导出 ]=====
$exportDir = "D:\tmp"
if (-not (Test-Path $exportDir)) { New-Item -ItemType Directory -Path $exportDir | Out-Null }
$outCsv = Join-Path $exportDir ("SharePoint_FileList_{0}.csv" -f (Get-Date -Format "yyyyMMdd_HHmmss"))# 递归获取文件(不取大小,避免各种字段/阈值问题)
$files = Get-PnPFolderItem -FolderSiteRelativeUrl $FolderSiteRelativeUrl -Recursive |Where-Object { $_.ItemType -eq "File" } |Select-Object Name, ServerRelativeUrl, TimeLastModified$files | Export-Csv $outCsv -NoTypeInformation -Encoding UTF8
Write-Host "文件清单已导出: $outCsv" -ForegroundColor Cyan
提示:
$FolderSiteRelativeUrl
必须是站点相对路径(不带/sites/...
前缀)。从浏览器地址栏复制/sites/<站点名>/...
后,去掉前面的/sites/<站点名>/
即可;把%20
改成空格。
2) 运行脚本
# 第一次运行脚本需要(当前用户范围即可)
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned# 执行
pwsh -File "D:\tmp\Export-SharePoint-FileList.ps1"
# 或者在 PowerShell 7 里:
# cd D:\tmp
# .\Export-SharePoint-FileList.ps1
3) 常见问题(只针对“导出列表”场景)
-
结果为空或报错 “Not well formatted JSON stream”
先重新Connect-PnPOnline
,再运行;网络不稳也会触发,重试即可。 -
报 5000 阈值
仅导出名称/路径一般很少触发。如果依然触发,说明目录极大:- 先在网页里确认是否可以进一步细分子目录;
- 分多次填不同的
$FolderSiteRelativeUrl
跑即可。
-
路径不对
把浏览器里/sites/<站点名>/
后面的部分(Shared Documents/...
或文档/...
)原样粘贴到$FolderSiteRelativeUrl
。 -
库名显示为“文档”但路径用哪个?
以地址栏为准:地址如果是/Shared%20Documents/...
就写Shared Documents/...
;如果是/文档/...
就写文档/...
。
如果你之后还需要对比本地与云端差异,我可以在这个脚本基础上增加一个“比对本地目录文件名 & 路径”的步骤;但你现在只要列表,这个版本最稳、最省事。
二、导出文件列表并统计大小的方法
Q1:为什么要用 PowerShell 而不是直接在网页导出?
-
网页端导出 Excel 功能对文档库视图有 5000 项限制,大目录经常超限
-
PowerShell 可以直接通过 SharePoint API 分页拉取,不受单页限制
-
可一次性导出:
- 文件名
- 文件路径
- 文件大小(MB)
- 最后修改时间
- 目录总大小
Q2:准备工作
-
安装 PowerShell 7(64 位版)
下载地址
选择PowerShell-<版本>-win-x64.msi
安装 -
安装 PnP.PowerShell 模块:
Install-Module -Name PnP.PowerShell -Force -AllowClobber
-
Azure Entra ID 全局管理员注册一个 App(一次性操作):
-
名称随意(例如
PnP.PowerShell
) -
重定向 URI 选
http://localhost
-
分配 Microsoft Graph API 权限:
Sites.Read.All
Sites.ReadWrite.All
-
点击“Grant admin consent”授权
-
复制 Application (client) ID(后续连接用)
-
Q3:执行脚本
-
连接到 SharePoint 站点:
Connect-PnPOnline -Url "https://<租户名>.sharepoint.com/sites/<站点名>" `-ClientId "<你的ClientID>" `-Interactive
-
设置目标目录路径(Server Relative URL)
-
必须以
/sites/...
开头 -
例如:
/sites/SuniaDUP2/Shared Documents/5 - Projects/2025 - OCR - EDU/1 - Raw Data/1 - Shenzen/OCR_data_collection_china
-
-
运行导出脚本(输出到
D:\tmp
):$folderServerRelativeUrl = "/sites/SuniaDUP2/Shared Documents/5 - Projects/2025 - OCR - EDU/1 - Raw Data/1 - Shenzen/OCR_data_collection_china" $exportDir = "D:\tmp" if (-not (Test-Path $exportDir)) { New-Item -ItemType Directory -Path $exportDir | Out-Null } $outCsv = Join-Path $exportDir ("SharePoint_FileList_{0}.csv" -f (Get-Date -Format "yyyyMMdd_HHmmss"))$items = Get-PnPListItem -List "Documents" -PageSize 2000 `-FolderServerRelativeUrl $folderServerRelativeUrl `-Fields "FileLeafRef","FileRef","File_x0020_Size","Modified"$files = $items | Where-Object { $_.FileSystemObjectType -eq "File" } |Select-Object `@{Name="Name"; Expression={ $_.FieldValues["FileLeafRef"] }},@{Name="Path"; Expression={ $_.FieldValues["FileRef"] }},@{Name="SizeBytes"; Expression={ [int64]$_.FieldValues["File_x0020_Size"] }},@{Name="SizeMB"; Expression={ "{0:N2}" -f ( [double]$_.FieldValues["File_x0020_Size"] / 1MB ) }},@{Name="Modified"; Expression={ $_.FieldValues["Modified"] }}$files | Export-Csv $outCsv -NoTypeInformation -Encoding UTF8 Write-Host "文件清单已导出: $outCsv" -ForegroundColor Cyan$totalMB = ($files | Measure-Object -Property SizeBytes -Sum).Sum / 1MB Write-Host ("目录总大小: {0:N2} MB" -f $totalMB) -ForegroundColor Green
Q4:常见问题
-
执行脚本时提示找不到列表
-
可能是文档库名称不是
"Documents"
(中文环境可能显示为“文档”)
用以下命令查找:Get-PnPList | Where-Object { $_.BaseTemplate -eq 101 } | Select-Object Title, RootFolder
-
-
报 5000 项阈值错误
- 目录中文件数过多时,拆分为多个子目录分别导出
- 或使用 SharePoint “存储指标”查看总大小(见上一份 FAQ)
-
导出文件显示大小为 0
- 检查是否正确获取了
File_x0020_Size
字段 - 确保
Where-Object { $_.FileSystemObjectType -eq "File" }
过滤掉了文件夹
- 检查是否正确获取了
Q5:对比“存储指标”方法
方法 | 适合场景 | 优点 | 缺点 |
---|---|---|---|
存储指标(Web) | 只看目录大小 | 不下文件、不受5000限制 | 无法导出文件清单 |
PowerShell 脚本 | 导出文件列表+大小 | 可做对比分析 | 大目录可能要分批跑 |