Bulk Check Files Versions

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"