SharePoint Online: Export-Import Content Type using PowerShell

Requirement: Export-Import Content Types in SharePoint Online using PowerShell

Export Content Type in SharePoint Online using PowerShell:
When you want to re-use a content type in different site SharePoint Online site collections, without content type hub, You can copy-paste them using this PowerShell script.
#Load SharePoint CSOM Assemblies
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.dll"
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.Runtime.dll"

#Function to Export the Content Type in SharePoint Online using powershell
Function Export-SPOContentType
{
    param
    (
        [string]$SiteURL  = $(throw "Enter the Site URL!"),
        [string]$ContentTypeName = $(throw "Enter the Content Type Name!"),
        [string]$ExportFile = $(throw "Enter the File to Export!")
    )
    Try {
        #Get Credentials to connect
        $Cred= Get-Credential
        $Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Cred.Username, $Cred.Password)
 
        #Setup the context
        $Ctx = New-Object Microsoft.SharePoint.Client.ClientContext($SiteURL)
        $Ctx.Credentials = $Credentials
        
        #Get the Web
        $Web = $Ctx.Web
        $Ctx.Load($Web)
        $Ctx.ExecuteQuery()
        
        #Get Content Types from the Web
        $ContentTypes = $Web.ContentTypes
        $Ctx.Load($ContentTypes)
        $Ctx.ExecuteQuery()

        #Get the content type to Export
        $ContentType = $ContentTypes | Where {$_.Name -eq $ContentTypeName}

        If($ContentType -ne $Null)
        {
            #Create Export XML File and export the schema of the content type
            New-Item $ExportFile -type file -force | Out-Null
            Add-Content $ExportFile "<?xml version=`"1.0`" encoding=`"utf-8`"?>"
            Add-Content $ExportFile $ContentType.SchemaXml
 
            write-host "Content Type '$ContentTypeName' Exported Successfully!" -ForegroundColor  Green
        }
        else
        {            
            Write-Host "Content Type '$ContentTypeName' Doesn't Exist in the Site!" -ForegroundColor Yellow
        }
    }
    Catch {
        write-host -f Red "Error Exporting Content Type!" $_.Exception.Message
    }
}

#Variables
$SiteURL = "https://crescenttech.sharepoint.com/"
$ContentTypeName= "Crescent Project V1"
$ExportFile = "C:\Temp\CrescentProjV1.xml"

#Call the function to Export the content type
Export-SPOContentType -SiteURL $SiteURL -ContentTypeName $ContentTypeName -ExportFile $ExportFile
and the script outputs a XML:
powershell to export import content type sharepoint online

PowerShell to Import Content Type from XML in SharePoint Online
#Load SharePoint CSOM Assemblies
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.dll"
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.Runtime.dll"

#Function to Import the Content Type in SharePoint Online using powershell
Function Import-SPOContentType
{
    param
    (
        [string]$SiteURL  = $(throw "Enter the Site URL!"),
        [string]$ContentTypeName = $(throw "Enter the Content Type Name!"),
        [string]$ImportFile = $(throw "Enter the File to Import!")
    )
    Try {
        #Get Credentials to connect
        $Cred= Get-Credential
        $Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Cred.Username, $Cred.Password)
 
        #Setup the context
        $Ctx = New-Object Microsoft.SharePoint.Client.ClientContext($SiteURL)
        $Ctx.Credentials = $Credentials
        
        #Get the Web & site columns
        $Web = $Ctx.Web
        $Ctx.Load($Web)
        $Ctx.Load($Web.Fields)
        $Ctx.ExecuteQuery()
        
        #Get existing Content Types from the Web
        $ContentTypes = $Web.ContentTypes
        $Ctx.Load($ContentTypes)
        $Ctx.ExecuteQuery()

        #Check if the content type exists already
        $ContentType = $ContentTypes | Where {$_.Name -eq $ContentTypeName}

        If($ContentType -eq $Null)
        {
            #Import the XML File
            $ContentTypeXML = [xml](Get-Content($ImportFile))

            #Create the content type
            $CTypeCreationInfo=New-Object Microsoft.SharePoint.Client.ContentTypeCreationInformation
            $CTypeCreationInfo.Name = $ContentTypeName
            $CTypeCreationInfo.Description = $ContentTypeXML.ContentType.Description
            $CTypeCreationInfo.Group = $ContentTypeXML.ContentType.Group
            $ContentType=$ContentTypes.Add($CTypeCreationInfo)
            $Ctx.ExecuteQuery()
            
            Write-host "Content Type '$ContentTypeName' Created Successfully!" -ForegroundColor Green

            Write-host "Adding Fields to the Content Type..." -ForegroundColor Yellow
            #Remove the "Version" Attribute from the XML
            $ContentTypeXML.ContentType.Fields.Field.RemoveAttribute("Version")
            
            #Add Fields to content type
            ForEach($Field in $ContentTypeXML.ContentType.Fields.Field)
            {
                #Get existing fields from content type
                $Ctx.Load($ContentType.Fields)
                $Ctx.ExecuteQuery()
                
                #Check if the content type has the field already!
                $ContentTypeField = $ContentType.Fields | Where {$_.InternalName -eq $Field.Name}
                If($ContentTypeField -eq $Null)
                {
                    #Get the site column
                    $SiteColumn = $Web.Fields | Where {$_.InternalName -eq $Field.Name}
                    If($SiteColumn -eq $Null)
                    {
                        #Add Site column to Web
                        $SiteColumn = $Web.Fields.AddFieldAsXml($Field.OuterXml, $True,[Microsoft.SharePoint.Client.AddFieldOptions]::AddFieldInternalNameHint)
                        $Ctx.ExecuteQuery()
                        Write-host "Site Column Added:" $($Field.Name)
                    }
                    Else
                    {
                        Write-host -f Yellow "Site Column '$($Field.Name)' Already Exists.. Skipping Creating site column"
                    } 
                    #Reload Web.Fields
                    $Ctx.Load($Web.Fields)
                    $Ctx.ExecuteQuery()

                    $SiteColumn = $Web.Fields | Where {$_.InternalName -eq $Field.Name}
                    #Add field to content type
                    $FieldLink = New-Object Microsoft.SharePoint.Client.FieldLinkCreationInformation
                    $FieldLink.Field = $SiteColumn
                    [Void]$ContentType.FieldLinks.Add($FieldLink)
                    $ContentType.Update($True)
                    $Ctx.ExecuteQuery() 

                    Write-host "Field $($Field.Name) Added to Content Type" -Foregroundcolor Green
                }
            } 
            write-host "Content Type '$ContentTypeName' Imported Successfully!" -ForegroundColor  Green
        }
        else
        {            
            Write-Host "Content Type '$ContentTypeName' Already Exist in the Site!" -ForegroundColor Yellow
        }
    }
    Catch {
        write-host -f Red "Error Importing Content Type!" $_.Exception.Message
    } 
}

#Variables
$SiteURL = "https://crescenttech.sharepoint.com/Sites/Marketing"
$ContentTypeName= "Crescent Project V1"
$ImportFile = "C:\Temp\CrescentProjV1.xml"

#Call the function to Import the content type
Import-SPOContentType -SiteURL $SiteURL -ContentTypeName $ContentTypeName -ImportFile $ImportFile
SharePoint Online: Export-Import Content Type using PowerShell SharePoint Online: Export-Import Content Type using PowerShell Reviewed by Salaudeen Rajack on February 28, 2018 Rating: 5

No comments:

Please Login and comment to get your questions answered!

Powered by Blogger.