Powershell PnPListItem превышает ограничения

У меня есть папки глубоко внутри списков, в которых содержится более 5 КБ файлов, которые необходимо разделить и переместить в архив. Я не могу использовать get-PnPFolderItem, поскольку он возвращает ужасную ошибку «Попытка операции запрещена, поскольку она превышает пороговое значение представления списка».

Я должен иметь возможность использовать get-PnPListItem (с -pagesize), чтобы обойти это ограничение, но у меня есть несколько проблем. Поскольку папка находится глубоко (6 уровней) внутри корневого списка, get-PnPListItem возвращает корневой список.

Я попробовал переключатель -FolderServerRelativeUrl, но он продолжает возвращать «Аргумент query.FolderServerRelativeUrl недействителен».

Я попытался создать CAML-запрос для использования, но он, похоже, не работает, поскольку возвращает только корневую папку для списка.

$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 будет работать, но, похоже, он возвращает корневую папку списка, а не то, что он должен возвращать.

Какое-то объяснение того, что мне не хватает, или причины его неудачи были бы действительно оценены.

Решение было бы еще лучше :)

Я пробовал различные перечисленные методы и ожидал, что get-pnplistitem выдаст список для повторения.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
142
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Get-PnPListItem с -Query и -PageSize не будет работать.

Что вам нужно сделать, так это использовать цикл foreach с командой get-pnplistitem и передать его для фильтрации значения FileDirRef. Например:

Get-PnPListItem -list $listname -PageSize 5000 | where-object {$_["FileDirRef"] -eq "workshop/level1/level2/level3/level4/level5"}

Этот подход займет больше времени, так как вы получаете все элементы для каждой папки. Другим более быстрым подходом будет получение всех элементов и сохранение в переменной, а затем локальная фильтрация. Например:

$oItems = Get-PnPListItem -list $listname -PageSize 5000
foreach($oItem in $oItems)
{
    #Filter your data here
}

да, это был единственный способ, который я мог найти.

Хотя время нужно....

в итоге я пошел с

$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
}

Я не знаю, есть ли у Microsoft какие-либо показатели количества вызовов доступа к папке sharepoint, но при таком способе перемещается около 1000 файлов за 4 часа. Это всего 6К файлов в день. Когда вам нужно переместить файлы размером 28 КБ, это не работает.

Поэтому я пошел и попытался загрузить папку в виде zip-файла. Я подумал, что могу сделать это таким образом, а затем загрузить zip-файл, чтобы вместо файлов размером 28 КБ был только 1 файл. Это был хороший сон.

Оказывается, когда у вас так много файлов в папке, есть много файлов, которые Microsoft портит и помещает в отчет внутри zip-файла, что есть некоторые файлы, которые она не копировала. прости за это :)

Так что просто совет: НЕ удаляйте папку sharepoint до тех пор, пока вы не откроете zip-файл и не проверите его содержимое.

Кажется, если вы копались в файле sharepoint в течение дня или около того, вам повезло скачать заархивированные файлы со скоростью более 150 КБ/сек. много ошибок :)

Итак, время третьего метода. Синхронизируйте сайт с моим onedrive и скопируйте с помощью перетаскивания нужные мне папки, содержащие тысячи файлов только на моем локальном диске, заархивируйте их, а затем скопируйте их обратно в виде заархивированного файла в sharepoint. Звучит легко :)

Таким образом, 900 КБ, состоящих из 28 КБ файлов, загружаются с точки доступа с ограниченной скоростью более 2 дней.

И не удалось скопировать все файлы. всего 26,5К файлов сошло. Вы хотите найти, какие из них не пришли???

Также подумайте, что проблема с дросселированием с помощью точки доступа после того, как вы какое-то время посещали сайт, связана не только с IP-адресом, но и с самого сайта. Протестировали эти скорости и синхронизировали копирование из onedrive с нескольких удаленных сайтов с точно такой же проблемой.

Если КТО-НИБУДЬ знает, как решить проблему с загрузкой нескольких папок с более чем 7K файлами в каждой папке, я хотел бы услышать от вас.

Другие вопросы по теме