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)

}

Disclaimer: The software, source code and guidance on this website is provided "AS IS"
with no warranties of any kind. The entire risk arising out of the use or
performance of the software and source code is with you.

Any views expressed in this blog are those of the individual and may not necessarily reflect the views of any organization the individual may be affiliated with.