Here is a powershell script you can use to get csv output of version history from SharePoint 2010 or 2013 list/libraries where versioning is enabled.The output includes changes to individual item fields as viewable from item version history.
The version information is accessed through SPListItemVersionCollection and SPFileVersionCollection objects.
$url = yourSiteUrl #Example http://server.com/web
$web = Get-SPWeb $url
$docLibrary = "DocLibraryName" #Here use your document library name Ex SharedDocuments
$list = $web.Lists[$documenntLibrary]
$csvFile = "C:\temp\versionHistory.csv" #Where the CSV file is saved
function GetFieldValue([Microsoft.SharePoint.SPField]$field, [Microsoft.SharePoint.SPListItemVersion]$currentVersion)
{
if(($field.Type -eq "User") -and ($currentVersion[$field.Title] -ne $null))
{
$newUser = [Microsoft.SharePoint.SPFieldUser]$field;
$fieldStr = $newUser.GetFieldValueAsText($currentVersion[$field.Title])
$fieldStr = "$($field.Title): $fieldStr"
}
elseif(($field.Type -eq "Lookup") -and ($currentVersion[$field.Title] -ne $null))
{
$newLookup = [Microsoft.SharePoint.SPFieldLookup]$field;
$fieldStr = $newLookup.GetFieldValueAsText($currentVersion[$field.Title])
$fieldStr = "$($field.Title): $fieldStr"
}
elseif(($field.Type -eq "ModStat") -and ($currentVersion[$field.Title] -ne $null))
{
$newModStat = [Microsoft.SharePoint.SPFieldModStat]$field;
$fieldStr = $newModStat.GetFieldValueAsText($currentVersion[$field.Title])
$fieldStr = "$($field.Title): $fieldStr"
}
else
{
$fieldStr = "$($field.Title): $($currentVersion[$field.Title])"
}
return $fieldStr
}
#Create/overwrite csv file, add headers:
Set-Content -Path $csvFile -Value ",No.,Modified,Modified By, Size, Comment`n"
foreach($item in $list.Items)
{
$versions = $item.Versions
$versionStr = "$($item["Title"])`n"
for($i = 0; $i -lt $versions.Count; $i++)
{
$currentVersion = $versions[$i]
$checkInComment = $item.File.Versions[$item.File.Versions.Count - $i].CheckInComment
if($i -eq 0)
{
$fileSize = $item.File.Length
}
else
{
$fileSize = $item.File.Versions[$item.File.Versions.Count - $i].Size
}
if($fileSize -lt 1MB)
{
$fileSize = "{0:N1}" -f ($fileSize / 1KB) + " KB"
}
else
{
$fileSize = "{0:N1}" -f ($fileSize / 1MB) + " MB"
}
$modifiedTime = $web.RegionalSettings.TimeZone.UTCToLocalTime($currentVersion.Created)
# CSV formatting: escape double quotes allow quotations, new line and commas within cell. Do not use space between comma and double quote escapes due to csv formating.
$versionStr += ",$($currentVersion.VersionLabel),$($modifiedTime),""$($currentVersion.CreatedBy.User.DisplayName)"",""$($fileSize)"",""$($checkInComment)"",`n"
if($i -lt ($versions.Count - 1))
{
# If more than one version:
$previousVersion = $versions[$i+1]
foreach($field in $currentVersion.Fields)
{
if(($field.ShowInVersionHistory -eq $true) -and ($currentVersion[$field.Title] -ne $previousVersion[$field.Title]) -and ($currentVersion[$field.Title] -ne "
”
))
{
$fieldStr = GetFieldValue $field $currentVersion
$versionStr +=",,""$fieldStr""`n"
}
}
}
else
{
# If first version:
foreach($field in $currentVersion.Fields)
{
if(($field.ShowInVersionHistory -eq $true) -and ($currentVersion[$field.Title] -ne "
”
))
{
$fieldStr = GetFieldValue $field $currentVersion
$versionStr +=",,""$fieldStr""`n"
}
}
}
}
#Append to file:
Add-Content -Path $csvFile -Value $versionStr
}
$web.Dispose()
Please let me know if you have any question. The file must be saved as .ps1 extension and can be executed
contact me on tesfaye.gari@gmail.com for any quesiton
Thanks
Tesfaye Gari