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

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

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

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


要求:使用 PowerShell 将文档库复制到另一个 SharePoint Online 网站。

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

如何将文档库复制到 SharePoint Online 中的另一个网站?

您是否曾经需要将文档库从一个 SharePoint Online 网站复制到另一个网站?也许您需要将内容从旧站点移动到新站点,或者为开发工作创建一个“测试”环境。在本文中,我将向您展示如何使用 PowerShell 在两个站点之间复制文档库。让我们开始吧!

没有直接的方法可以在 SharePoint Online 中复制文档库。但是,您可以使用此解决方法:

  1. 将源文档库另存为模板 - 转至源库 >> 单击“设置”齿轮 >> 选择“库设置”>> 单击“另存为模板”。详细信息:如何在 SharePoint Online 中将列表另存为模板?
  2. 下载列表模板并将其上传到目标网站
  3. 从列表模板创建新文档库 - 登录到目标 SharePoint Online 站点 >> 单击“设置”齿轮图标,然后单击“添加应用程序”。您可以使用页面底部的分页来查找自定义列表模板,或使用“查找应用程序”搜索框并选择您的列表模板。详细信息:SharePoint Online:使用 PowerShell 从自定义模板创建列表
  4. 将源文档库中的所有项目复制到新文档库 - 从现有列表模板创建文档库的新实例后,您可以将源文档库中的所有文件和文件夹复制到新文档库中。目标库,方法是选择源库中的所有项目,然后选择工具栏中的“复制到”按钮,然后指定在步骤 3 中创建的文档库。

听起来像是很多手工工作?那么,如果您需要将文档库从一个 SharePoint Online 站点复制到另一个站点,PowerShell 就是您的最佳选择。让我向您展示如何使用 PowerShell 将文档库(包括其所有内容)从一个站点复制到另一个站点。

在运行此脚本之前,必须在源站点和目标站点中启用自定义脚本!如何在 SharePoint Online 中启用自定义脚本?

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

要复制文档库及其文件和文件夹,请使用此 PowerShell 脚本。您可以将文档库复制到相同或不同的站点。


#Function to Copy library to Another site
Function Copy-PnPLibrary
{
    param (
    [parameter(Mandatory=$true, ValueFromPipeline=$true)][string]$SourceSiteURL,
    [parameter(Mandatory=$true, ValueFromPipeline=$true)][string]$DestinationSiteURL,
    [parameter(Mandatory=$true, ValueFromPipeline=$true)][string]$SourceLibraryName,
    [parameter(Mandatory=$true, ValueFromPipeline=$true)][string]$DestinationLibraryName
    )
  
    Try {
    #Connect to the Source Site
    $SourceConn = Connect-PnPOnline -URL $SourceSiteURL -Interactive -ReturnConnection
    $SourceCtx = $SourceConn.Context
  
    #Get the Source library
    $SourceLibrary =  Get-PnPList -Identity $SourceLibraryName -Includes RootFolder -Connection $SourceConn
  
    #Get the List Template
    $SourceRootWeb = $SourceCtx.Site.RootWeb
    $SourceListTemplates = $SourceCtx.Site.GetCustomListTemplates($SourceRootWeb)
    $SourceCtx.Load($SourceRootWeb)
    $SourceCtx.Load($SourceListTemplates)
    $SourceCtx.ExecuteQuery()
    $SourceListTemplate = $SourceListTemplates | Where {$_.Name -eq $SourceLibrary.id.Guid}
    $SourceListTemplateURL = $SourceRootWeb.ServerRelativeUrl+"/_catalogs/lt/"+$SourceLibrary.id.Guid+".stp"
  
    #Remove the List template if exists    
    If($SourceListTemplate)
    {
        #Remove-PnPFile -ServerRelativeUrl $SourceListTemplateURL -Recycle -Force -Connection $SourceConn
        $SourceListTemplate = Get-PnPFile -Url $SourceListTemplateURL -Connection $SourceConn
        $SourceListTemplate.DeleteObject()
        $SourceCtx.ExecuteQuery()
    }
    Write-host "Creating List Template from Source Library..." -f Yellow -NoNewline
    $SourceLibrary.SaveAsTemplate($SourceLibrary.id.Guid, $SourceLibrary.id.Guid, [string]::Empty, $False)
    $SourceCtx.ExecuteQuery()
    Write-host "Done!" -f Green
  
    #Reload List Templates to Get Newly created List Template
    $SourceListTemplates = $SourceCtx.Site.GetCustomListTemplates($SourceRootWeb)
    $SourceCtx.Load($SourceListTemplates)
    $SourceCtx.ExecuteQuery()
    $SourceListTemplate = $SourceListTemplates | Where {$_.Name -eq $SourceLibrary.id.Guid}     
  
    #Connect to the Destination Site
    $DestinationConn = Connect-PnPOnline -URL $DestinationSiteURL -Interactive -ReturnConnection
    $DestinationCtx = $DestinationConn.Context
    $DestinationRootWeb = $DestinationCtx.Site.RootWeb
    $DestinationListTemplates = $DestinationCtx.Site.GetCustomListTemplates($DestinationRootWeb)
    $DestinationCtx.Load($DestinationRootWeb)
    $DestinationCtx.Load($DestinationListTemplates)
    $DestinationCtx.ExecuteQuery()    
    $DestinationListTemplate = $DestinationListTemplates | Where {$_.Name -eq $SourceLibrary.id.Guid}
    $DestinationListTemplateURL = $DestinationRootWeb.ServerRelativeUrl+"/_catalogs/lt/"+$SourceLibrary.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()        
    }
  
    #Copy List Template from source to the destination site
    Write-host "Copying List Template from Source to Destination Site..." -f Yellow -NoNewline
    Copy-PnPFile -SourceUrl $SourceListTemplateURL -TargetUrl ($DestinationRootWeb.ServerRelativeUrl+"/_catalogs/lt") -Force -OverwriteIfAlreadyExists -Connection $SourceConn
    Write-host "Done!" -f Green
  
    #Reload List Templates to Get Newly created List Template
    $DestinationListTemplates = $DestinationCtx.Site.GetCustomListTemplates($DestinationRootWeb)
    $DestinationCtx.Load($DestinationListTemplates)
    $DestinationCtx.ExecuteQuery()
    $DestinationListTemplate = $DestinationListTemplates | Where {$_.Name -eq $SourceLibrary.id.Guid}
  
    #Create the destination library from the list template
    Write-host "Creating New Library in the Destination Site..." -f Yellow -NoNewline
    If(!(Get-PnPList -Identity $DestinationLibraryName -Connection $DestinationConn))
    {
        #Create the destination library
        $ListCreation = New-Object Microsoft.SharePoint.Client.ListCreationInformation
        $ListCreation.Title = $DestinationLibraryName
        $ListCreation.ListTemplate = $DestinationListTemplate
        $DestinationList = $DestinationCtx.Web.Lists.Add($ListCreation)
        $DestinationCtx.ExecuteQuery()
        Write-host "Library '$DestinationLibraryName' created successfully!" -f Green
    }
    Else
    {
        Write-host "Library '$DestinationLibraryName' already exists!" -f Yellow
    }
 
    Write-host "Copying Files and Folders from the Source to Destination Site..." -f Yellow    
    $DestinationLibrary = Get-PnPList $DestinationLibraryName -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 $SourceLibraryName -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 -Connection $SourceConn
            Write-host "`tCopied $($_.FileSystemObjectType) '$($_.FieldValues.FileRef)' Successfully!" -f Green     
        }
    }
  
    #Cleanup List Templates in source and destination sites
    $SourceListTemplate = Get-PnPFile -Url $SourceListTemplateURL -Connection $SourceConn
    $DestinationListTemplate = Get-PnPFile -Url $DestinationListTemplateURL -Connection $DestinationConn
    $SourceListTemplate.DeleteObject()
    $DestinationListTemplate.DeleteObject()
    $SourceCtx.ExecuteQuery()
    $DestinationCtx.ExecuteQuery()
    #Remove-PnPFile -ServerRelativeUrl $SourceListTemplateURL -Recycle -Force -Connection $SourceConn
    #Remove-PnPFile -ServerRelativeUrl $DestinationListTemplateURL -Recycle -Force -Connection $DestinationConn
    }
    Catch {
        write-host -f Red "Error:" $_.Exception.Message
    }
}
  
#Parameters
$SourceSiteURL = "https://crescent.sharepoint.com/sites/Retail"
$DestinationSiteURL = "https://crescent.sharepoint.com/sites/warehouse"
$SourceLibraryName = "Invoices"
$DestinationLibraryName = "Invoices V2"
  
#Call the function to copy document library to another site
Copy-PnPLibrary -SourceSiteURL $SourceSiteURL -DestinationSiteURL $DestinationSiteURL -SourceLibraryName $SourceLibraryName -DestinationLibraryName $DestinationLibraryName

您还可以使用此 PowerShell 方法将文档库移动到另一个站点!只需添加一个删除源文档库的步骤(我们称之为“移动”!)。确保您拥有对源网站和目标网站的网站集管理员访问权限,并且在运行此脚本之前启用自定义脚本!

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

取消回复欢迎 发表评论:

关灯