当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] SharePoint Online:使用 PowerShell 导出-导入内容类型

作者:精品下载站 日期:2024-12-14 14:55:37 浏览:16 分类:玩电脑

SharePoint Online:使用 PowerShell 导出-导入内容类型


要求: 使用 PowerShell 在 SharePoint Online 中导出/导入内容类型。

使用 PowerShell 在 SharePoint Online 中导出内容类型

您是否希望在 SharePoint Online 中导出或导入内容类型?如果是这样,PowerShell 可以为您提供帮助!本博文将向您展示如何使用 PowerShell 在 SharePoint Online 网站之间导出和导入内容类型。如果您想要将内容类型从一个站点复制到另一个站点,或者想要在开发和生产环境之间移动内容类型,这会很有用。


#Load SharePoint CSOM Assemblies
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\ISAPI\Microsoft.SharePoint.Client.dll"
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\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

            #sharepoint online powershell export content type
            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://Crescent.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

该脚本输出一个 XML:

[玩转系统] SharePoint Online:使用 PowerShell 导出-导入内容类型

我们还可以使用 PnP PowerShell 将内容类型导出为:


#Function to Export the Content Type in SharePoint Online using powershell
Function Export-PnPContentType
{
    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 {
        #Connect to SharePoint Online
        Connect-PnPOnline -Url $SiteURL -Interactive

        #Get the content type to Export
        $ContentType = Get-PnPContentType -Identity $ContentTypeName -ErrorAction SilentlyContinue
 
        If($ContentType -ne $Null)
        {
            #Create Export XML File and export the schema of the content type
            New-Item $ExportFile -type file -force | Out-Null
 
            #sharepoint online powershell export content type
            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://crescent.sharepoint.com/sites/marketing"
$ContentTypeName= "Crescent Announcement"
$ExportFile = "C:\Temp\CrescentAnn.xml"

#Call the function to Export the content type
Export-PnPContentType -SiteURL $SiteURL -ContentTypeName $ContentTypeName -ExportFile $ExportFile

PowerShell 从 SharePoint Online 中的 XML 导入内容类型

下一步是将导出的内容类型恢复到所需的位置。


#Load SharePoint CSOM Assemblies
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\ISAPI\Microsoft.SharePoint.Client.dll"
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\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://Crescent.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

上述脚本的 PnP PowerShell 从 XML 文件恢复内容类型:


#Function to Import the Content Type in SharePoint Online using powershell
Function Import-PnPContentType
{
    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 {
        #Connect to SharePoint Online
        Connect-PnPOnline -Url $SiteURL -Interactive

        #Check if the content type to exists already
        $ContentType = Get-PnPContentType -Identity $ContentTypeName -ErrorAction SilentlyContinue
        
        If($ContentType -eq $Null)
        {
            #Import the XML File
            $ContentTypeXML = [xml](Get-Content($ImportFile))

            #Create the content type
            $ContentType = Add-PnPContentType -Name $ContentTypeName -Description $ContentTypeXML.ContentType.Description -Group $ContentTypeXML.ContentType.Group            
            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
                $ContentTypeFields = Get-PnPProperty -ClientObject $ContentType -Property Fields
                
                #Check if the content type has the field already!
                $ContentTypeField = $ContentTypeFields | Where {$_.InternalName -eq $Field.Name}
                If($ContentTypeField -eq $Null)
                {
                    #Get the site column
                    $SiteColumn = Get-PnPField | Where {$_.InternalName -eq $Field.Name}
                    If($SiteColumn -eq $Null)
                    {
                        #Add Site column to Web
                        Add-PnPFieldFromXml -FieldXml $Field.OuterXml 
                        Write-host "Site Column Added:" $($Field.Name)
                    }
                    Else
                    {
                        Write-host -f Yellow "`tSite Column '$($Field.Name)' Already Exists.. Skipping Creating site column"
                    } 

                    #get the field to add to content type
                    $SiteColumn = Get-PnPField | Where {$_.InternalName -eq $Field.Name}
                    #Add Field to Content type
                    Add-PnPFieldToContentType -Field $SiteColumn -ContentType $ContentTypeName

                    Write-host "`tField '$($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://crescent.sharepoint.com/sites/Operations"
$ContentTypeName= "Crescent Announcements
$ImportFile = "C:\Temp\CrescentAnn.xml"

#Call the function to Import the content type
Import-PnPContentType -SiteURL $SiteURL -ContentTypeName $ContentTypeName -ImportFile $ImportFile

当您想要在不同网站 SharePoint Online 网站集中重复使用内容类型而不使用内容类型中心时,您可以使用此 PowerShell 脚本复制粘贴它们。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯