SharePoint Online PnP脚本问题:获取文件夹及修改权限失败
修复方案及脚本改进
针对你遇到的两个核心问题($folders为空、无法遍历子文件夹),结合需求逻辑,给出如下修复后的脚本及关键说明:
原脚本的核心问题
FSObjType判断错误:SharePoint中,文件夹的FSObjType值为1,文件为0,原脚本的筛选条件完全反向,导致没有匹配到任何文件夹。- 未递归获取子文件夹:
Get-PnPFolder默认仅返回指定路径下的直接文件夹,需添加-Recurse参数才能遍历所有层级的子文件夹。 - 缺少子文件夹判断逻辑:原脚本未实现"存在子文件夹才修改权限"的判断条件。
- 权限设置未考虑继承问题:若文件夹继承父级权限,直接添加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
相关产品推荐
相关产品推荐

