Pour plusieurs raisons, on peut être amené à exporter la liste des termes contenus dans un TermSet du service des métadonnées gérées (Managed Metadata Service Application).

L’API SharePoint nous donne accès à toutes les briques qui composent le service des métadonnées gérées:

Microsoft.SharePoint.Taxonomy
|_ Classe TaxonomySession
|__ Classe TermStore
|___ Classe Group
|____ Classe TermSet
|_____ Classe Term

A partir de schéma qui est très simple, on peut « presque » tout faire, je dis presque, car on ne peux pas exporter entièrement un TermStore, en vue d’une restauration sur une autre ferme.

Le script suivant, permet d’extraire tous les termes d’un TermSet donné, dans fichier CSV.

pour extraire tous le TermStore, il faudra exécuter la fonction pour tous les TermSets de tous les TermGroups.

Function Export-SPTermSetTerms {
    param 
	(
        [string]$SiteUrl = $(throw "Please provide a Site Collection URL"),
        [string]$TermStoreName 	= $(throw "Please provide a Term Store Name"),
        [string]$TermGroupName 	= $(throw "Please provide a Term Group Name"),
        [string]$TermSetName 	= $(throw "Please provide a Term Set Name"),
        [string]$OutputDir 		= $PWD
    )
	try
	{
		$SPSite = Get-SPSite $SiteUrl
	}
	catch
	{
	}
	if ($SPSite -ne $null)
	{
		#Initialisation de la session de taxonomie
		$TaxonomySession = new-object Microsoft.SharePoint.Taxonomy.TaxonomySession($SPSite, $true)
		if ($TaxonomySession -ne $null)
		{
			#Récupération du TermStore
			$TermStore = $TaxonomySession.TermStores[$TermStoreName]
			if ($TermStore -ne $null)
			{
				#Récupération du TermGroup
				$TermGroup = $TermStore.Groups[$TermGroupName]
	            if ($TermGroup -ne $null)
	            {
					#Récupération du TermSet
					$TermSet = $TermGroup.TermSets[$TermSetName]
					if ($TermSet -ne $null)
					{
						$CsvFilePath = $OutputDir + "\Taxo_" + $TermSetName + ".csv"
						$CsvHeader = "Name,Id"
						$CsvHeader | Out-File $CsvFilePath
	                    foreach ($term in $TermSet.GetAllTerms())
	                    {
							#Récupération des terms en remplacant le "&" encodé
		                    [Byte[]] $ampersand = 0xEF,0xBC,0x86
							[string] $EncodedAmper = [System.Text.Encoding]::UTF8.GetString($ampersand)
	                        """" + $term.Name.Replace($EncodedAmper, "&") + `
							"""" + "," + $term.Id | Out-File $CsvFilePath -append
	                    }
	                    write-host "Your CSV has been created at $CsvFilePath"
					}
					else { Write-Error "The TermSet '$TermSetName' is Null" }
				}
				else { Write-Error "The TermGroup '$TermGroupName' is Null" }
			}
			else { Write-Error "The TermStore '$TermStoreName' is Null" }
		}
		else { Write-Error "Taxonomy Session for $SiteUrl is Null" }
	}
	else { Write-Error "The SharePoint site $SiteUrl is Null" }
}