У меня есть папки глубоко внутри списков, в которых содержится более 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 выдаст список для повторения.
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 файлами в каждой папке, я хотел бы услышать от вас.