如何用PnP PowerShell获取SharePoint页面WebPart全量属性
问题根因
Get-PnPClientSidePage返回的PropertiesJson字段本身就不存储WebPart的全部配置:
- 该字段仅返回WebPart静态声明的公开属性,按钮文本、跳转链接、快速链接条目、Hero卡片配置这类用户动态编辑的核心属性,默认不会直接写入这个字段
- PowerShell控制台输出时会自动截断长文本,进一步让返回结果看起来缺漏更多
方案1:直接读取控件Properties动态对象(适配90%场景)
PnP PowerShell已经把WebPart全量解析后的属性存在了控件的Properties动态对象中,不要直接读PropertiesJson字符串即可拿到大部分缺失属性,参考代码:
# 获取目标页面 $page = Get-PnPClientSidePage "de/test2.aspx" # 遍历所有WebPart控件导出全属性 $page.Controls | Where-Object Type -eq "PageWebPart" | ForEach-Object { Write-Host "=== 控件名称:$($_.Title) 控件ID:$($_.InstanceId) ===" # 注意必须指定Depth参数≥20,否则嵌套属性会被默认截断 $_.Properties | ConvertTo-Json -Depth 20 }
如果需要留存结果,直接在命令末尾追加| Out-File .\all-webpart-config.json -Encoding UTF8导出到本地文件查看,避免控制台截断。
方案2:拉取页面原始存储数据(100%全属性无遗漏)
如果方案1仍有属性缺失(比如Link控件的预览缓存数据、图片控件的服务端处理地址、搜索驱动WebPart的查询配置),可以直接调用接口拉取页面在SharePoint后台存储的原始Canvas控件数据,这部分是页面加载时读取的最原始配置,没有任何裁剪:
$page = Get-PnPClientSidePage "de/test2.aspx" # 拉取页面原始数据 $rawPageContent = Invoke-PnPSPRestMethod -Url $page.PageUrl -Method Get # 遍历所有控件导出全量配置 $rawPageContent.CanvasControls | ForEach-Object { Write-Host "=== 控件名称:$($_.ctrlProps.title) 控件ID:$($_.id) ===" [PSCustomObject]@{ 基础配置 = $_.ctrlProps 服务端处理内容 = $_.serverProcessedContent 自定义扩展属性 = $_.customSettings } | ConvertTo-Json -Depth 30 }
这个方案返回的内容包含所有配置项,不管是按钮的标签、跳转链接,还是Quick Links、Hero、Call to Action、图片库等复杂控件的嵌套配置,都会完整返回,没有遗漏。
注意事项
- 执行命令前请将PnP PowerShell升级到1.12.0以上版本,旧版本对新版WebPart的属性解析存在已知bug,会导致属性丢失
- 部分WebPart的链接、图片源地址等动态替换的内容,不会存在基础配置字段中,必须从
serverProcessedContent节点下获取 ConvertTo-Json必须指定足够大的Depth参数,PowerShell默认转换深度仅为2,嵌套超过2层的属性会被直接转成空字符串,导致配置不全
内容的提问来源于stack exchange,提问作者as1984
相关产品推荐
相关产品推荐

