<

[Product update] Infrastructure Analysis Tool is now available with Business Accounts.Learn More

x

Set\Update Version Count In SharePoint Document Library & Remove Older Versions

Published on
11,825 Points
5,725 Views
1 Endorsement
Last Modified:
Approved
In SharePoint, you have the ability to set the number of versions to retain through the settings of the specific document libraries.  I was recently faced with a challenge where a company implemented a new global policy which mandated only 10 versions be retained.  The policy had be implemented by notice of the collection administrators after users were sufficiently notified of the change so I it had to be something that was run

Unfortunately, with the first library they updated, they noticed when you changed the version retention number, the libraries did not automatically remove the older versions.  Only when you performed a future update of the document, did the older versions get trimmed off.  

After a little research, I couldn't find anything online which offered the solution I was looking for.  In the end I wrote a simple but very fast, effective, and powerful PowerShell script.

if((Get-PSSnapin | Where {$_.Name -eq "Microsoft.SharePoint.PowerShell"}) -eq $null) {
    Add-PSSnapin Microsoft.SharePoint.PowerShell;
}
# 2 variables which need to be set
$siteCollection = "http://SharePoint/Sites/SiteCollection"
$documentRetentionCount=10

# get site collection
$site = new-object Microsoft.SharePoint.SPSite($siteCollection)

# loop through each subsite
foreach ($web in $site.AllWebs)
{
   write-host $web.url

   # loop through all lists in each subsite
   foreach ($list in $web.Lists)
   {
      # examine if BaseType of list is a Document Library and if versioning is turned on
      if (($list.BaseType -eq "DocumentLibrary") -and ($list.EnableVersioning))
      {
         # Set the Major version limit to keep the latest 10 versions
         $list.MajorVersionLimit = $documentRetentionCount
         $list.Update()
         foreach($item in $list.Items)
         {# Perform a system update on each item 
            $item.SystemUpdate($true)
         }
      }
   }
}
$web.Dispose();
$site.Dispose();

Open in new window


I've documented the code inline but I'm going to walk through it for clarity sake:

if((Get-PSSnapin | Where {$_.Name -eq "Microsoft.SharePoint.PowerShell"}) -eq $null) {
    Add-PSSnapin Microsoft.SharePoint.PowerShell;
}
1.      First you have to make sure the snap-ins are loaded.  I've used this method for a long time because when I ran, then subsequently re-ran the script after making edits, it would say the snap-in was already loaded.  This way, it will check first, then only load it if necessary.

$siteCollection = "http://SharePoint/Sites/SiteCollection"
$documentRetentionCount=10
2.      The next block lists the two variables that are specific to a run.  My next version of this will be to set the web application and loop through all site collections, then subsites, and finally all document libraries.
foreach ($web in $site.AllWebs)
{
   write-host $web.url
3.      The first foreach loop loops through each subsite in the site collection, displaying the current subsite URL in the console window.
foreach ($list in $web.Lists)
{
   if (($list.BaseType -eq "DocumentLibrary") -and ($list.EnableVersioning))
4.      It then loops through each list looking only for Document Library type lists which have versioning enabled

5.      The script then sets the major version limit for the versioning-enabled document library to the specified variable and saves the updated property value to the list.

foreach($item in $list.Items)
{
$item.SystemUpdate($true)
}
6.      Now the important part in my situation was updating each item to remove any version greater than the one specified in the variable which actually removes the versions outside of the newly defined limit.

I know it's not rocket science but it saved an SP administrator time and effort of going through each library and setting the version number and updating each item to apply the setting.  Doing it manually would have also updated the "Modified Date" and "Modified By" fields for each document which would have also sent out alerts if there were any set.
1
Author:Doug
0 Comments

Featured Post

IT Pros Agree: AI and Machine Learning Key

We’d all like to think our company’s data is well protected, but when you ask IT professionals they admit the data probably is not as safe as it could be.

Please check the video also in regards to recovery of deleted emails from office 365 admin center and through the MFCMAPI tool. I have mentioned each and every step with the proper steps that need to be taken care of.
This is Part-2 of Learning to use the Power of Mailwasher Pro so if you haven't watched Part-1 yet, I urge you to do so before watching this video. Click this link to watch Part-1 (https://www.experts-exchange.com/videos/56638/Learn-to-use-the-POWER…

Keep in touch with Experts Exchange

Tech news and trends delivered to your inbox every month