【问题标题】:How to retrieve all list items in a large SharePoint library using PnP PowerShell如何使用 PnP PowerShell 检索大型 SharePoint 库中的所有列表项
【发布时间】:2022-03-18 20:55:55
【问题描述】:

我有一个图书馆,里面有大约 25,000 件物品。我有一个 csv,其中包含我想授予项目级别权限的几个文件夹。但首先,要做到这一点,我需要从库中检索所有项目。正如预期的那样,我收到有关管理员强制执行的阈值限制的错误。如果有办法通过 PnP 解决这个问题,我会徘徊。

我基本上使用Get-PnPListItem -List Documents-PageSize 1000 来尝试限制一次返回的项目数,但我仍然收到错误消息。我还使用caml query; 尝试了下面的代码,但也没有用。

$filename = test.docx
Get-PnPListItem -List Documents -Query
"<View><Query><Where><Eq><FieldRef Name='FileLeafRef'/>
<Value Type='File'>' +$filename+ '</Value></Eq></Where></Query></View>"

我只希望显示一个结果,即在文档库中找到文件名时。所以我不确定为什么会显示错误消息。有什么好办法吗?

【问题讨论】:

    标签: powershell sharepoint-online


    【解决方案1】:

    您可以将列表下载到 Excel 中。在列表视图中,单击导出到 Excel。它将导出所有可见的列和所有项目。然后操作 Excel 文件并保存为 CSV。

    或者,您可以使用 Power Query 查询列表并将其加载到 Excel 中。

    这两种方法都将支持超过 25K 行。

    【讨论】:

      【解决方案2】:

      这是一个已知问题。如果要从大型列表(SharePoint Online 超过 5000 个项目)中检索某些项目,则无法使用 Get-PnPListItem 的 -Query 参数。这令人痛苦,因为您可能使用 -Query 的主要原因是有很多项目,您希望它们在服务器端过滤以避免过多的网络带宽等。

      如果您使用 -Query 并同时指定 -PageSize 和/或放入 CAML 查询,它似乎没有任何效果,服务器会响应“禁止尝试的操作,因为它超出了由管理员”。

      在仍然使用 PnP-PowerShell 的情况下,唯一的解决方法是删除 -Query,使用 -PageSize 获取每个项目,然后使用 foreach/select/where-object 在本地处理这些项目。更多详情请参考:

      或者您可以尝试 CSOM cmdlet 并将过滤后的列添加到索引列表中:

      BR

      【讨论】:

        【解决方案3】:

        这确实与 pnp.powershell 模块一起工作,以获得更多的行数然后 5000。

        $query = "<View Scope='RecursiveAll'><RowLimit>5000</RowLimit></View>" 
        $itemsInList = Get-PnPListItem -List 'TestList' -Query $query
        

        【讨论】:

          【解决方案4】:

          它不应该那样工作。

          如果您需要查询大型列表,请务必为您要查询的字段添加索引。

          但这仍然不会使您的查询受到 -PageSize 或使用 PnP-Powershell 查询中的 RowLimit 标记的限制。

          您将需要使用 -Scriptblock 选项来批量处理项目。

          【讨论】:

            【解决方案5】:

            对于 SPO PNP.PowerShell 实际上只需要使用-PageSize 5000

            【讨论】:

              【解决方案6】:

              如果你使用 pnp.powershell 你可以这样做:

              Connect-PnPOnline -Interactive
              $ListName  = "My list"     
              Get-PnPListItem -List $ListName -PageSize 2000 -ScriptBlock { Param($items) $items.Context.ExecuteQuery()} | ForEach-Object {
               $_ #This is the list Item
              } 
              

              此脚本将以 2000 个为单位收集超过 5000 个的所有列表项。

              【讨论】:

                猜你喜欢
                • 2021-04-24
                • 1970-01-01
                • 1970-01-01
                • 2020-08-21
                • 2021-12-12
                • 2020-11-04
                • 2021-12-27
                • 2021-05-05
                • 1970-01-01
                相关资源
                最近更新 更多