Weboldal keresés

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.

Kapcsolódó cikkek