【FAQ】Script导出SharePoint 目录文件列表并统计大小

一、只导出文件列表的方法

1) 保存脚本(建议名:D:\tmp\Export-SharePoint-FileList.ps1

powershell 复制代码
<# 
导出 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) 运行脚本

powershell 复制代码
# 第一次运行脚本需要(当前用户范围即可)
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:准备工作

  1. 安装 PowerShell 7 (64 位版)
    下载地址

    选择 PowerShell-<版本>-win-x64.msi 安装

  2. 安装 PnP.PowerShell 模块

    powershell 复制代码
    Install-Module -Name PnP.PowerShell -Force -AllowClobber
  3. 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:执行脚本

  1. 连接到 SharePoint 站点

    powershell 复制代码
    Connect-PnPOnline -Url "https://<租户名>.sharepoint.com/sites/<站点名>" `
      -ClientId "<你的ClientID>" `
      -Interactive
  2. 设置目标目录路径(Server Relative URL)

    • 必须以 /sites/... 开头

    • 例如:

      复制代码
      /sites/SuniaDUP2/Shared Documents/5 - Projects/2025 - OCR - EDU/1 - Raw Data/1 - Shenzen/OCR_data_collection_china
  3. 运行导出脚本 (输出到 D:\tmp):

    powershell 复制代码
    $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:常见问题

  1. 执行脚本时提示找不到列表

    • 可能是文档库名称不是 "Documents"(中文环境可能显示为"文档")

      用以下命令查找:

      powershell 复制代码
      Get-PnPList | Where-Object { $_.BaseTemplate -eq 101 } | Select-Object Title, RootFolder
  2. 报 5000 项阈值错误

    • 目录中文件数过多时,拆分为多个子目录分别导出
    • 或使用 SharePoint "存储指标"查看总大小(见上一份 FAQ)
  3. 导出文件显示大小为 0

    • 检查是否正确获取了 File_x0020_Size 字段
    • 确保 Where-Object { $_.FileSystemObjectType -eq "File" } 过滤掉了文件夹

Q5:对比"存储指标"方法

方法 适合场景 优点 缺点
存储指标(Web) 只看目录大小 不下文件、不受5000限制 无法导出文件清单
PowerShell 脚本 导出文件列表+大小 可做对比分析 大目录可能要分批跑

相关推荐
FreeBuf_4 天前
微软 SharePoint Server 0Day漏洞遭在野利用
microsoft·php·sharepoint
SEO-狼术18 天前
Unlock Powerful PDF Editing in SharePoint
pdf·sharepoint
霖雨2 个月前
SharePoint Online 为文档创建音频
音视频·sharepoint
bmNlbzvlbvv2 个月前
三电平逆变器带不平衡负载负载仿真 采用延时相消法(DSC)和双二阶广义积分器(DSOGI)的正...
sharepoint
热爱学习的小翁同学3 个月前
SharePoint 列格式化 JSON 配置
json·sharepoint
安得权4 个月前
.NET 把文件上传到Sharepoint - Microsoft Graph API方式
microsoft·.net·sharepoint
沟通qq 19226384 个月前
风光储混合发电系统的PQ控制实战笔记
sharepoint
D_east6 个月前
Power Apps:预览SharePoint文档库的PDF文档
pdf·sharepoint
Channing Lewis10 个月前
sharepoint 共享excel,如何实现某个 sheet 别人只读,但是另一个 sheet 可以编辑
excel·sharepoint