Someone asked for a script that could delete previous versions for SharePoint 3.0. I don’t have a 3.0 dev environment but I do have a 2010 build and it interested me.
Function Delete-SPVersions () { [CmdletBinding(SupportsShouldProcess=$true)] param( [Parameter(Mandatory=$True)][string]$webUrl, [Parameter(Mandatory=$True)][string]$listName, [Parameter(Mandatory=$False)][string]$numberOfMajorVersions ) #Get the web $web = Get-SPWeb $webUrl #Get the list $list = $web.Lists[$listName] $list.Items | % { #Get the item in a slightly more usable variable $item = $_ Write-Output ("Deleting versions for item {0}" -f $item.Name) #Get all major versions #Note, the version ID goes up by 512 for each major version. $majorVersions = $item.Versions | ? { $_.VersionID % 512 -eq 0} #get the largest version number $latestMajorID = $majorVersions | select VersionID -ExpandProperty VersionID | sort -Descending | select -First 1 #Slightly lazy way to get the latest major version and format it as a single point decimal Write-Output (" Latest major version to retain is {0:0.0}" -f ($latestMajorID /512)) #Filter the major versions to only those which are lower than the highest number - 512 * $numberOfMajorVersions $majorVersionsToDelete = $majorVersions | ? {$_.VersionID -le ($latestMajorID - 512 * $numberOfMajorVersions)} if ($majorVersionsToDelete) { $majorVersionsToDelete | % { Write-Verbose (" Deleting major version {0}" -f $_.VersionLabel) if ($pscmdlet.ShouldProcess($_.VersionLabel,"Deleting major version")) { $_.Delete() } } } else { Write-Verbose "No major versions to delete" } #Re-fetch the item to ensure that the versions are still valid $item = $list.GetItemByUniqueId($item.UniqueId) #Get all the minor versions $minorVersions = $item.Versions | ? { $_.VersionID % 512 -ne 0} #Delete Minor versions greater than the last major version kept $minorVersionsToDelete = $minorVersions | ? {$_.VersionID -lt $latestMajorID} if ($minorVersionsToDelete) { $minorVersionsToDelete | % { Write-Verbose ("Deleting minor version {0}" -f $_.VersionLabel) if ($pscmdlet.ShouldProcess($_.VersionLabel,"Deleting minor version")) { $_.Delete() } } } else { Write-Verbose "No minor versions to delete" } } $web.Dispose() }