How To Cleanup SharePoint Files: Retaining Only the Latest File Versions with PowerShell
Optimize and save storage in SharePoint with my PowerShell script. Automate your management and retain only the most recent file versions effortlessly.
Introduction
SharePoint has established itself as one of the leading platforms for document management and collaboration. As organizations create and manage countless files on SharePoint, it’s quite common for a single file to have multiple versions due to continuous updates. Over time, this can consume unnecessary storage and make it challenging to manage.
In this article, we’ll take a deep dive into a PowerShell script that automates the process of cleaning up old versions of files in a SharePoint document library, ensuring that only the latest version of each file is retained.
Before we proceed, please ensure that you have the following prerequisites in place:
Uninstall the Legacy SharePoint PowerShell Module
1. Open a PowerShell command prompt with administrative privileges. To do this, right-click on the Start button and select “Windows PowerShell (Admin)” or “Windows PowerShell” if you’re using an older version of Windows.
2. To uninstall the module, use the following command
Uninstall-Module -Name Microsoft.SharePoint.PowerShell Uninstall-Module -Name Microsoft.OnlineSharePoint.PowerShell
3. Confirm the uninstallation by typing “Y” or “A” when prompted.
4. That’s it! The Legacy SharePoint PowerShell module should now be uninstalled from your system.
Installing the PowerShell 7.0 MSI package
To install PowerShell on Windows, use the following links to download the install package from GitHub.
Install Latest SharePoint Online PNP PowerShell
Install the New PnP PowerShell Module by running the command in PowerShell 7.0
Install-Module PnP.PowerShell
Once you have the prerequisites ready, follow the steps below.
Step 1: Register Azure AD Application and Grant Access to the Tenant
1. If you havent done so already, register an Azure AD Application in the Azure portal.
Register-PnPManagementShellAccess
2. Grant appropriate permissions to the registered application to access SharePoint Online.
Step 2: Copy the Retaining Only the Latest File Versions with PowerShell Script
1. Copy and paste the following script into an editor:
# Parameters $SiteURL = "https://PatrickDomingues.sharepoint.com/sites/MySite" $LibraryName = "Document Library Name" # Function to clear all file versions except the latest one, folder by folder within the library. Function Cleanup-Versions([Microsoft.SharePoint.Client.Folder]$Folder) { Write-host "Processing Folder:" $Folder.ServerRelativeUrl -f Yellow # Get the Site Relative URL of the folder $FolderSiteRelativeURL = $Folder.ServerRelativeURL.Replace($Web.ServerRelativeURL, [string]::Empty) # Get all files from the folder $Files = Get-PnPFolderItem -FolderSiteRelativeUrl $FolderSiteRelativeURL -ItemType File # Iterate through each file ForEach ($File in $Files) { # Get file versions $Versions = Get-PnPProperty -ClientObject $File -Property Versions Write-host -f White "`tScanning File:" $File.Name If ($Versions.Count -gt 1) # Check if there's more than 1 version { # Delete all versions except the latest one $Versions | Sort-Object -Property Created -Descending | Select-Object -Skip 1 | ForEach-Object { $_.DeleteObject() } Invoke-PnPQuery Write-Host -f Green "`t`tPrevious Versions of the File Deleted except the latest:" $File.Name } } # Get sub-folders from the folder - Exclude "Forms" and hidden folders $SubFolders = Get-PnPFolderItem -FolderSiteRelativeUrl $FolderSiteRelativeURL -ItemType Folder | Where {($_.Name -ne "Forms") -and (-Not($_.Name.StartsWith("_")))} Foreach ($SubFolder in $SubFolders) { # Call the function recursively Cleanup-Versions -Folder $SubFolder } } # Connect to PnP Online Connect-PnPOnline -Url $SiteURL -Interactive $Web = Get-PnPWeb # Get the root folder of the library $RootFolder = Get-PnPList -Identity $LibraryName -Includes RootFolder | Select -ExpandProperty RootFolder # Call the function with the root folder of the library Cleanup-Versions -Folder $RootFolder
Step 3: Understanding the Script
- The script begins by defining parameters
$SiteURL
and$LibraryName
. These need to be set as per the target SharePoint site and library respectively. - The main function,
Cleanup-Versions
, takes a folder as input and processes each file within that folder, checking for versions. If a file has more than one version, it deletes all versions except the latest one. This version count check is denoted by($Versions.Count -gt 1)
. If you wish to retain a different number of versions, adjust the number1
accordingly. For instance, to keep the latest three versions, you would change it to-gt 2
. - For better visibility and user feedback, the script uses
Write-host
to display messages during execution. - A recursive approach is taken, allowing the script to navigate through all sub-folders within the document library, ensuring every file is processed.
- The function excludes the “Forms” folder and other hidden folders by default.
- The script uses the SharePoint PnP PowerShell module, which provides a vast set of cmdlets making it easier to perform many administrative tasks on SharePoint.
With this understanding, administrators can now easily modify the script to tailor the version retention policy as per their requirements, ensuring efficient storage use.
Conclusion
Managing storage efficiently and ensuring that your SharePoint sites remain clean and organized is critical for smooth operations and easy access. The above PowerShell script assists administrators in automating the process of cleaning up older versions, which can be particularly handy for large libraries or frequent document updates.
However, it’s essential to remember always to test scripts like these in a non-production environment first to ensure they work as expected and avoid any unintentional data loss.
I hope this article was helpful! You can find more here: SharePoint Articles.
Discover more from Patrick Domingues
Subscribe to get the latest posts sent to your email.
“For instance, to keep the latest three versions, you would change it to -gt 2”
Do you mean -gt 3 ?
hello Richard,
yes, that’s correct.
Hi Patrick,
At first many thanks for the easy snippet that just simply does the job very easily without to much fuss.
Are we in agreement that with this solution, you are keeping the file and 1 older version of it?
What I mean is that if you go check the versions available on the file in the SharePoint Document library and click on see Version history, you will get 2 results.
If we want to remove the latest version and only keep the latest major version we need to use $Versions.DeleteAll() ?
Hello Emmanuel,
Yes, setting the value to 0 will delete all versions leaving you with only the latest major version.
Hi Patrick,
Many thanks for this script, it’s what I’ve been looking for! It’s not understandable that Microsoft doesn’t natively offer a simple option to get rid of old versions.
I ran the script on a test library :
– do you confirm that if “If ($Versions.Count -gt 1”) is set to 0 (zero), it deletes all versions but not the files?
– 2 days after running the script, I still have numerous versions (1.0, 2.0, 3.0, etc. up to 65.0 even) for the same file. Do I have to wait for the Sharepoint site to update, or is it supposed to be more or less immediate?
Thanks again for all your hard work, it’s so useful 😉
Best,
Thibault
This will delete all file versions and keep latest file. It will take a while to run through. If you have multiple SharePoint Sites or Document Libraries, you will have to run it against those.
https://patrickdomingues.com/2023/06/10/how-to-delete-version-history-in-sharepoint-online-using-pnp-powershell/
This is a great script that I am using to clean up a library. Is it possible to target a subfolder of a document library, rather than the entire document library? Could I add the sub folders into the $LibraryName variable? Or should that be appended in the Get-PnPList command?
Reason I ask is because I am working on a very large folder structure, and the connection has been broken before it can finish traversing the full document library.
Hi Patrick,
Works Great!
I have question, is it possible to add a session that looks when the files was last modified and delete all history versions for files that haven’t been modified the last 30 days?