Saturday, March 30, 2013

Powershell Delete a webpart from a SharePoint webpart page loop

Today I find that when I create new things, often times I create too many things during my testing of say dynamically adding a webpart to a SharePoint webpart page. So I need to have a way to quickly loop through my hundereds of sites and delete the webpart.


## CONTACT INFO
## ------------------------------------------------
## CREATED   : 2013.03.30
## MODIFIED  :
## AUTHOR    : Jason Lasby 
## EMAIL     : digitalslavery@gmail.com 
##
## DESCRIPTION
## ------------------------------------------------
## Script to loop through a set of Subsites and  
## Delete a web part from a page stored in the SitePages 
## Document Library named Dashboard.aspx
## 
## EXPLAINATION
## ------------------------------------------------
## This example illustrates how to delete a webpart 
## from a set of sites that use the same page layout
## and configured with the same web parts, think about 
## a company dashboard site where each department may 
## report standard data like who is in who is out, 
## work related accidents, finance data, shipping
## information, etc... We can loop through our sites
## and add or remove web parts for all sites at once.
##
## BEGIN
## ------------------------------------------------
## Load up the snapin so Powershell can work with SharePoint
## if the snapin was already loaded don't alert the user
Add-PSSnapin microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue
## Clear any errors or output to the screen
CLS
## Set variables
## This variable will be the site where I want to start
$parentSite = "http://sp2010/dashboards"

function RemoveWebPart 
{
 foreach($wp in $wpm.WebParts | ?{$_.Title -like "* Banner *"})
 {
  if($wp)
  {
   $listOfWebParts = $wp.ID
   foreach($matchFound in $listOfWebParts)
   {
    $wpm.DeleteWebPart($wpm.WebParts[$matchFound])
    Write-Host "$matchFound was deleted for $webSite"
   }
  }
     
 }
}

Start-SPAssignment -Global
## Create a variable to hold the SharePoint site, invoke the connection
## to the site we defined in the $parentSite variable
$web = Get-SPWeb $parentSite
## Check to make sure that url exists
if($web)
{
 ## Loop through all the sub sites of the site url we got
 foreach($webSite in $web.Webs)
 {
  $webSiteName = $webSite.Name
  $pageUrl = "SitePages/dashboard.aspx"
  $page = $webSite.GetFile($pageUrl) 
  $wpm = $webSite.GetLimitedWebPartManager($page, [System.Web.UI.WebControls.WebParts.PersonalizationScope]::Shared)
  if($wpm)
  {
   RemoveWebPart 
  }
  else
  {
   Write-Host "Web part not found"
  }
   
 }
}
 else
 {
  ## Gracefully let the user know that the site they requested
  ## was not available or was not found.
  Write-Host "$webSite not found, check the url and try again."
 }

Stop-SPAssignment -Global


1 comment:

Vaddi Venkat said...

Please confirm if this step has no error.
$listOfWebParts = $wp.ID
foreach($matchFound in $listOfWebParts)
------------------------
$wp.ID is a single value not a collection. I'm confused why there is foreach for $listOfWebParts, where as this is just an ID.