You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SharePoint Online PnP脚本问题:获取文件夹及修改权限失败

修复方案及脚本改进

针对你遇到的两个核心问题($folders为空、无法遍历子文件夹),结合需求逻辑,给出如下修复后的脚本及关键说明:

原脚本的核心问题

  1. FSObjType判断错误:SharePoint中,文件夹的FSObjType值为1,文件为0,原脚本的筛选条件完全反向,导致没有匹配到任何文件夹。
  2. 未递归获取子文件夹:Get-PnPFolder默认仅返回指定路径下的直接文件夹,需添加-Recurse参数才能遍历所有层级的子文件夹。
  3. 缺少子文件夹判断逻辑:原脚本未实现"存在子文件夹才修改权限"的判断条件。
  4. 权限设置未考虑继承问题:若文件夹继承父级权限,直接添加Read权限可能不会生效,需先断开权限继承(可选,根据实际需求调整)。

修复后的完整脚本

# 连接到SharePoint站点
Connect-PnPOnline -Url "https://mysharepoint.sharepoint.com/sites/mysite" -UseWebLogin

# 定义目标文档库信息
$targetLibrary = "my document library"
$rootFolderUrl = "/sites/mysite/$targetLibrary"

# 递归获取所有文件夹,加载必要属性:ListItemAllFields(权限操作)、Folders(判断子文件夹)
$allFolders = Get-PnPFolder -Url $rootFolderUrl -Includes ListItemAllFields, Folders -Recurse |
              Where-Object { $_.ListItemAllFields.FSObjType -eq 1 } # 筛选文件夹类型

foreach ($folder in $allFolders) {
    # 判断当前文件夹是否包含子文件夹
    if ($folder.Folders.Count -gt 0) {
        Write-Host "处理文件夹:$($folder.ServerRelativeUrl)"
        
        # 可选:若文件夹继承父权限,先断开继承(保留现有权限可省略-ClearExistingPermissions)
        # Set-PnPListItemPermission -List $targetLibrary -Identity $folder.ListItemAllFields.Id -BreakRoleInheritance
        
        # 获取站点默认Members和Visitors组(避免自定义组名导致匹配失败)
        $membersGroup = Get-PnPGroup -AssociatedMemberGroup
        $visitorsGroup = Get-PnPGroup -AssociatedVisitorGroup
        
        # 先移除组的现有权限,确保最终权限为Read
        Remove-PnPListItemPermission -List $targetLibrary -Identity $folder.ListItemAllFields.Id -User $membersGroup -Force
        Remove-PnPListItemPermission -List $targetLibrary -Identity $folder.ListItemAllFields.Id -User $visitorsGroup -Force
        
        # 设置两组为Read权限
        Set-PnPListItemPermission -List $targetLibrary -Identity $folder.ListItemAllFields.Id -User $membersGroup -AddRole "Read"
        Set-PnPListItemPermission -List $targetLibrary -Identity $folder.ListItemAllFields.Id -User $visitorsGroup -AddRole "Read"
        
        Write-Host "已完成权限设置:$($folder.ServerRelativeUrl)"
    }
}

# 断开连接
Disconnect-PnPOnline

关键改进说明

  • 递归遍历文件夹:通过-Recurse参数自动获取所有层级的子文件夹,无需手动编写递归逻辑。
  • 准确筛选文件夹:修正FSObjType判断条件为1,确保只返回文件夹对象。
  • 子文件夹判断:利用预加载的Folders属性直接判断当前文件夹是否包含子文件夹,减少额外接口调用。
  • 可靠获取站点组:使用Get-PnPGroup的关联组参数获取默认成员/访客组,避免因组名自定义导致的匹配失败。
  • 权限操作严谨性:先移除现有权限再添加Read权限,确保最终权限符合预期;若需保留其他组权限,可删除Remove-PnPListItemPermission步骤。

调试排查技巧

如果仍出现文件夹为空的情况,可执行以下步骤:

  • 验证文档库路径:运行Get-PnPList -Identity $targetLibrary | Select-Object ServerRelativeUrl确认路径是否正确。
  • 直接查看文件夹列表:运行Get-PnPFolder -Url $rootFolderUrl -Recurse检查返回结果,确认是否包含目标文件夹。
  • 检查账号权限:确保当前登录账号拥有文档库的完全控制权限,避免因权限不足无法读取文件夹信息。

内容的提问来源于stack exchange,提问作者Jona Schwarz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 09:52:33