Forum Discussion
Amrah_Chughtai
May 31, 2021Copper Contributor
Total Size of Preservation Hold Libraries
Hello All, I am wondering if someone can help with a PowerShell script to retrieve the size of Preservation hold libraries in all the SharePoint Sites and OneDrive. I need to calculate the total...
ANieto
Mar 26, 2026Copper Contributor
Hi guys,
I work as a M365 engineer and I have that script that can help to you:
# Requiere: PnP.PowerShell
Import-Module PnP.PowerShell
function Generate-VersionHistoryReport {
param(
[Parameter(Mandatory = $true)]
[string]$SiteURL,
[Parameter(Mandatory = $true)]
[string]$ReportOutput
)
try {
Write-Host "Conectando a: $SiteURL" -ForegroundColor Cyan
Connect-PnPOnline -Url $SiteURL -UseWebLogin
Write-Host "Procesando Site: $SiteURL" -ForegroundColor Yellow
$AllRows = @()
# Hidden library: Preservation Hold Library
$List = Get-PnPList | Where-Object { $_.Title -eq "Preservation Hold Library" }
if ($null -eq $List) {
Write-Host "`tNo se encontró Preservation Hold Library en este sitio" -ForegroundColor DarkYellow
}
else {
Write-Host "`tProcesando biblioteca oculta: $($List.Title)" -ForegroundColor Green
$ListItems = Get-PnPListItem -List $List.Id -PageSize 2000 -Fields "FileRef","FileLeafRef","FSObjType"
foreach ($Item in $ListItems) {
if ($Item["FSObjType"] -ne 0) {
continue
}
try {
$File = Get-PnPProperty -ClientObject $Item -Property File
$Versions = Get-PnPProperty -ClientObject $File -Property Versions
if ($null -ne $Versions -and $Versions.Count -ge 1) {
$VersionSize = 0
foreach ($Version in $Versions) {
$VersionSize += [int64]$Version.Size
}
$AllRows += [PSCustomObject]@{
Site = $SiteURL
Library = $List.Title
'File Name' = $File.Name
'Version Count' = $Versions.Count
'Version Size-KB'= [math]::Round(($VersionSize / 1024), 2)
URL = $SiteURL.TrimEnd('/') + $File.ServerRelativeUrl
}
}
}
catch {
Write-Host "`t`tError procesando archivo: $($Item['FileRef'])" -ForegroundColor Red
Write-Host "`t`t$($_.Exception.Message)" -ForegroundColor Red
}
}
}
if ($AllRows.Count -gt 0) {
$AllRows | Export-Csv -Path $ReportOutput -Append -NoTypeInformation -Encoding UTF8
}
# Subsitios
$SubWebs = Get-PnPSubWeb -Recurse
foreach ($SubWeb in $SubWebs) {
Generate-VersionHistoryReport -SiteURL $SubWeb.Url -ReportOutput $ReportOutput
}
}
catch {
Write-Host "Error generando Version History Report en $SiteURL" -ForegroundColor Red
Write-Host $_.Exception.Message -ForegroundColor Red
}
}
# Parámetros
$SiteURL = "https://YOURTENANT.sharepoint.com/sites/YOURSITE"
$ReportOutput = "D:\VersionHistoryRpt-preservationhold.csv"
if (Test-Path $ReportOutput) {
Remove-Item $ReportOutput -Force
}
Generate-VersionHistoryReport -SiteURL $SiteURL -ReportOutput $ReportOutput
Notice in the connect-pnp..... -UseWebLogin it wont work if you have PnP module updated.
You should change by -Interactive and use an AppRegistration for login with PS