Create Multiple Document Sets with Powershell
Just recently I've been having a heap of fun writing Powershell to aid a SharePoint content migration. Looking at one of the scripts I figured it's a nicely condensed way to demonstrate a few useful Powershell goodies whilst serving a useful purpose in SharePoint.
The full script is below, but here's the items worth noting;
$ErrorActionPreference = "Stop"
If you're nervous about your script running out of control, add the above line at the top, and it will stop on the first error it encounters.
$docSetInfos = Import-CSV C:\datafiles\DocSetData.csv -Header InvoiceID,Department,InvoiceDate,GrossAmount
Not only can I import data from a CSV really easily, but I tell Powershell what headers to apply so I can use dot notation later on to retrieve the specific values from each row.
$docsetProperties.Add('Department',$docSetInfo.Department)
I add properties to the document set by adding values to the hash table.
As far as the csv file, it doesn't need a header row, for my example it might look like this;
X45363,Sales,12/03/14,34534.43
Y76767,Finance,09/04/2014,4765.67
Z76360,IT,05/03/2014,76854.70
The above would create three document sets called X45363, Y76767 and Z76360.
Full script below. I suggest you paste it into an editor like Notepad++ to get a proper look at it. (and Happy SharePointing!);
$ErrorActionPreference = "Stop" $ver = $host | select version if($Ver.version.major -gt 1) {$Host.Runspace.ThreadOptions = "ReuseThread"} if(!(Get-PSSnapin Microsoft.SharePoint.PowerShell -ea 0)) { Write-Progress -Activity "Loading Modules" -Status "Loading Microsoft.SharePoint.PowerShell" Add-PSSnapin Microsoft.SharePoint.PowerShell }$DestinationWebURL = "http://myPortal/sites/mySiteCollection"
$DestinationLibraryTitle = "MyLibrary"
$docSetInfos = Import-CSV C:\datafiles\DocSetData.csv -Header InvoiceID,Department,InvoiceDate,GrossAmount$dWeb = Get-SPWeb $DestinationWebURL
$dList = $dWeb.Lists | ? {$_.title -like $DestinationLibraryTitle}$cType = $dList.ContentTypes["My Custom Document Set Content Type"]
foreach($docSetInfo in $docSetInfos)
{
#Build properties hash table from $docSetInfos[]
[Hashtable]$docsetProperties = @{}$InvoiceDateTime = Get-Date $docSetInfo.InvoiceDate $docsetProperties.Add('Department',$docSetInfo.Department) $docsetProperties.Add('InvoiceIDNumber',$docSetInfo.InvoiceID) $docsetProperties.Add('InvoiceDate',$InvoiceDateTime) $docsetProperties.Add('GrossAmount',$docSetInfo.GrossAmount) $NewFolder = [Microsoft.Office.DocumentManagement.DocumentSets.DocumentSet]::Create($dlist.RootFolder,$docSetInfo.InvoiceID,$cType.Id, $docsetProperties)
}