Forum Discussion
Christophe DAVID
Feb 08, 2017Copper Contributor
Copy of a large number of folders from one sharepoint online site to another
Hi For a Customer of ours, I try to use Powershell to automate the copy of a large number of folders from one sharepoint online site to another site (same tenant). Here are some details: - 2500 fo...
- Feb 08, 2017
You can use the below script for copying. Attached the sample csv to be used. This script does not preserve metadata.
function Copy-sharepoint { Param( [Parameter(Mandatory=$True)] [String]$sharepointUrl, [Parameter(Mandatory=$True)] [String]$UserName, [Parameter(Mandatory=$True)] [String]$Password, [Parameter(Mandatory=$True)] [String]$Path, [Parameter(Mandatory=$True)] [System.Management.Automation.PSCredential]$cred ) #create secure password $sPassword = $Password | ConvertTo-SecureString -AsPlainText -Force $loadInfo1 = [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client") $loadInfo2 = [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client.Runtime") $csvs = Import-Csv $Path Foreach($csv in $csvs) { $Sourceurl = $csv.SourceUrl $souceFoldername= $csv.Foldername $targeturl = $csv.TargetUrl $TargetDocumentLib = $csv.targetlib Connect-PnPOnline -Url $Sourceurl -Credentials $cred $Files= Find-PnPFile -Folder $souceFoldername -Match * Disconnect-PnPOnline $Loginsource =$false $webClient = New-Object System.Net.WebClient $webClient.Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($UserName, $sPassword) $webClient.Headers.Add("X-FORMS_BASED_AUTH_ACCEPTED", "f") $webclient.Proxy = $null Write-Host "Copying $($Files.count) files to $($targeturl)" foreach($file in $Files) { $pageUrl = $sharepointUrl+$file.ServerRelativeUrl $UniqueFileName = $file.Name $ByteArray=$webClient.DownloadData($pageUrl) $tfolderWithname= ($pageUrl -split $Sourceurl)[1] $tfolderwiths =($tfolderWithname -split $UniqueFileName)[0] $tfolderrmstr =$tfolderwiths.TrimStart("/") $tfolder =$tfolderrmstr.TrimEnd("/") $fstream = [System.IO.MemoryStream]($ByteArray) $tf=($tfolder -split "/") $test=$False If($tf.count -gt 1) { foreach($tf1 in $tf) { if($test -eq $true) { $tf2=$tf2+"/"+$tf1 } $test=$true } } Else { $tf2=$null } If($Loginsource -eq $false ) { Connect-PnPOnline -Url $targeturl -Credentials $cred $Loginsource =$true } $m=Get-PnPList -Identity $TargetDocumentLib $ctx=Get-PnPContext $mroot=$m.RootFolder $ctx.Load($mroot) $ctx.ExecuteQuery() $targetFolder=$mroot.Name+$tf2 $tf2=$null If($targetFolder -notlike "*Forms") { Add-PnPFile -FileName $UniqueFileName -Folder $targetFolder -Stream $fstream } } } } $cred=Get-Credential $Path = "C:\csv\copyfile.csv" $sharepointUrl = "https://tenantname.sharepoint.com" $UName=$cred.UserName.ToString() $Pass =$cred.GetNetworkCredential().Password Copy-sharepoint -UserName $UName -Password $Pass -cred $cred -sharepointUrl $sharepointUrl -Path $Path
Feb 08, 2017
You can use the below script for copying. Attached the sample csv to be used. This script does not preserve metadata.
function Copy-sharepoint
{
Param(
[Parameter(Mandatory=$True)]
[String]$sharepointUrl,
[Parameter(Mandatory=$True)]
[String]$UserName,
[Parameter(Mandatory=$True)]
[String]$Password,
[Parameter(Mandatory=$True)]
[String]$Path,
[Parameter(Mandatory=$True)]
[System.Management.Automation.PSCredential]$cred
)
#create secure password
$sPassword = $Password | ConvertTo-SecureString -AsPlainText -Force
$loadInfo1 = [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client")
$loadInfo2 = [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client.Runtime")
$csvs = Import-Csv $Path
Foreach($csv in $csvs)
{
$Sourceurl = $csv.SourceUrl
$souceFoldername= $csv.Foldername
$targeturl = $csv.TargetUrl
$TargetDocumentLib = $csv.targetlib
Connect-PnPOnline -Url $Sourceurl -Credentials $cred
$Files= Find-PnPFile -Folder $souceFoldername -Match *
Disconnect-PnPOnline
$Loginsource =$false
$webClient = New-Object System.Net.WebClient
$webClient.Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($UserName, $sPassword)
$webClient.Headers.Add("X-FORMS_BASED_AUTH_ACCEPTED", "f")
$webclient.Proxy = $null
Write-Host "Copying $($Files.count) files to $($targeturl)"
foreach($file in $Files)
{
$pageUrl = $sharepointUrl+$file.ServerRelativeUrl
$UniqueFileName = $file.Name
$ByteArray=$webClient.DownloadData($pageUrl)
$tfolderWithname= ($pageUrl -split $Sourceurl)[1]
$tfolderwiths =($tfolderWithname -split $UniqueFileName)[0]
$tfolderrmstr =$tfolderwiths.TrimStart("/")
$tfolder =$tfolderrmstr.TrimEnd("/")
$fstream = [System.IO.MemoryStream]($ByteArray)
$tf=($tfolder -split "/")
$test=$False
If($tf.count -gt 1)
{
foreach($tf1 in $tf)
{
if($test -eq $true)
{
$tf2=$tf2+"/"+$tf1
}
$test=$true
}
}
Else
{
$tf2=$null
}
If($Loginsource -eq $false )
{
Connect-PnPOnline -Url $targeturl -Credentials $cred
$Loginsource =$true
}
$m=Get-PnPList -Identity $TargetDocumentLib
$ctx=Get-PnPContext
$mroot=$m.RootFolder
$ctx.Load($mroot)
$ctx.ExecuteQuery()
$targetFolder=$mroot.Name+$tf2
$tf2=$null
If($targetFolder -notlike "*Forms")
{
Add-PnPFile -FileName $UniqueFileName -Folder $targetFolder -Stream $fstream
}
}
}
}
$cred=Get-Credential
$Path = "C:\csv\copyfile.csv"
$sharepointUrl = "https://tenantname.sharepoint.com"
$UName=$cred.UserName.ToString()
$Pass =$cred.GetNetworkCredential().Password
Copy-sharepoint -UserName $UName -Password $Pass -cred $cred -sharepointUrl $sharepointUrl -Path $Path Christophe DAVID
Feb 08, 2017Copper Contributor
Hi again.
I cant make it work. The script runs, i get no error, but the files are not copied.
I am testing as follow:
1 Site is named "testsource". it has a "123456" folder in it.
1 Site is named "testdestination".
It is a french tenant. Does it make a difference for the folder path ?
Any help would be greatly apreciated.
Chris
- Feb 09, 2017
In your csv, the format is incorrect, the headers are missing. Attached the csv sample with your example.