首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Powershell PnPListItem超过限制

Powershell PnPListItem超过限制
EN

Stack Overflow用户
提问于 2022-11-04 08:44:47
回答 2查看 45关注 0票数 0

我有文件夹在列表的深处,其中有超过5K的文件,需要分割并移动到存档中,我无法使用get-PnPFolderItem,因为它返回可怕的‘尝试操作是禁止的,因为它超过了列表视图阈值’错误。

我应该能够使用(与-pagesize)来克服这个限制,但也有一些问题。由于文件夹很深(6个级别)在根列表中,返回根列表。

我尝试了-FolderServerRelativeUrl开关,但是它一直在返回‘query.FolderServerRelativeUrl’参数无效

我尝试创建一个CAML查询来使用,但这似乎被打破了,因为它只返回列表的根文件夹。

代码语言:javascript
运行
复制
$SiteUrl = "https://mytenant.sharepoint.com/Maintenance"
$listname = "workshop"
$ServerRelUrl = "Maintenance/workshop/level1/level2/level3/level4/level5/level6"

Connect-PnPOnline -URL $siteUrl -credentials $cred

get-pnpFolderItem $serverRelUrl  # returns exceeded list view error

get-pnpListItem -list $listname -FolderServerRelativeUrl $ServerRelUrl   # returns 'the query.FolderServerRelativeUrl argument is invalid
# please tell me what this should be?

$query="<View Scope='RecursiveAll'><RowLimit>5000</RowLimit></View>"
get-pnpListItem -list $listname -query $query       # returns ALL files and folders under $listname, this is expected behaviour as it is paged and therefore does not exceed limit

# Workshop TK001 is part of the name of a file
$query='<view><Query><Where><Contains><FieldRef Name='FileDirRef'/><Value Type='Text'>'Workshop TK001'</Value></Contains></Where></Query></View>
get-pnpListItem -list $listname -query $query       # returns nothing

$query="<Query> <Where> <Contains> <FieldRef Name='FileDirRef' /> <Value Type='File'>'workshop/level1/level2/level3/level4/level5'</Value> </Contains> </Where> </Query> <ViewFields /> <QueryOptions />"
get-pnpListItem -list $listname -query $query       # returns the root folder of the list only

$query="<view Scope='RecursiveAll'><Query> <Where> <Contains> <FieldRef Name='FileDirRef' /> <Value Type='File'>'workshop/level1/level2/level3/level4/level5'</Value> </Contains> </Where> </Query> <ViewFields /> <QueryOptions /></view>"
get-pnpListItem -list $listname -query $query       # returns the exceeds list view error
get-pnpListItem -list $listname -query $query -PageSize 2000   # returns the exceeds list view error
get-pnpListItem -list $listname -PageSize 2000 -query $query   # returns the exceeds list view error

我认为CAML查询可以工作,但它似乎是返回列表的根文件夹,而不是返回应该返回的内容。

对我所缺少的东西或失败的原因的一些解释将是非常感谢的。

一个更好的解决方案是:)

我已经尝试了所列出的各种方法,并期望得到-pnplistitem列出的列表,让我迭代一遍。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-11-08 03:50:58

使用-Query和-PageSize的将无法工作.

您需要做的是使用foreach循环和get-pnplistitem命令,并通过管道过滤FileDirRef值。例如:

代码语言:javascript
运行
复制
Get-PnPListItem -list $listname -PageSize 5000 | where-object {$_["FileDirRef"] -eq "workshop/level1/level2/level3/level4/level5"}

此方法将花费更长的时间来执行,因为您正在获取每个文件夹的所有项。另一种更快的方法是获取所有项并将其存储在变量中,然后在本地进行筛选。例如:

代码语言:javascript
运行
复制
$oItems = Get-PnPListItem -list $listname -PageSize 5000
foreach($oItem in $oItems)
{
    #Filter your data here
}
票数 0
EN

Stack Overflow用户

发布于 2022-11-09 03:30:02

是啊,这是我唯一能找到的方法。

但所需的时间..。

最后我去了

代码语言:javascript
运行
复制
$getlist=Get-PnPListItem -List $SrceFolder -PageSize 4500
$getlist_src=$getlist | ?{$_.FieldValues.FileDirRef -eq $srcF}
foreach($site in $getlist_src){
    $FlName = $site.FieldValues.FileLeafRef
    $SiteFldr=$site.FieldValues.FileDirRef
    $FlItem=$SrceFolder+"/"+$FlName
    $cntr=$DstFolder.split('/').count
    write-host "moving $($getlist_src.indexof($site)) of $($getlist_src.count) - $($Flname)"
    if($DstFolder.split('/').count -gt 1 ){
        for ($i=0;$i -le $cntr;$i++) {
            $siteFldr=$siteFldr.substring($siteFldr.indexof('/',2))
        }
    }
    $SiteFldr = $DstFolder + $SiteFldr
    move-pnpfile -SourceUrl $FlItem -TargetUrl $SiteFldr -Overwrite -AllowSchemaMismatch -AllowSmallerVersionLimitOnDestination -Force
}

我不知道微软是否有任何指标来衡量访问sharepoint文件夹的次数,但是这样做的话,在4小时内移动大约1000个文件。那是每天只有6K文件。当您有28K文件要移动时,这不是一个可行的解决方案。

所以我去尝试下载一个文件夹作为一个压缩文件。我想我可以这样做,然后上传压缩文件,所以不是28K文件,只有一个文件。那是个美好的梦。

结果发现,当一个文件夹中有那么多文件时,微软会把很多文件搞砸,并在zip文件中放入一个报告,其中有些文件是它没有复制的。(对不起:)

因此,只是一个提示,在打开zip文件并验证其内容之前,不要删除sharepoint文件夹。

看来,如果您已经对sharepoint文件进行了一天左右的重击,那么您很幸运地以超过150 K/秒的速度下载压缩文件。很多错误:)

所以第三种方法时间。将站点同步到onedrive,并通过拖放仅包含本地驱动器的数千个文件的文件夹进行复制,将其压缩,然后以压缩文件的形式复制回sharepoint。听起来容易:)

因此,由28K文件组成的900 Kb文件以节流的速度从sharepoint下载超过2天。

它没能复制所有的文件。只有26.5个文件下来。你想知道哪一个没下来吗?

还请考虑一下,在您对网站进行了一段时间的撞击之后,sharepoint的节流问题不仅仅是一个IP地址,而是来自该站点本身。已经测试了这些速度,并从几个远程站点复制的onedrive同步与完全相同的问题。

如果有人有任何线索,如何纠正问题,下载多个文件夹与超过7K文件在每个文件夹,我很想听到你。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74314294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档