Forum Discussion

Christophe DAVID's avatar
Christophe DAVID
Copper Contributor
Feb 08, 2017
Solved

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...
  • 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 

Resources