Use PnP PowerShell to check file versions in bulk using a CSV file.
#########################
# This account has to be a SharePoint Admin and also should connect to PnPOnline with this account before running the script
# Connect-PnPOnline -Url "https://x-admin.sharepoint.com" -Interactive
#########################
$SiteCollAdmin = "admin email"
# Parameters
$CSVInputFile = "Sites.csv" # CSV file with site URLs
$CSVOutputFile = "VersionHistory.csv"
# Delete the Output report file if exists
If (Test-Path $CSVOutputFile) { Remove-Item $CSVOutputFile }
# Read the list of site URLs from the CSV file
$SiteURLs = Import-Csv -Path $CSVInputFile
$ExcludedLists = @("Form Templates", "Preservation Hold Library", "Site Assets", "Pages", "Site Pages", "Images",
"Site Collection Documents", "Site Collection Images", "Style Library")
ForEach ($Site in $SiteURLs) {
Write-Host "Processing site:" $Site.SiteUrl
Set-PnPTenantSite -Url $Site.SiteUrl -Owners $SiteCollAdmin -ErrorAction Stop
# Connect to each site collection
Connect-PnPOnline -Url $Site.SiteUrl -Interactive
$Lists = Get-PnPList | Where-Object {
$_.Hidden -eq $False -and $_.Title -notin $ExcludedLists -and $_.BaseType -eq "DocumentLibrary"
}
# Iterate through all files from all document libraries
ForEach ($List in $Lists) {
if ($List.ItemCount -eq 0) {
Write-Host "Skipping list '$($List.Title)' as it has no items."
continue
}
$global:counter = 0
$Files = Get-PnPListItem -List $List -PageSize 2000 -Fields File_x0020_Size, FileRef -ScriptBlock {
Param($items)
$global:counter += $items.Count
Write-Progress -PercentComplete ($global:Counter / ($List.ItemCount) * 100) -Activity "Getting Files of '$($List.Title)'" -Status "Processing Files $global:Counter to $($List.ItemCount)"
} | Where {$_.FileSystemObjectType -eq "File"}
$VersionHistoryData = @()
$Files | ForEach-Object {
Write-host "Getting Versioning Data of the File:" $_.FieldValues.FileRef
# Get File Size and version Size
$FileSizeinMB = [Math]::Round(($_.FieldValues.File_x0020_Size/1MB), 4)
$File = Get-PnPProperty -ClientObject $_ -Property File
$Versions = Get-PnPProperty -ClientObject $File -Property Versions
$VersionSize = $Versions | Measure-Object -Property Size -Sum | Select-Object -expand Sum
$VersionSizeinMB = [Math]::Round(($VersionSize/1MB), 4)
$TotalFileSizeMB = [Math]::Round(($FileSizeinMB + $VersionSizeinMB), 4)
# Extract Version History data
$VersionHistoryData += New-Object PSObject -Property ([Ordered]@{
"Site URL" = $Site.SiteUrl
"Library Name" = $List.Title
"File Name" = $_.FieldValues.FileLeafRef
"File URL" = $_.FieldValues.FileRef
"Versions" = $Versions.Count
"File Size (MB)" = $FileSizeinMB
"Version Size (MB)" = $VersionSizeinMB
"Total File Size (MB)" = $TotalFileSizeMB
})
}
$VersionHistoryData | Export-Csv -Path $CSVOutputFile -NoTypeInformation -Append
}
Remove-PnPSiteCollectionAdmin -Owners $SiteCollAdmin
}
Write-Host "Report generation completed. Output file: $CSVOutputFile"