Sunday, October 20, 2013

Import Term Sets using PowerShell script

Hi,

There was requirement to import term sets csvs files all at a time into SharePoint Taxonomy.
Below is the script that has been written to pick up all term sets csv files from the folder where script file resides
// ImportTermSet_Batch.bat
Powershell.exe -Command Set-ExecutionPolicy "Bypass"
Powershell.exe -Command "& {D:\Naga\ImportTermSet\ImportTermSet.ps1}"
Pause

// ImportTermSet.ps1
#-----Input parameters to the script
$snapin = Get-PSSnapin | Where-Object {$_.Name -eq 'Microsoft.SharePoint.Powershell'}
if ($snapin -eq $null)
{
Write-Host "Loading SharePoint Powershell Snap-in"
Add-PSSnapin "Microsoft.SharePoint.Powershell"
}

# Get complete file path (eg:  E:\SP2010\xxxx.ps1)
$filepath = $MyInvocation.MyCommand.Definition                                       
# Get current Directory  file path  (eg:  E:\SP2010)
$directorypath = [System.IO.Path]::GetDirectoryName($filepath)        
# Get current Drive   (eg:  E:\)
$directory = Get-Item $directorypath | Split-Path -Parent             
$InputFile = $directorypath+"\ImportTermSetInputs.xml"

$fileEntries = [IO.Directory]::GetFiles($directorypath);

$xmlinput = [xml] (get-content $InputFile)
$item = $xmlinput.TermSetInputs


## Start logging
$LogTime = Get-Date -Format yyyy-MM-dd_h-mm
$LogFile = $directorypath + "\Importing Term Set-$LogTime.rtf"
Start-Transcript -Path $LogFile -Force

#---------------------Variables-----------------------------------#
#$sitecollurl - to get Site Collection URL from xml
$sitecollurl = $item.sitecollectionurl

#$mmsserviceapp - to get Metadata Service Application Name from xml
$mmsserviceapp = $item.mmsname

#$termsetgroup - to get Term Set Group Name from xml
$termsetgroup = $item.termsetgroupname

#$csvfpath - to get csv file path from xml
##$csvfpath = $item.csvfilepath

#------------------------------------------------------------------#

#-----------------------Function to create terms----------------------#
try
{
function ImportTermSet([Microsoft.SharePoint.Taxonomy.TermStore]$store, [string]$groupName, [PSCustomObject]$termSet) { 
  function ImportTerm([Microsoft.SharePoint.Taxonomy.Group]$group,
                      [Microsoft.SharePoint.Taxonomy.TermSet]$set,
                      [Microsoft.SharePoint.Taxonomy.Term]$parent,
                      [string[]]$path) {       
    if ($path.Length -eq 0) {
      return
    } elseif ($group -eq $null) {
      $group = $store.Groups | where { $_.Name -eq $path[0] }
      if ($group -eq $null) {
        $group = $store.CreateGroup($path[0])
      }
    } elseif ($set -eq $null) {
      $set = $group.TermSets | where { $_.Name -eq $path[0] }
      if ($set -eq $null) {
Write-Host “Create $path[0]“
        $set = $group.CreateTermSet($path[0])
Write-Host “Created $path[0]“
      }
    } else {
      $node = if ($parent -eq $null) { $set } else { $parent }
      $parent = $node.Terms | where { $_.Name -eq $path[0] }      
      if ($parent -eq $null) {
        $parent = $node.CreateTerm($path[0], 1033)
      }
    }
   
    ImportTerm $group $set $parent $path[1..($path.Length)]                                    
  }


  $termSetName = $termSet[0].”Term Set Name”   
  $termSet | where { $_.”Level 1 Term” -ne “” } | foreach {
    $path = @($groupName, $termSetName) + @(for ($i = 1; $i -le 7; $i++) {
      $term = $_.”Level $i Term”
        if ($term -eq “”) {
          break
        } else {
          $term
        }
      }
    )
       
    ImportTerm -path $path
  }
}

$session = Get-SPTaxonomySession -Site $sitecollurl
$store = $session.TermStores[$mmsserviceapp]  

foreach($fileName in $fileEntries)  
 {  
  $ext=[System.IO.Path]::GetExtension($fileName) 
  if($ext -eq ".csv") 
  { 
  Write-Host -ForegroundColor Green "Processing $fileName" 
  $CSVFILEPATH=$fileName; 
$termSet = Import-Csv $CSVFILEPATH
ImportTermSet $store $termsetgroup $termSet
  ##$terms = Import-Csv -Delimiter ';' $fileName 
  ##ImportTermSet $navigationSet $terms  
  Write-Host    "All term sets have been imported"
   } 
 }

$store.CommitAll()

Start-Sleep -Seconds 10;
}
catch
{
                Write-Output $_
}
#-------------------------------------------------------------#
$EndDate = Get-Date
Write-Host -ForegroundColor White "-----------------------------------"
Write-Host -ForegroundColor White "| Term Set Imported |"
Write-Host -ForegroundColor White "| Started on: $StartDate |"
Write-Host -ForegroundColor White "| Completed:  $EndDate |"
Write-Host -ForegroundColor White "-----------------------------------"
Stop-Transcript
Invoke-Item $LogFile 

// ImportTermSetInputs.xml
<?xml version="1.0" encoding="utf-8" ?>
<TermSetInputs>
  <sitecollectionurl>http://abc.com/</sitecollectionurl>
<mmsname>Managed Metadata Service</mmsname>
<termsetgroupname>Group Name</termsetgroupname>
</TermSetInputs>

Finally we are getting the expected output as below

Note:
Before running the script make sure that the current account with which script is running up is added under Term Store administrator of Managed Metadata service