Javítás SharePoint Online "A megkísérelt művelet tilos, mert túllépi az adminisztrátor által kényszerített listanézeti küszöböt." a PowerShellben
Probléma: Amikor egy SharePoint Online-listáról próbáltam lekérni listaelemeket a PowerShell segítségével, ezt a hibaüzenetet kaptam:
Kivétel az „ExecuteQuery” parancsot „0” argumentum(ok): „A megkísérelt művelet le van tiltva, mert túllépi az adminisztrátor által kényszerített listanézeti küszöböt.”
At line:26 char:5
+ $Ctx.ExecuteQuery()
+ ~~~~~~~~~~~~~~~~~~~
+ Kategóriainformáció : Nincs megadva: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ServerException
Valójában egyszerűen megpróbáltam törölni az összes listaelemet:
#Load SharePoint CSOM Assemblies
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.dll"
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.Runtime.dll"
#Config Parameters
$SiteURL= "https://crescent.sharepoint.com/Sites/Projects"
$ListName="ProjectDocs"
#Setup Credentials to connect
$Cred = Get-Credential
$Cred = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Cred.UserName,$Cred.Password)
#Setup the context
$Ctx = New-Object Microsoft.SharePoint.Client.ClientContext($SiteURL)
$Ctx.Credentials = $Cred
#Get the web and List
$Web=$Ctx.Web
$List=$web.Lists.GetByTitle($ListName)
#Get all items from the library
$Query = [Microsoft.SharePoint.Client.CamlQuery]::CreateAllItemsQuery()
$ListItems = $List.GetItems($Query)
$Ctx.Load($ListItems)
$Ctx.ExecuteQuery()
#Loop through each file in the library
Foreach($Item in $ListItems)
{
#Delete all Items
$List.GetItemById($Item.Id).DeleteObject()
}
$Ctx.ExecuteQuery()
Write-host -f Green "All Items deleted!"
Kiadó ok: Ennek az az oka, hogy a SharePoint Online-on az 5000-es erőforrás-szabályozási küszöbértéket keményen kódolták. A listanézet küszöbértéke biztosítja, hogy a felhasználók ne végezzenek költséges műveleteket a SharePoint Online környezetben. Sajnos ezt a küszöbértéket nem tudjuk megváltoztatni, ahogy a SharePoint On-Premises esetében tesszük.
Megoldás: A listaelemek kötegelt feldolgozása a SharePoint Online listanézeti küszöbprobléma megoldása érdekében a PowerShellben
Tehát a probléma enyhítése érdekében az elemeket kötegekben kell feldolgoznunk. Itt van a módosított szkriptem, amely törli az elemeket a kötegben, hogy kezelje a SharePoint Online listanézet küszöbértékét a PowerShellben.
#Load SharePoint CSOM Assemblies
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.dll"
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.Runtime.dll"
#Config Parameters
$SiteURL= "https://crescent.sharepoint.com/"
$ListName="Projects"
$BatchSize = 500
#Setup Credentials to connect
$Cred = Get-Credential
$Cred = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Cred.UserName,$Cred.Password)
Try {
#Setup the context
$Ctx = New-Object Microsoft.SharePoint.Client.ClientContext($SiteURL)
$Ctx.Credentials = $Cred
#Get the web and List
$Web=$Ctx.Web
$List=$web.Lists.GetByTitle($ListName)
$Ctx.Load($List)
$Ctx.ExecuteQuery()
Write-host "Total Number of Items Found in the List:"$List.ItemCount
$Query = New-Object Microsoft.SharePoint.Client.CamlQuery
$Query.ViewXml = "<View Scope='RecursiveAll'><Query><OrderBy><FieldRef Name='ID' Ascending='TRUE'/></OrderBy></Query><RowLimit Paged='TRUE'>$BatchSize</RowLimit></View>"
Do {
#Get items from the list in batches
$ListItems = $List.GetItems($Query)
$Ctx.Load($ListItems)
$Ctx.ExecuteQuery()
$Query.ListItemCollectionPosition = $ListItems.ListItemCollectionPosition
Write-host Deleting $($ListItems.count) Items Starting from Item ID $ListItems[0].ID
#Loop through each item and delete
ForEach($Item in $ListItems)
{
$List.GetItemById($Item.Id).DeleteObject()
}
$Ctx.ExecuteQuery()
} While ($Query.ListItemCollectionPosition -ne $null)
Write-host -f Green "All Items Deleted!"
}
Catch {
write-host -f Red "Error Deleting List Items!" $_.Exception.Message
}
Kérjük, vegye figyelembe, hogy ha a CAML-lekérdezése több mint 5000 sort kér le, akkor is sikertelen lesz! Például, ha megpróbál lekérni minden listaelemet (kivéve a „mappákat” a „Hol” záradék megadásával) egy nagy listáról, amely több mint 5000 sort is visszaadhat, akkor eléri a listanézeti küszöbproblémát!
$Query.ViewXml = "@
<View Scope='RecursiveAll'>
<Query>
<Where>
<Eq>
<FieldRef Name='FSObjType' /><Value Type='Integer'>0</Value>
</Eq>
</Where>
</Query>
<RowLimit Paged='True'>$BatchSize</RowLimit>
</View>"
Egyéb forgatókönyvek és megoldások
„A megkísérelt művelet tiltott, mert meghaladja a listanézeti küszöbértéket” üzenettel találkozhat, amikor 5000-nél több elemet tartalmazó nagy listákon futtat parancsmagokat. Például. Add-PnPFile, Copy-PnPFile, find-pnpfile, get-pnpfolder, get-pnplist, mérés-pnplist, move-pnpfolder, remove-pnplist, rename-pnpfolder. Vagy amikor megpróbálja megszakítani az öröklődést, létrehozni egy számított oszlopot, törölni egy listát, beszerezni elemeket, megosztani egy fájlt, átnevezni egy mappát stb.
Ami a megoldást illeti: Csökkentenie kell a listában vagy a dokumentumtárban lévő elemek számát úgy, hogy 5000 alá helyez át vagy töröl elemeket a fájlból.
Íme egy másik cikk, amely a nagy listaelemek frissítésével foglalkozik ugyanazzal a problémával: SharePoint Online: Az összes listaelem lekérése nagy listákról PowerShell használatával listanézet nélkül, túllépte a hibát.
