Di chuyển Thư viện Tài liệu SharePoint 2010 sang SharePoint Online bằng PowerShell
Yêu cầu: Di chuyển Thư viện Tài liệu từ SharePoint 2010 sang SharePoint Online.
Làm cách nào để di chuyển thư viện tài liệu SharePoint 2010 sang SharePoint Online?
Có một số phương pháp có thể được sử dụng để di chuyển thư viện tài liệu từ SharePoint 2010 sang SharePoint Online, bao gồm Công cụ di chuyển SharePoint (SPMT), công cụ di chuyển của bên thứ 3 như ShareGate, v.v. Đây là một phương pháp sử dụng PowerShell! Ý tưởng là xuất tất cả thư viện tài liệu từ SharePoint On-Premise sang ổ đĩa cục bộ, xuất siêu dữ liệu của từng tài liệu sang tệp CSV, rồi nhập chúng vào SharePoint Online.
Trước khi chúng tôi bắt đầu, xin lưu ý rằng đây không phải là tập lệnh di chuyển chính thức có thể di chuyển siêu dữ liệu, bảo mật, lịch sử phiên bản, v.v. Tập lệnh này chỉ sao chép thư viện tài liệu với các thư mục tệp và siêu dữ liệu “Được tạo bởi”, “Được tạo trên”, “Được sửa đổi bởi” và “Được sửa đổi trên” thành SharePoint Online. Bạn cần các công cụ di chuyển của bên thứ 3 nếu muốn di chuyển tất cả những phần còn thiếu!
Bước 1: Xuất thư viện tài liệu SharePoint tại chỗ
Bước đầu tiên, hãy đăng nhập vào bất kỳ máy chủ ngoại vi web SharePoint On-Premise nào của bạn và chạy tập lệnh PowerShell bên dưới để xuất một thư viện tài liệu hoặc tất cả thư viện tài liệu từ SharePoint 2010 sang ổ đĩa cục bộ của máy chủ. Thay đổi các biến Thời gian chạy ở cuối tập lệnh theo môi trường của bạn. Xin lưu ý, tập lệnh này xuất các thư viện của một trang nhất định (không phải tuyển tập trang), bạn có thể mở rộng nó nếu cần!
#khu vực Biến thời gian chạy
$Global:SourceSiteURL=“https://SP2010.crescent.com/sites/marketing”
$Global:LocalFolderPath =“C:\Migration\Tải xuống”
#endzone Biến thời gian chạy
PowerShell để xuất tất cả thư viện tài liệu từ SharePoint 2010
Tập lệnh này tải xuống Thư viện tài liệu tại chỗ từ SharePoint 2010 xuống đĩa cục bộ.
Add-PSSnapin Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue
#Function to Extract Metadata of a File to CSV File
Function Extract-SPFileMetadata([Microsoft.SharePoint.SPFile]$SPFile)
{
Try {
#Calculate URLs
$FileLibraryRelativeURL = $SPFile.ServerRelativeURL.Replace($SPFile.DocumentLibrary.RootFolder.ServerRelativeUrl,[string]::Empty)
#Calculate Absolute URL
If($global:Web.ServerRelativeUrl -eq "/")
{
$FileAbsoluteURL= $("{0}{1}" -f $global:Web.Url, $SPFile.ServerRelativeUrl)
}
else
{
$FileAbsoluteURL= $("{0}{1}" -f $global:Web.Url.Replace($global:Web.ServerRelativeUrl,[string]::Empty), $SPFile.ServerRelativeUrl)
}
#Extract the Metadata of the file
$Metadata = New-Object PSObject
$Metadata | Add-Member -MemberType NoteProperty -name "FileName" -value $SPFile.Name
$Metadata | Add-Member -MemberType NoteProperty -name "ParentLibrary" -value $SPFile.DocumentLibrary.Title
$Metadata | Add-Member -MemberType NoteProperty -name "FileAbsoluteURL" -value $FileAbsoluteURL
$Metadata | Add-Member -MemberType NoteProperty -name "FileLibraryRelativeURL" -value $FileLibraryRelativeURL
$Metadata | Add-Member -MemberType NoteProperty -Name "CreatedBy" -value $SPFile.Author.Email
$Metadata | Add-Member -MemberType NoteProperty -name "ModifiedBy" -value $SPFile.ModifiedBy.Email
$Metadata | Add-Member -MemberType NoteProperty -name "CreatedOn" -value $SPFile.TimeCreated
$Metadata | Add-Member -MemberType NoteProperty -name "ModifiedOn" -value $SPFile.TimeLastModified
#Send the Metadata to CSV File
If (-not(Test-Path $global:MetadataFile))
{
$Metadata | Export-Csv $global:MetadataFile -NoTypeInformation
}
else
{
#Append data to Existing CSV File - Remove Duplicates
$CSVData = [Object[]] (Import-Csv $global:MetadataFile)
$CSVData + $Metadata | Sort FileAbsoluteURL -unique | Export-Csv $global:MetadataFile -NoTypeInformation
}
Write-host -f Green "`tMetadata Extracted from the File:"$SPFile.ServerRelativeURL
}
Catch {
write-host -f Red "Error Getting Metadatas:" $_.Exception.Message
}
}
#Function to Download All Files from a SharePoint Folder
Function Download-SPFolder($SPFolderURL, $LocalFolderPath)
{
Try {
#Get the Source SharePoint Folder
$SPFolder = $global:web.GetFolder($SPFolderURL)
$LocalFolderPath = Join-Path $LocalFolderPath $SPFolder.Name
#Ensure the destination local folder exists!
If (!(Test-Path -path $LocalFolderPath))
{
#If it doesn't exist, Create
$LocalFolder = New-Item $LocalFolderPath -type directory
}
#Loop through each file in the folder and download it to Destination
ForEach ($File in $SPFolder.Files)
{
#Download the file
$Data = $File.OpenBinary()
$FilePath= Join-Path $LocalFolderPath $File.Name
[System.IO.File]::WriteAllBytes($FilePath, $data)
Write-host -f Green "`tDownloaded the File:"$File.ServerRelativeURL
#Get the Metadata of the File
Extract-SPFileMetadata -SPFile $File
}
#Process the Sub-Folders & Recursively call the function
ForEach ($SubFolder in $SPFolder.SubFolders)
{
If($SubFolder.Name -ne "Forms") #Leave "Forms" Folder
{
#Call the function Recursively
Download-SPFolder $SubFolder $LocalFolderPath
}
}
}
Catch {
Write-host -f Red "Error Downloading Document Library:" $_.Exception.Message
}
}
#Function to export a Single Library
Function Export-SPLibrary()
{
param
(
[Parameter(Mandatory=$true)] [string] $LibraryName
)
Try {
#Get the Source Web
$global:Web = Get-SPWeb $global:SourceSiteURL
$global:MetadataFile = "$global:LocalFolderPath\Metadata.csv"
#Get the library
$Library = $Global:Web.Lists.TryGetList($LibraryName)
#Get All Files from the Library and export
If($Library -ne $Null)
{
Write-host -f magenta "Downloading Document Library:" $Library.Title
#Call the function to download the document library
Download-SPFolder -SPFolderURL $Library.RootFolder.Url -LocalFolderPath $global:LocalFolderPath
}
Else
{
Write-host -f Yellow "Could not Find Document Library:" $LibraryName
}
Write-host "*** Completed downloading Library '$LibraryName' ***"
}
Catch {
Write-host -f Red "Error Downloading Document Library:" $_.Exception.Message
}
}
#Function to export all libraries in a SharePoint Site
Function Export-SPAllLibraries()
{
Try {
#Get the Source Web
$global:Web = Get-SPWeb $global:SourceSiteURL
#Delete any existing files and folders in the download location
If (Test-Path $global:LocalFolderPath) {Get-ChildItem -Path $global:LocalFolderPath -Recurse| ForEach-object {Remove-item -Recurse -path $_.FullName }}
#Arry to Skip System Libraries
$SystemLibraries =@("Pages", "Converted Forms", "Master Page Gallery", "Customized Reports",
"Form Templates", "Images", "List Template Gallery", "Theme Gallery", "Reporting Templates",
"Site Collection Documents", "Site Collection Images", "Site Pages", "Solution Gallery",
"Style Library", "Web Part Gallery","Site Assets", "wfpub")
#Get all document libraries - Exclude Hidden and System Libraries
$LibraryCollection = $Web.lists | Where-Object { ($_.BaseType -eq "DocumentLibrary") -and ($_.hidden -eq $false) -and ($SystemLibraries -notcontains $_.Title)}
#Iterate through each list and export
ForEach($Library in $LibraryCollection)
{
Write-host -f magenta "Downloading Document Library:" $Library.Title
#Call the function to download the document library
Download-SPFolder -SPFolderURL $Library.RootFolder.Url -LocalFolderPath $global:LocalFolderPath
}
Write-host "*** Downloaded All Libraries From the Given Site! ***"
}
Catch {
Write-host -f Red "Error Downloading All Document Libraries:" $_.Exception.Message
}
}
#region Runtime-Variables
$Global:SourceSiteURL = "https://SP2010.crescent.com/sites/marketing"
$Global:LocalFolderPath ="C:\Migration\Downloads"
#endregion Runtime-Variables
#Call the Function to export all document libraries from a site
Export-SPLibraries
#To Export a specific library, use:
#Export-SPLibrary -LibraryName "Shared Documents"
Chạy tập lệnh. Sau khi được thực thi, tập lệnh này sẽ tải tất cả thư viện tài liệu xuống LocalFolderPath đã cho. Với tập lệnh này, bạn có thể tải xuống tất cả thư viện tài liệu hoặc thư viện tài liệu cụ thể từ trang SharePoint tại chỗ.
Ngoài ra, tập lệnh còn trích xuất siêu dữ liệu của tài liệu sang tệp CSV có tên “Metadata.csv” trong $LocalFolderPath nhất định.
Cập nhật siêu dữ liệu nếu cần
Tệp siêu dữ liệu.csv có siêu dữ liệu của Tệp cho các trường như “Được tạo bởi”, “Được sửa đổi bởi”, v.v. Đảm bảo ID email được liệt kê trong tệp CSV hợp lệ trong môi trường SharePoint Online. Nếu cần, Bạn có thể cập nhật tệp CSV này và lưu nó.
Bước 2. Nhập thư viện tài liệu vào SharePoint Online
Bây giờ, hãy sao chép thư mục đã tải xuống (Ở đây, đó là “C:\Migration\Downloads”) vào máy tính xách tay của bạn hoặc bất kỳ máy nào đã cài đặt SharePoint Online Client SDK và có thể truy cập được trang SharePoint Online mục tiêu. Sao chép tập lệnh bên dưới vào PowerShell ISE và thay đổi các biến thời gian chạy được đánh dấu theo môi trường của bạn. Đảm bảo trang web được cung cấp tại TargetSiteURL đã được tạo và sau đó thực thi tập lệnh!
Tải Thư viện Tài liệu SharePoint 2010 lên SharePoint Online và Đặt Siêu dữ liệu
Hãy tải nội dung tại chỗ lên SharePoint Online bằng lệnh ghép ngắn PowerShell:
#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 Ensure SharePoint Online User
Function Ensure-SPOUser([string]$UserID)
{
Try {
$User = $Global:Web.EnsureUser($UserID)
$Global:Ctx.Load($User)
$Global:Ctx.ExecuteQuery()
Return $User
}
Catch {
write-host -f Red "`t`t`tError Resolving User $UserID :" $_.Exception.Message
Return $Null
}
}
#Function to Set the Metadata of a Document
Function SetSPO-DocumentMetadata()
{
param
(
[Parameter(Mandatory=$true)] [Microsoft.SharePoint.Client.File] $File,
[Parameter(Mandatory=$true)] [Microsoft.SharePoint.Client.List] $TargetLibrary
)
Try {
#Calculate the Library Relative URL of the File
$Global:Ctx.Load($TargetLibrary.RootFolder)
$Global:Ctx.ExecuteQuery()
$FileLibraryRelativeURL = $File.ServerRelativeUrl.Replace($TargetLibrary.RootFolder.ServerRelativeUrl,[string]::Empty)
#Import Metadata CSV File
$MetadataCSVPath = "$Global:SourcePath\Metadata.csv"
$MetadataFile = Import-Csv -LiteralPath $MetadataCSVPath
#Get the Metadata of the File
$Metadata = $MetadataFile | Where-Object {($_.ParentLibrary -eq ($TargetLibrary.Title)) -and $_.FileLibraryRelativeURL -eq $FileLibraryRelativeURL}
If($Metadata)
{
Write-host -f Yellow "`t`tUpdating Metadata for File '$($File.ServerRelativeURL)'"
#Get 'Created By' and 'Modified By' Users
$Author = Ensure-SPOUser -UserID $Metadata.CreatedBy
$Editor= Ensure-SPOUser -UserID $Metadata.ModifiedBy
#Set Metadata of the File
$ListItem = $File.ListItemAllFields
If($Author -ne $Null)
{
$Listitem["Author"] = $Author
}
If($Editor -ne $Null)
{
$ListItem["Editor"] = $Editor
}
$ListItem["Created"] = $Metadata.CreatedOn
$ListItem["Modified"] = $Metadata.ModifiedOn
$ListItem.Update()
$Global:Ctx.ExecuteQuery()
Write-host -f Green "`t`t`tMetadata for '$($File.ServerRelativeURL)' has been Updated Successfully!"
}
}
Catch {
write-host -f Red "`t`t`tError updating Metadata of the Document:" $_.Exception.Message
}
}
#Function to migrate all Files and Folders from Local Path to SharePoint Online
Function MigrateSPO-LocalFolder()
{
param
(
[Parameter(Mandatory=$true)] [string] $SourceFolderPath,
[Parameter(Mandatory=$true)] [Microsoft.SharePoint.Client.List] $TargetLibrary
)
Try {
#Get the Target Folder to Upload
$TargetFolder = $TargetLibrary.RootFolder
$Global:Ctx.Load($TargetFolder)
$Global:Ctx.ExecuteQuery()
#Get All Files and Folders from the Source
Get-ChildItem $SourceFolderPath -Recurse | ForEach-Object {
If ($_.PSIsContainer -eq $True) #If its a Folder!
{
$TargetFolderRelativeURL = $TargetFolder.ServerRelativeURL+$_.FullName.Replace($SourceFolderPath,[string]::Empty).Replace("\","/")
Write-host -f Yellow "`t`tEnsuring Folder '$TargetFolderRelativeURL'"
#Check If Folder Exists
Try {
$Folder = $Global:Web.GetFolderByServerRelativeUrl($TargetFolderRelativeURL)
$Global:Ctx.Load($Folder)
$Global:Ctx.ExecuteQuery()
Write-host -f Magenta "`t`t`tFolder Already Exists: $TargetFolderRelativeURL"
}
Catch {
#Create New Sub-Folder
$Folder= $Global:Web.Folders.Add($TargetFolderRelativeURL)
$Global:Ctx.ExecuteQuery()
Write-host -f Green "`t`t`tCreated Folder at "$TargetFolderRelativeURL
$Global:Ctx.ExecuteQuery()
}
}
Else #Its a File, Upload it!
{
#Calculate Source and Destination File Paths
$TargetFileURL = $TargetFolder.ServerRelativeURL + $_.DirectoryName.Replace($SourceFolderPath,[string]::Empty).Replace("\","/") +"/"+$_.Name
$SourceFilePath = $_.FullName
Write-host -f Yellow "`t`tUploading File '$_' to URL "$TargetFileURL
#Get the file from disk
$FileStream = ([System.IO.FileInfo] (Get-Item $SourceFilePath)).OpenRead()
#Upload the File to SharePoint Library's Folder
$FileCreationInfo = New-Object Microsoft.SharePoint.Client.FileCreationInformation
$FileCreationInfo.Overwrite = $True
$FileCreationInfo.ContentStream = $FileStream
$FileCreationInfo.URL = $TargetFileURL
$FileUploaded = $TargetFolder.Files.Add($FileCreationInfo)
$Global:Ctx.ExecuteQuery()
$FileStream.Close()
Write-host "`t`t`tFile '$TargetFileURL' Uploaded Successfully!" -ForegroundColor Green
#get the uploaded file
$File = $Global:Web.GetFileByServerRelativeUrl($TargetFileURL)
$Global:Ctx.Load($File)
$Global:Ctx.ExecuteQuery()
#Update Metadata of the File
SetSPO-DocumentMetadata -File $File -TargetLibrary $TargetLibrary
}
}
}
Catch {
write-host -f Red "`t`t`tError Uploading File:" $_.Exception.Message
}
}
#Function to Ensure a SharePoint Online document library
Function EnsureSPO-DocumentLibrary()
{
param
(
[Parameter(Mandatory=$true)] [string] $DocumentLibraryName
)
Try {
Write-host -f Yellow "`nEnsuring Document Library '$DocumentLibraryName'"
#Get All Existing Lists from the web
$Lists = $Global:Web.Lists
$Global:Ctx.Load($Lists)
$Global:Ctx.ExecuteQuery()
#Check if the Library name doesn't exist already
If(!($Lists.Title -contains $DocumentLibraryName))
{
#Create Document Library
$ListInfo = New-Object Microsoft.SharePoint.Client.ListCreationInformation
$ListInfo.Title = $DocumentLibraryName
$ListInfo.TemplateType = 101 #Document Library
$List = $Global:Web.Lists.Add($ListInfo)
$List.Update()
$Global:Ctx.ExecuteQuery()
write-host -f Green "`tNew Document Library '$DocumentLibraryName' has been created!"
Return $List
}
Else
{
#Get the Library
$List = $Global:Web.Lists.GetByTitle($DocumentLibraryName)
$Global:Ctx.Load($List)
$Global:Ctx.ExecuteQuery()
Return $List
Write-Host -f Magenta "`tA Document Library '$DocumentLibraryName' Already exist!"
}
}
Catch {
write-host -f Red "`tError Creating Document Library!" $_.Exception.Message
}
}
#Main Function
Function Import-SPOLibraries()
{
Try {
#Setup the context
$Global:Ctx = New-Object Microsoft.SharePoint.Client.ClientContext($Global:TargetSiteURL)
$Global:Ctx.Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Global:Cred.UserName,$Global:Cred.Password)
#Get the Web
$Global:Web = $Global:Ctx.Web
$Global:Ctx.Load($Global:Web)
$Global:Ctx.ExecuteQuery()
#Get Top Level Folders from the Source as "Document Libraries"
$SourceLibraries = Get-ChildItem -Directory -Path $Global:SourcePath
#Create Document Libraries
ForEach($SourceLibrary in $SourceLibraries)
{
#call the function to Ensure document library
$TargetLibrary = EnsureSPO-DocumentLibrary -DocumentLibraryName $SourceLibrary.Name
#Migrate Files and Folders from the Source to the Destination
MigrateSPO-LocalFolder -SourceFolderPath $SourceLibrary.FullName -TargetLibrary $TargetLibrary
}
Write-host -f Cyan "`n*** Import Completed! ***`n"
}
Catch {
write-host -f Red "Error:" $_.Exception.Message
}
}
#region Runtime-Variables
$Global:SourcePath = "C:\Migration\Downloads"
$Global:TargetSiteURL = "https://crescent.sharepoint.com/Sites/Marketing"
#endregion Runtime-Variables
#Get Credentials to connect
$Global:Cred = Get-Credential -Message "Enter the Admin Credentials:"
#Call the function to import document libraries and files to SharePoint Online
Import-SPOLibraries
Tập lệnh này được viết để sao chép từng trang thư viện tài liệu và có thể được mở rộng hơn nữa!

