While planning for the Migration or other purpose sometimes, we need to know the web parts added to the SharePoint Pages, This inventory is not available on any of the existing migration tools handy. The below script will give a clear output of the WebpartName, PageURL, Title, URL, CreatedBy, WebpartID, WebpartType, ModifiedBy and Library or PageName
$ver = $host | select version
if($Ver.version.major -gt 1) {$Host.Runspace.ThreadOptions = "ReuseThread"}
if(!(Get-PSSnapin Microsoft.SharePoint.PowerShell -ea 0))
{
Add-PSSnapin Microsoft.SharePoint.PowerShell
}
cls
try{
#Specify a directory for which to log the results
$0 = $MyInvocation.MyCommand.Definition
$dp0 = [System.IO.Path]::GetDirectoryName($0)
$LoggingDirectory = $dp0
$logFile=$("$dp0LogsWebParts_Site_SitePagesLayout_LogInformation.txt")
$ExecutionStartTime = (Get-Date -UFormat "%Y-%m-%d_%I:%M:%S %p").tostring()
Write "Script started at" $ExecutionStartTime >> $logFile
Write-Host "Script started at" $ExecutionStartTime
$PageLayout_Webparts_DetailsCSV =@()
#Create a variable based on the current date and time
$StartTime = (Get-Date -UFormat "%Y-%m-%d_%I-%M-%S %p").tostring()
#Dynamically generate the log file name
$Filename = "$LoggingDirectoryResultWebPartDetails_In_SitePages_Pages_Library_" +$StartTime +".csv"
$webapplist = Get-SPWebApplication
foreach($webappUrl in $webapplist){
try{
#Specify the Web Application to be targeted
$WebApplicationURL = $webappUrl.Url
Write "`r`n web application URL" $WebApplicationURL "is being investigated" >> $logFile
#Get all sites within each of the specified web application
$AllSites = Get-SPSite -WebApplication $WebApplicationURL -Limit All
foreach($Site in $AllSites){
Write "`r`nInside Site'" + $Site.Url >> $logFile
try{
#Return all webs in each site collection returned to the AllWebs variable
$AllWebs = $Site.Allwebs
#Perform some actions against each web retrieved from the current target site collection
foreach($Web in $AllWebs){
try{
$SitePageLib = $Web.GetFolder("SitePages")
foreach($file in $SitePageLib.Files){
if($file){
if($file.Name.Contains(".aspx")){
$manager = $web.GetLimitedWebPartManager($file.Url,[System.Web.UI.WebControls.WebParts.PersonalizationScope]::Shared)
$webCollection = $manager.WebParts
if($webCollection.Count -ne 0)
{
for($i =0;$i -lt $webCollection.Count; $i++)
{
write ($i + 1).ToString() " " $webCollection[$i].GetType().Name " " $webCollection[$i].Title ',Web URL:' $Web.Url ',File URL:' $file.Url >> $logFile
$PageLayout_Webparts_DetailsCSV+=New-Object PSObject -Property @{
URL=$Web.Url;
Title=$Web.Title;
PageURL=$file.Url;
PageTitle=$file.Title;
LibraryName='Site Pages';
WebpartID=$webCollection[$i].ID;
WebpartName=$webCollection[$i].Title;
WebpartType=$webCollection[$i].GetType().Name;
CreatedBy=$file.Author.DisplayName;
ModifiedBy=$file.ModifiedBy.DisplayName}
}
}
if($manager){$manager.Dispose()}
}
}
}
$PagesLib = $Web.GetFolder("Pages")
foreach($Item in $PagesLib.Files){
if($Item){
if($Item.Name.Contains(".aspx")){
$manager = $web.GetLimitedWebPartManager($Item.Url,[System.Web.UI.WebControls.WebParts.PersonalizationScope]::Shared)
$webCollection = $manager.WebParts
if($webCollection.Count -ne 0)
{
for($i =0;$i -lt $webCollection.Count; $i++)
{
write ($i + 1).ToString() " " $webCollection[$i].GetType().Name " " $webCollection[$i].Title ',Web URL:' $Web.Url ',File URL:' $Item.Url >> $logFile
$PageLayout_Webparts_DetailsCSV+=New-Object PSObject -Property @{
URL=$Web.Url;
Title=$Web.Title;
PageURL=$Item.Url;
PageTitle=$Item.Title;
LibraryName='Pages';
WebpartID=$webCollection[$i].ID;
WebpartName=$webCollection[$i].Title;
WebpartType=$webCollection[$i].GetType().Name;
CreatedBy=$Item.Author.DisplayName;
ModifiedBy=$Item.ModifiedBy.DisplayName}
}
}
if($manager){$manager.Dispose()}
}
}
}
$Web.Dispose()
}
catch [Exception]{
Write $_.Exception|format-list -force >>$logFile
Write-Host -f red $_.Exception|format-list -force
}
finally{
if($Web){
$Web.Dispose()
}
}
}
$Site.Dispose()
}
catch [Exception]{
Write $_.Exception|format-list -force >>$logFile
Write-Host -f red $_.Exception|format-list -force
}
finally{
if($Site){
$Site.Dispose()
}
}
}
}
catch [Exception]{
Write $_.Exception|format-list -force >>$logFile
Write-Host -f red $_.Exception|format-list -force
}
}
$PageLayout_Webparts_DetailsCSV | Export-CSV -path $Filename -notype
}
catch [Exception]{
Write $_.Exception|format-list -force >>$logFile
Write-Host -f red $_.Exception|format-list -force
}
$EndTime = (Get-Date -UFormat "%Y-%m-%d_%I:%M:%S %p").tostring()
Write "Script stopped at" $EndTime >> $logFile
Write-Host "Script stopped at" $EndTime
Result
Hope the handy script helps to get the inventory and save few hours of effort.
Happy Coding,
Hariramakrishnan Vasuthevan
Leave a comment