Copy all files and folders from one user in Onedrive to another Onedrive user in same tenant. #4048
Unanswered
Barrycuda72
asked this question in
Q&A
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
I have been trying to get this powershell script to work but I am going in circles. It will connect fine it will show the files it needs to copy but when it goes to create the folders or files on the destination it either puts them in the root or nests them inside of another folder.
Import-Module PnP.PowerShell
$sourceUserEmail = Read-Host "Enter source user's email"
$destinationUserEmail = Read-Host "Enter destination user's email"
function Get-OneDriveUrl {
param (
[string]$userEmail
)
$userEmailEscaped = $userEmail -replace '@', ''
$userEmailEscaped = $userEmailEscaped -replace '.', ''
return "https://yourtenant-my.sharepoint.com/personal/$userEmailEscaped"
}
function Ensure-DestinationFolder {
param (
[string]$folderName,
[string]$destinationBaseUrl
)
Write-Host "Checking if folder '$folderName' exists in destination at $destinationBaseUrl..."
try {
$destinationFolder = Get-PnPListItem -List "Documents" -Query "$folderName"
if (-not $destinationFolder) {
Write-Host "Creating folder '$folderName' in destination at $destinationBaseUrl..."
$web = Get-PnPWeb
$serverRelativeUrl = $web.ServerRelativeUrl
$folderPath = "$serverRelativeUrl/$destinationBaseUrl".TrimStart("/")
Add-PnPFolder -Name $folderName -Folder $folderPath -ErrorAction Stop
Write-Host "Folder '$folderName' created."
} else {
Write-Host "Folder '$folderName' already exists in destination."
}
} catch {
Write-Host "Failed to ensure folder '$folderName' exists in destination: $"
}
}
function Copy-ItemsRecursively {
param (
[Object[]]$items,
[string]$sourceBaseUrl,
[string]$destinationBaseUrl,
[string]$sourceUserEmail
)
$sourceUserFolderName = "Files $sourceUserEmail"
Ensure-DestinationFolder -folderName $sourceUserFolderName -destinationBaseUrl $destinationBaseUrl
$destinationUserFolderPath = "$destinationBaseUrl/$sourceUserFolderName"
foreach ($item in $items) {
$itemUrl = $item.FieldValues.FileRef
Write-Host "Processing item: $itemUrll
$relativeItemUrl = $itemUrl -replace "^.*?/Documents", ""
Write-Host "Relative item URL: $relativeItemUrl"
$destinationUrl = "$destinationUserFolderPath$relativeItemUrl"
Write-Host "Destination URL: $destinationUrl"
if ($item.FileSystemObjectType -eq "Folder") {
# Ensure the destination folder exists
$folderName = $item.FieldValues.FileLeafRef
Ensure-DestinationFolder -folderName $folderName -destinationBaseUrl $destinationUrl
}
try {
Copy-PnPFile -SourceUrl $itemUrl -TargetUrl $destinationUrl -OverwriteIfAlreadyExists -ErrorAction Stop
Write-Host "Successfully copied file/folder to $destinationUrl"
} catch {
Write-Host "Failed to copy file/folder: $"
}
if ($item.FileSystemObjectType -eq "Folder") {
$subItems = Get-PnPListItem -List "Documents" -Query "$itemUrl"
Copy-ItemsRecursively -items $subItems -sourceBaseUrl $sourceBaseUrl -destinationBaseUrl $destinationUserFolderPath -sourceUserEmail $sourceUserEmail
}
}
}
Write-Host "Connecting to the source user's OneDrive..."
$sourceOneDriveUrl = Get-OneDriveUrl -userEmail $sourceUserEmail
Connect-PnPOnline -Url $sourceOneDriveUrl -Interactive
Write-Host "Connected to the source user's OneDrive."
Write-Host "Retrieving items from the source user's OneDrive..."
$sourceItems = Get-PnPListItem -List "Documents"
if (-not $sourceItems) {
Write-Host "No items found in the source user's OneDrive."
Disconnect-PnPOnline
return
}
Write-Host "$($sourceItems.Count) items retrieved from the source user's OneDrive."
Write-Host "Connecting to the destination user's OneDrive..."
$destinationOneDriveUrl = Get-OneDriveUrl -userEmail $destinationUserEmail
Connect-PnPOnline -Url $destinationOneDriveUrl -Interactive
Write-Host "Connected to the destination user's OneDrive."
Write-Host "Starting the copy process..."
$sourceFolderRelativeUrl = "$sourceOneDriveUrl/Documents" # Full source URL
$destinationFolderRelativeUrl = "$destinationOneDriveUrl/Documents" # Full destination URL
Copy-ItemsRecursively -items $sourceItems -sourceBaseUrl $sourceFolderRelativeUrl -destinationBaseUrl $destinationFolderRelativeUrl -sourceUserEmail $sourceUserEmail
Write-Host "Copy process completed."
Write-Host "Disconnecting from the destination user's OneDrive..."
Disconnect-PnPOnline
Write-Host "Disconnected from the destination user's OneDrive."
Beta Was this translation helpful? Give feedback.
All reactions