## DESCRIPTION
## ------------------------------------------------
## Script to loop through a set of Subsites and a
## SharePoint List of items and then either
## create a new item or update it in your SharePoint List.
##
## EXPLAINATION
## ------------------------------------------------
## This example illustrates how to compare 2 dynamically
## created arrays, look for the difference between
## the two, then do something like update a SharePoint list,
## this could also apply to updating a text file
## or csv/excel file
##
## 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
CLS
## Set variables
## This variable will be the site where all the subsites
## are that I want to get an array of
$parentSite = "http://sp2010/clients"
$rollupSite = "http://sp2010"
## Define the name of the SharePoint List we want to work with
$rollupListName = "Orders"
## Initialize and create empty arrays
$listOfSites = @()
$listOfItems = @()
function GetListOfSites
{
## 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 -ne $true)
{
## Loop through all the sub sites of the site url we got
foreach($webSite in $web.Webs)
{
## We have to use @() around the items we are going
## to add to the array. The += means we want to
## keep adding items into our array named $listOfSites
$listOfSites += @($webSite.Title)
}
## Calling a function inside another function will allow you to make
## use of variables defined in functions that call it. Normally variable
## values are only accessible in the scope they were created. We need
## to pass off $listOfSites to the function GetLIstOfItems so it can process
## the array
GetListOfItems
}
else
{
## Gracefully let the user know that the site they requested
## was not available or was not found.
Write-Host "$web not found, check the url and try again."
}
}
function GetListOfItems
{
$listWeb = Get-SPWeb $rollupSite
$listName = $listWeb.Lists[$rollupListName]
foreach($rollupListItem in $listName.Items)
{
$listOfItems += @($rollupListItem.Title)
}
CompareItems
}
function CompareItems
{
foreach($foundSite in $listOfSites)
{
## Filter out anything that already exists in the Rollup List
## We have to use -notcontains/-contains when analyizng arrays
if($listOfItems -notcontains $foundSite)
{
## Item not found so lets create new item
foreach($value in $foundSite)
{
$rollupListWeb = Get-SPWeb $rollupSite
$rollupList = $rollupListWeb.Lists[$rollupListName]
$rollupListItems = $rollupList.Items.Add()
$rollupListItems["Title"] = $value
$rollupListItems.Update()
Write-Host "Creating $value"
}
}
else
{
## Item was found so lets update it
foreach($value in $foundSite)
{
$rollupListWeb = Get-SPWeb $rollupSite
$rollupList = $rollupListWeb.Lists[$rollupListName]
$rollupListItems = $rollupList.Items
if($rollupListItems.Title -notmatch $value)
{
$rollupListItem["Title"] = $value
$rollupListItem.Update()
Write-Host "Updating $value"
}
}
}
}
}
Start-SPAssignment -Global
GetListOfSites
Stop-SPAssignment -Global
SharePoint 2007/2010 development using C# and Powershell. Mostly just things I have found that make my job easier but I had to search around to find answers to.
Monday, February 25, 2013
Compare dynamic arrays with Powershell and some SharePoint
Today was a day I got to work on a revision to a script that I thought was working but apparently was not tested as well as I thought, not uncommon with pretty much everything I have done thus far. :) This is pretty well commented. I am starting to make use of templates when working with scripts to keep them looking a bit easier to understand.
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment