Facing issue while trying to get the metadata of all of the documents from one SharePoint Site and export it into CSV using SharePoint PowerShell. I have approximately 100000 of documents in one site.
I am getting the error: Error Generating CSV. Please contact with Administrator Exception calling "ExecuteQuery" with "0" argument(s): "The remote server returned an error: (503) Server Unavailable."
Below is my code where i can get only 1000 items but while trying to get approx 5000 also i am getting 503:
#Load SharePoint CSOM Assemblies
Add-Type -Path "C:\Program Files\SharePoint Online Management Shell\Microsoft.Online.SharePoint.PowerShell\Microsoft.SharePoint.Client.dll"
Add-Type -Path "C:\Program Files\SharePoint Online Management Shell\Microsoft.Online.SharePoint.PowerShell\Microsoft.SharePoint.Client.Runtime.dll"
Add-Type -Path "C:\Program Files\SharePoint Online Management Shell\Microsoft.Online.SharePoint.PowerShell\Microsoft.Online.SharePoint.Client.Tenant.dll"
#Function to Generate Report on all documents in a SharePoint Online Site Collection
Function Get-SPODocumentInventory($SiteURL)
{
Try {
#Setup the context
$Ctx = New-Object Microsoft.SharePoint.Client.ClientContext($SiteURL)
$Ctx.Credentials = $Credentials
#Get the web from given URL and its subsites
$Web = $Ctx.web
$Ctx.Load($Web)
$Ctx.Load($Web.Lists)
$Ctx.Load($web.Webs)
$Ctx.executeQuery()
#Arry to Skip System Lists and Libraries
$SystemLists =@("Converted Forms", "Master Page Gallery", "Customized Reports", "Form Templates", "List Template Gallery", "Theme Gallery",
"Reporting Templates", "Solution Gallery", "Style Library", "Web Part Gallery","Site Assets", "wfpub", "Site Pages", "Images")
Write-host -f Yellow "Processing Site: $SiteURL"
#Filter Document Libraries to Scan
$Lists = $Web.Lists | Where {$_.BaseType -eq "DocumentLibrary" -and $_.Hidden -eq $false -and $SystemLists -notcontains $_.Title -and $_.ItemCount -gt 0}
#Loop through each document library
Foreach ($List in $Lists)
{
#Define CAML Query to Get List Items in batches
$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>"
Write-host | Add-Member NoteProperty -f Cyan "`t Processing Document Library: '$($List.Title)' with $($List.ItemCount) Item(s)"
Do {
#Get List items
$ListItems = $List.GetItems($Query)
$Ctx.Load($ListItems)
$Ctx.ExecuteQuery()
#Filter Files
$Files = $ListItems | Where { $_.FileSystemObjectType -eq "File"}
#Iterate through each file and get data
$DocumentInventory = @()
Foreach($Item in $Files)
{
$File = $Item.File
$Ctx.Load($File)
$Ctx.ExecuteQuery()
$LastFolderName = ($File.ServerRelativeURL) -replace "/","\"
$fileLeafRef = $item["FileLeafRef"]
$fileExtension = [System.IO.Path]::GetExtension($fileLeafRef)
$DocumentData = New-Object PSObject
$DocumentData | Add-Member NoteProperty SiteName($Web.Title)
$DocumentData | Add-Member NoteProperty SiteURL($SiteURL)
$DocumentData | Add-Member NoteProperty DocLibraryName($List.Title)
$DocumentData | Add-Member NoteProperty TopLevelFolderName($Folder.Name)
$DocumentData | Add-Member NoteProperty LastFolderName($LastFolderName)
$DocumentData | Add-Member NoteProperty FileName($File.Name)
$DocumentData | Add-Member NoteProperty FileURL($File.ServerRelativeUrl)
$DocumentData | Add-Member NoteProperty FileID($Item.ID)
$DocumentData | Add-Member NoteProperty FileType($fileExtension)
$DocumentData | Add-Member NoteProperty ModifiedBy($Item["Editor"].Email)
$DocumentData | Add-Member NoteProperty LastModifiedOn($File.TimeLastModified)
$DocumentData | Add-Member NoteProperty CreatedBy($Item["Author"].Email)
$DocumentData | Add-Member NoteProperty CreatedOn($File.TimeCreated)
#$DocumentData | Add-Member NoteProperty RetentionLabelName($File.RetentionLabel)
#$DocumentData | Add-Member NoteProperty SiteOwner($SiteCollURL.Email)
$DocumentData | Add-Member NoteProperty GUID($List.ID)
#Add the result to an Array
$DocumentInventory += $DocumentData
}
#Export the result to CSV file
$DocumentInventory | Export-CSV $ReportOutput -UseCulture -NoTypeInformation -Append
$Query.ListItemCollectionPosition = $ListItems.ListItemCollectionPosition
#Introduce a delay between batches
Start-Sleep -Seconds 5 # Adjust the delay as needed
} While($Query.ListItemCollectionPosition -ne $null)
}
#Iterate through each subsite of the current web and call the function recursively
ForEach ($Subweb in $Web.Webs)
{
#Call the function recursively to process all subsites underneaththe current web
Get-SPODocumentInventory($Subweb.url)
}
}
Catch {
write-host -f Red "Error Generating CSV. Please contact with Administrator" $_.Exception.Message
}
}
#Config Parameters
$SiteCollURL="https://wvbss.sharepoint.com/sites/SayantanMainSite"
$ReportOutput="C:\temp\BubEx1.csv"
$BatchSize = 50
#Setup Credentials to connect
$Cred= Get-Credential
$Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Cred.Username, $Cred.Password)
#Delete the Output Report, if exists
if (Test-Path $ReportOutput) { Remove-Item $ReportOutput }
#Call the function
Get-SPODocumentInventory $SiteCollURL