Reparar SharePoint Online "El intento de operación está prohibido porque excede el umbral de vista de lista impuesto por el administrador". en PowerShell
Problema: Al intentar obtener elementos de una lista de SharePoint Online a través de PowerShell, recibí este mensaje de error:
Excepción al llamar a “ExecuteQuery” con Argumento(s) “0”: “El intento de operación está prohibido porque excede el umbral de vista de lista impuesto por el administrador”.
En la línea:26 char:5
+ $Ctx.ExecuteQuery()
+ ~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId: ServerException
En realidad, simplemente estaba intentando eliminar todos los elementos de la lista:
#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!"
Causa principal: Esto se debe al valor del umbral de limitación de recursos de 5000 codificado en SharePoint Online. El umbral de vista de lista garantiza que los usuarios no realicen operaciones costosas en el entorno de SharePoint Online. Lamentablemente, no podemos cambiar este valor de umbral como lo hacemos en SharePoint On-Premises.
Solución: procesar elementos de la lista en lotes para solucionar el problema del umbral de visualización de la lista de SharePoint Online en PowerShell
Entonces, para mitigar este problema, tenemos que procesar los artículos en lotes. Aquí está mi secuencia de comandos modificada, que elimina elementos por lotes para controlar el umbral de vista de lista de SharePoint Online en PowerShell.
#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
}
Tenga en cuenta que si su consulta CAML recupera más de 5000 filas, ¡aún así fallará! Por ejemplo, si intenta obtener todos los elementos de la lista (excluyendo las "carpetas" especificando la cláusula "Dónde") de una lista grande que podría devolver más de 5000 filas, alcanzará el problema del umbral de vista de lista.
$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>"
Otros escenarios y soluciones
Es posible que encuentre el mensaje "El intento de operación está prohibido porque excede el umbral de vista de lista" al ejecutar cmdlets en listas grandes con más de 5000 elementos. P.ej. Agregar-PnPFile, Copiar-PnPFile, buscar-pnpfile, obtener-pnpfolder, get-pnplist, medir-pnplist, mover-pnpfolder, eliminar-pnplist, cambiar nombre-pnpfolder. O cuando intenta romper la herencia, crear una columna calculada, eliminar una lista, obtener elementos, compartir un archivo, cambiar el nombre de una carpeta, etc.
En cuanto a la solución: debe reducir la cantidad de elementos en la lista o biblioteca de documentos moviendo o eliminando elementos del archivo por debajo de 5000.
Aquí hay otro artículo que aborda la actualización de elementos de listas grandes con el mismo problema: SharePoint Online: Obtener todos los elementos de listas de listas grandes usando PowerShell sin vista de lista superó el error
