Using SharePoint Online...
I want copy/move documents from a folder to document library of another site.
want to automate this, as there are 100+ folders..
SharePoint Stack Exchange is a question and answer site for SharePoint enthusiasts. It only takes a minute to sign up.
Sign up to join this communityUsing SharePoint Online...
I want copy/move documents from a folder to document library of another site.
want to automate this, as there are 100+ folders..
If it is a requirement that versioning and/or metadata such as last modified by is retained, then you might have to look at one of the 3rd party tools, such as ShareGate or Metalogix
We can use PowerShell to achieve it.
Add-Type -Path "C:\Microsoft.SharePoint.Client.dll"
Add-Type -Path "C:\Microsoft.SharePoint.Client.Runtime.dll"
$username = "name@domain.com"
$password = "<password here>”
$srcUrl = "<enter the source Url>" ## use the full URL of the site
$destUrl = "<enter the target Url>" ## use the full URL of the site
$srcLibrary = "<Lib Name>"
$destLibrary = "<Target Lib>"
$destinationFolder = "/sites/<SITENAME>/Shared Documents/<folder inside doc lib>/" ## Make sure the folder name ends with /
$securePassword = ConvertTo-SecureString $password -AsPlainText -Force
$credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($username, $securePassword)
function CreateFolders
{
param (
[Parameter(Mandatory=$true)] $srcfolder,
[Parameter(Mandatory=$true)] [string] $destFolderPath
)
Write-Host "Source Folder:" + $srcfolder.Name + " dest folder:" + $destFolderPath -ForegroundColor Yellow
$SPOFolder = $destWeb.GetFolderByServerRelativeUrl($destFolderPath)
$FolderName = $srcfolder.Name
$NewFolder = $SPOFolder.Folders.Add($FolderName)
$destWeb.Context.Load($NewFolder)
$destWeb.Context.ExecuteQuery()
Write-Host "Folder Created - " + $FolderName -ForegroundColor Yellow
## get source folder details
$SrcFolderListItem = $srcfolder.ListItemAllFields
$srcContext.Load($SrcFolderListItem)
$srcContext.ExecuteQuery()
####
$SPOFolderItem = $NewFolder.ListItemAllFields;
$replacedUser =$destWeb.EnsureUser($SrcFolderListItem["Editor"].Email)
$SPOFolderItem["Editor"] = $replacedUser
$replacedUser =$destWeb.EnsureUser($SrcFolderListItem["Author"].Email)
$SPOFolderItem["Author"] = $replacedUser
$SPOFolderItem["Created"] = $SrcFolderListItem["Created"]
$SPOFolderItem["Modified"] = $SrcFolderListItem["Modified"]
$SPOFolderItem.Update()
$destContext.Load($NewFolder)
$destContext.ExecuteQuery()
$fileCol = $srcfolder.Files
$srcContext.Load($fileCol)
$srcContext.ExecuteQuery()
### Load the file to hash table to check with Target library.
$hashFiles = @{}
$DestfileCol = $NewFolder.Files
$destContext.Load($DestfileCol)
$destContext.ExecuteQuery()
foreach ($destFile in $DestfileCol){
$hashFiles.add($destFile.Name,$destFile.Name)
}
foreach ($f in $fileCol)
{
if($hashFiles.ContainsKey($f.Name) -ne "true")
{
$srcContext.Load($f)
$srcContext.ExecuteQuery()
$id = $srcfolder.Name
$nLocation =$NewFolder.ServerRelativeUrl.TrimEnd("/") + "/" + $f.Name
Write-Host $nLocation
try
{
$fileInfo = [Microsoft.SharePoint.Client.File]::OpenBinaryDirect($srcContext, $f.ServerRelativeUrl)
[Microsoft.SharePoint.Client.File]::SaveBinaryDirect($destContext, $nLocation, $fileInfo.Stream,$true)
$ListItem = $f.ListItemAllFields
$srcContext.Load($ListItem)
$srcContext.ExecuteQuery()
$fileCreated = $destWeb.GetFileByServerRelativeUrl($nLocation)
$destContext.Load($fileCreated)
$destContext.ExecuteQuery()
$DestListItem = $fileCreated.ListItemAllFields;
$replacedUser =$destWeb.EnsureUser($ListItem["Editor"].Email)
$DestListItem["Editor"] = $replacedUser
$replacedUser =$destWeb.EnsureUser($ListItem["Author"].Email)
$DestListItem["Author"] = $replacedUser
$DestListItem["Created"] = $ListItem["Created"];
$DestListItem["Modified"] = $ListItem["Modified"];
$DestListItem.Update()
$destContext.Load($fileCreated)
$destContext.ExecuteQuery()
}
catch
{
Write-Host $_ -ForegroundColor Red
}
}
}
$fL1FolderColl = $srcfolder.Folders
$srcContext.Load($fL1FolderColl);
$srcContext.ExecuteQuery();
foreach ($myFolder in $fL1FolderColl)
{
$srcContext.Load($myFolder)
$srcContext.ExecuteQuery()
CreateFolders $myFolder $NewFolder.ServerRelativeUrl
}
}
#### The main script starts here ######
$srcContext = New-Object Microsoft.SharePoint.Client.ClientContext($srcUrl)
$srcContext.Credentials = $credentials
$destContext = New-Object Microsoft.SharePoint.Client.ClientContext($destUrl)
$destContext.Credentials = $credentials
$srcWeb = $srcContext.Web
$srcList = $srcWeb.Lists.GetByTitle($srcLibrary)
$query = New-Object Microsoft.SharePoint.Client.CamlQuery
$listItems = $srcList.GetItems($query)
$srcContext.Load($srcList)
$srcContext.Load($listItems)
$srcContext.ExecuteQuery()
$destWeb = $destContext.Web
$destList = $destWeb.Lists.GetByTitle($destLibrary)
$destContext.Load($destWeb)
$destContext.Load($destList)
$destContext.ExecuteQuery()
########### this is to copy only certain folders
#$folder = $srcWeb.GetFolderByServerRelativeUrl($srcFolder)
#$srcContext.Load($folder)
#$srcContext.ExecuteQuery()
#Write-Host $destinationFolder
#CreateFolders $folder $destinationFolder
##############
foreach($item in $listItems)
{
if($item.FileSystemObjectType -eq "File")
{
#$srcContext.Load($item)
#$srcContext.ExecuteQuery()
$srcF = $item.File
$srcContext.Load($srcF)
$srcContext.ExecuteQuery()
$rootLocation = $destinationFolder + $srcF.Name
Write-Host $rootLocation
$fileContent = [Microsoft.SharePoint.Client.File]::OpenBinaryDirect($srcContext, $srcF.ServerRelativeUrl)
[Microsoft.SharePoint.Client.File]::SaveBinaryDirect($destContext, $rootLocation, $fileContent.Stream,$true)
$fItem = $srcF.ListItemAllFields
$srcContext.Load($fItem)
$srcContext.ExecuteQuery()
$fCreated = $destWeb.GetFileByServerRelativeUrl($rootLocation)
$destContext.Load($fCreated)
$destContext.ExecuteQuery()
$DListItem = $fCreated.ListItemAllFields;
$replacedUser =$destWeb.EnsureUser($fItem["Editor"].Email)
$DListItem["Editor"] = $replacedUser
$replacedUser =$destWeb.EnsureUser($fItem["Author"].Email)
$DListItem["Author"] = $replacedUser
$DListItem["Created"] = $fItem["Created"];
$DListItem["Modified"] = $fItem["Modified"];
$DListItem.Update()
$destContext.Load($fCreated)
$destContext.ExecuteQuery()
}
elseif ($item.FileSystemObjectType -eq "Folder")
{
$srcContext.Load($item)
$srcContext.ExecuteQuery()
$folder = $srcWeb.GetFolderByServerRelativeUrl($item.FieldValues["FileRef"].ToString())
$srcContext.Load($folder)
$srcContext.ExecuteQuery()
##################
Write-Host $destinationFolder
CreateFolders $folder $destinationFolder
}
}
Write-Host "Script End"