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

[玩转系统] SharePoint Online:使用 PowerShell 将所有文档库复制到另一个网站

作者:精品下载站 日期:2024-12-15 00:25:51 浏览:14 分类:玩电脑

SharePoint Online:使用 PowerShell 将所有文档库复制到另一个网站


要求:将所有文档库复制到 SharePoint Online 中的另一个网站集。

[玩转系统] SharePoint Online:使用 PowerShell 将所有文档库复制到另一个网站

PowerShell 将文档库从一个网站复制到另一个网站集:

您是否希望将所有 SharePoint Online 文档库从一个站点迁移到另一个站点?如果是这样,您可以使用 PowerShell 轻松复制它们。在 SharePoint Online 中,可以将整个文档库从一个站点复制到另一个站点。如果您想要重用现有库作为新项目的起点,或者想要与另一个站点上的同事共享库,这会很有用。在本教程中,我们将向您展示如何将文档库复制到 SharePoint Online 中的另一个网站。

就我而言,在迁移项目期间,我需要将所有文档库从一个网站集复制到另一个网站集。下面是我用来在网站集之间复制所有库(只是没有实际内容的库)的 PowerShell 脚本:


#Parameters
$SourceSiteURL = "https://crescent.sharepoint.com/sites/Neoma"
$DestinationSiteURL = "https://crescent.sharepoint.com/sites/Neoma-Copy"

#Connect to the source Site
Connect-PnPOnline -URL $SourceSiteURL -Interactive 

#Get all document libraries
$SourceLibraries =  Get-PnPList | Where {$_.BaseType -eq "DocumentLibrary" -and $_.Hidden -eq $False}

#Connect to the destination site
Connect-PnPOnline -URL $DestinationSiteURL -Interactive

#Get All Lists in the Destination
$Libraries = Get-PnPList

ForEach($Library in $SourceLibraries)
{
    #Check if the library already exists in target
    If(!($Libraries.Title -contains $Library.Title))
    { 
        #Create a document library
        New-PnPList -Title $Library.Title -Template DocumentLibrary
        Write-host "Document Library '$($Library.Title)' created successfully!" -f Green
    }
    else
    {
        Write-host "Document Library '$($Library.Title)' exists already!" -f Yellow
    }
}

SharePoint Online:PowerShell 在站点之间复制库及其内容

这次,让我们将所有文档库及其内容(文件、文件夹、子文件夹等)复制到另一个网站集:


#Parameters
$SourceSiteURL = "https://crescent.sharepoint.com/sites/Marketing"
$DestinationSiteURL = "https://crescent.sharepoint.com/sites/Branding"

#Connect to the source Site
$SourceConn = Connect-PnPOnline -URL $SourceSiteURL -Interactive -ReturnConnection
$Web = Get-PnPWeb -Connection $SourceConn

#Get all document libraries
$SourceLibraries =  Get-PnPList -Includes RootFolder -Connection $SourceConn | Where {$_.BaseType -eq "DocumentLibrary" -and $_.Hidden -eq $False}

#Connect to the destination site
$DestinationConn = Connect-PnPOnline -URL $DestinationSiteURL -Interactive -ReturnConnection

#Get All Lists in the Destination site
$DestinationLibraries = Get-PnPList -Connection $DestinationConn

ForEach($SourceLibrary in $SourceLibraries)
{
    #Check if the library already exists in target
    If(!($DestinationLibraries.Title -contains $SourceLibrary.Title))
    { 
        #Create a document library
        $NewLibrary  = New-PnPList -Title $SourceLibrary.Title -Template DocumentLibrary -Connection $DestinationConn
        Write-host "Document Library '$($SourceLibrary.Title)' created successfully!" -f Green
    }
    else
    {
        Write-host "Document Library '$($SourceLibrary.Title)' already exists!" -f Yellow
    }

    #Get the Destination Library
    $DestinationLibrary = Get-PnPList $SourceLibrary.Title -Includes RootFolder -Connection $DestinationConn
    $SourceLibraryURL = $SourceLibrary.RootFolder.ServerRelativeUrl
    $DestinationLibraryURL = $DestinationLibrary.RootFolder.ServerRelativeUrl
    
    #Calculate Site Relative URL of the Folder
    If($Web.ServerRelativeURL -eq "/")
    {
	    $FolderSiteRelativeUrl = $SourceLibrary.RootFolder.ServerRelativeUrl
    }
    Else
    {      
	    $FolderSiteRelativeUrl = $SourceLibrary.RootFolder.ServerRelativeUrl.Replace($Web.ServerRelativeURL,[string]::Empty)
    }

    #Get All Content from Source Library's Root Folder
    $RootFolderItems = Get-PnPFolderItem -FolderSiteRelativeUrl $FolderSiteRelativeUrl -Connection $SourceConn | Where {($_.Name -ne "Forms") -and (-Not($_.Name.StartsWith("_")))}
        
    #Copy Items to the Destination
    $RootFolderItems | ForEach-Object {
        $DestinationURL = $DestinationLibrary.RootFolder.ServerRelativeUrl
        Copy-PnPFile -SourceUrl $_.ServerRelativeUrl -TargetUrl $DestinationLibraryURL -Force -OverwriteIfAlreadyExists
        Write-host "`tCopied '$($_.ServerRelativeUrl)'" -f Green    
    }    
    Write-host "`tContent Copied from $SourceLibraryURL to  $DestinationLibraryURL Successfully!" -f Cyan
}

上面的脚本与简单的文档库完美配合。但是,如果您的文档库添加了自定义元数据列怎么办?如果您想要复制文档库及其自定义设置怎么办?好吧,这是使用创建列表模板和列表实例方法在 SharePoint Online 中复制文档库的 PowerShell 脚本!

PowerShell 在 SharePoint Online 的网站集之间复制文档库

此 PowerShell 脚本将列表及其设置和元数据列复制到目标站点。

在运行此脚本之前,请确保您已在 SharePoint Online 中启用自定义脚本!否则,您将出现错误“访问被拒绝。您无权执行此操作或访问此资源。”如何在 SharePoint Online 中启用自定义脚本?

#Function to Copy All libraries from One Site to another
Function Copy-PnPAllLibraries
{
    param (
    [parameter(Mandatory=$true, ValueFromPipeline=$true)][string]$SourceSiteURL,
    [parameter(Mandatory=$true, ValueFromPipeline=$true)][string]$DestinationSiteURL
    )
 
    Try {
        #Connect to the Source Site
        $SourceConn = Connect-PnPOnline -URL $SourceSiteURL -Interactive -ReturnConnection
        $SourceCtx = $SourceConn.Context
        $SourceRootWeb = $SourceCtx.Site.RootWeb
        $SourceCtx.Load($SourceRootWeb)
        $SourceCtx.ExecuteQuery()

        #Connect to the Destination Site
        $DestinationConn = Connect-PnPOnline -URL $DestinationSiteURL -Interactive -ReturnConnection
        $DestinationCtx = $DestinationConn.Context
        $DestinationRootWeb = $DestinationCtx.Site.RootWeb
        $DestinationCtx.Load($DestinationRootWeb)
        $DestinationCtx.ExecuteQuery()    
 
        #Exclude certain libraries
        $ExcludedLibraries =  @("Style Library","Preservation Hold Library", "Site Pages", "Site Assets","Form Templates", "Site Collection Images","Site Collection Documents")
    
        #Get Libraries from Source site - Skip hidden and certain libraries
        $SourceLibraries =  Get-PnPList -Includes RootFolder -Connection $SourceConn | Where {$_.BaseType -eq "DocumentLibrary" -and $_.Hidden -eq $False -and $_.Title -notin $ExcludedLibraries}
        
        #region PrepareTemplates
        $SourceListTemplates = $SourceCtx.Site.GetCustomListTemplates($SourceRootWeb)
        $SourceCtx.Load($SourceListTemplates)
        $SourceCtx.ExecuteQuery()
        $DestinationListTemplates = $DestinationCtx.Site.GetCustomListTemplates($DestinationRootWeb)
        $DestinationCtx.Load($DestinationListTemplates)
        $DestinationCtx.ExecuteQuery()

        #Remove Document Library Templates from source and destination sites
        ForEach($Library in $SourceLibraries)
        {
            $SourceListTemplate = $SourceListTemplates | Where {$_.Name -eq $Library.id.Guid}
            $SourceListTemplateURL = $SourceRootWeb.ServerRelativeUrl+"/_catalogs/lt/"+$Library.id.Guid+".stp"   
 
            #Remove the List template if exists in source   
            If($SourceListTemplate)
            {
                $SourceListTemplateFile = Get-PnPFile -Url $SourceListTemplateURL -Connection $SourceConn
                $SourceListTemplateFile.DeleteObject()
                $SourceCtx.ExecuteQuery()
            }
        }

        Write-host "Creating List Templates..." -f Yellow -NoNewline
        #Create Templates
        $SourceLibraries | ForEach-Object {
            $_.SaveAsTemplate($_.id.Guid, $_.id.Guid, [string]::Empty, $False)
            $SourceCtx.ExecuteQuery()
  
            #Copy List Template from source to the destination site
            $SourceListTemplateURL = $SourceRootWeb.ServerRelativeUrl+"/_catalogs/lt/"+$_.id.Guid+".stp"   
            Copy-PnPFile -SourceUrl $SourceListTemplateURL -TargetUrl ($DestinationRootWeb.ServerRelativeUrl+"/_catalogs/lt") -Force -OverwriteIfAlreadyExists
        }
        Write-host "Done!" -f Green
        Start-Sleep 5

        #Reload the List Templates in the Destination Site
        $DestinationListTemplates = $DestinationCtx.Site.GetCustomListTemplates($DestinationRootWeb)
        $DestinationCtx.Load($DestinationListTemplates)
        $DestinationCtx.ExecuteQuery()
        #endregion

        #Iterate through each library in the source
        ForEach($SourceLibrary in $SourceLibraries)
        {
            Write-host "Copying library:"$SourceLibrary.Title -f Magenta

            #Get the Template
            $DestinationListTemplate = $DestinationListTemplates | Where {$_.Name -eq $SourceLibrary.id.Guid}
 
            #Create the destination library from the list template, if it doesn't exist
            Write-host "Creating New Library in the Destination Site..." -f Yellow -NoNewline
            If(!(Get-PnPList -Identity $SourceLibrary.Title -Connection $DestinationConn))
            {
                #Create the destination library
                $ListCreation = New-Object Microsoft.SharePoint.Client.ListCreationInformation
                $ListCreation.Title = $SourceLibrary.Title
                $ListCreation.ListTemplate = $DestinationListTemplate
                $DestinationList = $DestinationCtx.Web.Lists.Add($ListCreation)
                $DestinationCtx.ExecuteQuery()
                Write-host "Library '$($SourceLibrary.Title)' created successfully!" -f Green
            }
            Else
            {
                Write-host "Library '$($SourceLibrary.Title)' already exists!" -f Yellow
            }

            Write-host "Copying Files and Folders from the Source to Destination Site..." -f Yellow    
            $DestinationLibrary = Get-PnPList $SourceLibrary.Title -Includes RootFolder -Connection $DestinationConn
            #Copy All Content from Source Library's Root Folder to the Destination Library
            If($SourceLibrary.ItemCount -gt 0)
            {
                #Get All Items from the Root Folder of the Library
                $global:counter = 0
                $ListItems = Get-PnPListItem -List $SourceLibrary.Title -Connection $SourceConn -PageSize 500 -Fields ID -ScriptBlock {Param($items) $global:counter += $items.Count; Write-Progress -PercentComplete `
                    (($global:Counter / $SourceLibrary.ItemCount) * 100) -Activity "Getting Items from List" -Status "Getting Items $global:Counter of $($SourceLibrary.ItemCount)"}
                $RootFolderItems = $ListItems | Where { ($_.FieldValues.FileRef.Substring(0,$_.FieldValues.FileRef.LastIndexOf($_.FieldValues.FileLeafRef)-1)) -eq $SourceLibrary.RootFolder.ServerRelativeUrl}
                Write-Progress -Activity "Completed Getting Items from Library $($SourceLibrary.Title)" -Completed
        
                #Copy Items to the Destination
                $RootFolderItems | ForEach-Object {
                    $DestinationURL = $DestinationLibrary.RootFolder.ServerRelativeUrl
                    Copy-PnPFile -SourceUrl $_.FieldValues.FileRef -TargetUrl $DestinationLibrary.RootFolder.ServerRelativeUrl -Force -OverwriteIfAlreadyExists
                    Write-host "`tCopied $($_.FileSystemObjectType) '$($_.FieldValues.FileRef)' Successfully!" -f Green     
                }
            }
        }

        #Cleanup List Templates in source and destination sites
        ForEach($Library in $SourceLibraries)
        {
            $SourceListTemplate = $SourceListTemplates | Where {$_.Name -eq $Library.id.Guid}
            $SourceListTemplateURL = $SourceRootWeb.ServerRelativeUrl+"/_catalogs/lt/"+$Library.id.Guid+".stp"   
 
            #Remove the List template if exists in source   
            If($SourceListTemplate)
            {
                #Remove-PnPFile -ServerRelativeUrl $SourceListTemplateURL -Recycle -Force -Connection $SourceConn
                $SourceListTemplateFile = Get-PnPFile -Url $SourceListTemplateURL -Connection $SourceConn
                $SourceListTemplateFile.DeleteObject()
                $SourceCtx.ExecuteQuery()
            }
            #Remove the List template if exists in target 
            $DestinationListTemplate = $DestinationListTemplates | Where {$_.Name -eq $Library.id.Guid}
            $DestinationListTemplateURL = $DestinationRootWeb.ServerRelativeUrl+"/_catalogs/lt/"+$Library.id.Guid+".stp" 
            #Remove the List template if exists    
            If($DestinationListTemplate)
            {
                #Remove-PnPFile -ServerRelativeUrl $DestinationListTemplateURL -Recycle -Force -Connection $DestinationConn
                $DestinationListTemplate = Get-PnPFile -Url $DestinationListTemplateURL -Connection $DestinationConn
                $DestinationListTemplate.DeleteObject()
                $DestinationCtx.ExecuteQuery()        
            }
        }
    }
    Catch {
        write-host -f Red "Error:" $_.Exception.Message
    }
}

#Parameters
$SourceSiteURL = "https://crescent.sharepoint.com/sites/Marketing"
$DestinationSiteURL = "https://crescent.sharepoint.com/sites/HR"

#Call the function to copy libraries to another site
Copy-PnPAllLibraries -SourceSiteURL $SourceSiteURL -DestinationSiteURL $DestinationSiteURL

要将单个文档库复制到另一个网站集,请使用:如何使用 PowerShell 将文档库复制到 SharePoint Online 中的另一个网站?

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

取消回复欢迎 发表评论:

关灯