function Invoke-UserProfileTransfer {
    [CmdletBinding()]
    param($srcPath, $dstPath)
    <#
    .SYNOPSIS
        Backs up a user profile to a specified filepath.
    .DESCRIPTION
        Takes a input of a user profile filepath, will make a copy of the user profile
        and the Microsoft Roaming Folder and back it up to a specified filepath.
    #>

    #The folders that this back up file grabs
    $FoldersToCopy = @(
        'Desktop'
        'Downloads'
        'Favorites'
        'Documents'
        'Pictures'
        'Videos'
        'AppData\Local\Google\Chrome\User Data\Default\Bookmarks'
        'AppData\Roaming\Microsoft'
        # 'Sticky Notes'
    )

    #Creates a log file
    New-Item -Path $dstPath\backuplog.txt -Force | Write-Verbose
    $log = Join-Path -Path $dstPath -ChildPath backuplog.txt
    
    Write-Host "Copying profile to $dstPath"

    for ($i = 0; $i -lt $FoldersToCopy.Length; $i++) {
        $Folder = $FoldersToCopy[$i]
        
        Write-Progress -Activity "User Profile Transfer from $srcPath to $dstPath" -Status $Folder -PercentComplete (($i / $FoldersToCopy.Length)*100) -Id 0

        $Source = Join-Path -Path $srcPath -ChildPath $Folder
        $Destination = Join-Path -Path $dstPath -ChildPath $Folder
        Write-Host "Copying $Folder"

        if( $Folder -eq 'Sticky Notes'){
            $Source = Join-Path -Path $srcPath -ChildPath 'AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState'
            $Destination = Join-Path -Path "$dstPath" -ChildPath 'AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState'
            New-Item -Path $Destination -ItemType Directory | Write-Verbose
        }

        if($Folder -eq 'AppData\Local\Google\Chrome\User Data\Default\Bookmarks'){
            if( -not ( Test-Path -Path $Source )){
                Write-Host "No Chrome Bookmarks present"
                continue
            }
            if( -not ( Test-Path -Path "$Destination")){
                Write-Warning "Restoring Chrome bookmarks but Chrome is not installed on this machine"
                
            }
            if( -not ( Test-Path -Path "$Destination")){
                New-Item "$Destination" -ItemType Container | Write-Verbose
            }
            
            Copy-Item $Source -Destination "$Destination" -Force | Out-File $log -Append
            Write-Host "complete"
            continue
        }

        #Checks if folder paths are available
        if( -not ( Test-Path -Path $Source  ) ){
            Write-Warning "Could not find path`t$Source"
            continue
        }
                
        if( -not ( Test-Path -Path $Destination -PathType Container ) ){
            New-Item "$Destination" -ItemType Container | Write-Verbose
        }
        
        if($Folder -eq 'AppData\Roaming\Microsoft'){
        #If it's time to copy AppData folder it changes the copy destination to build the proper directory tree

            Get-Item -Path "$Source\*" -Exclude ('Teams') | ForEach-Object {
                $tmpDst = Join-Path $Destination $_.Name
                if( -not ( Test-Path -Path $tmpDst -PathType Container ) ){
                    New-Item "$tmpDst" -ItemType Container 
                }
                Copy-Directory $_ $tmpDst -ProgressBarIndex 1 | Out-File $log -Append
            }

            Write-Host 'complete'
            continue
        }
        Copy-Directory $Source $Destination -ProgressBarIndex 1 | Out-File $log -Append
        Write-Host "complete"
    }
    Write-Progress -Activity "User Profile Transfer from $srcPath to $dstPath" -Completed
    #endregion
 }#End Function
 
function Copy-Directory {
    param (
        $SourceDir,
        $DestDir,
        [int]$ProgressBarIndex = 0
    )
    if ($ProgressBarIndex -eq 0) {
        Write-Progress -Activity "Copying Directory" -Status "$SourceDir to $DestDir" -PercentComplete 0 -Id $ProgressBarIndex
    } else {
        Write-Progress -Activity "Copying Directory" -Status "$SourceDir to $DestDir" -PercentComplete 0 -Id $ProgressBarIndex -ParentId ($ProgressBarIndex-1)
    }
    # Should be 0, but this prevents divide by zero errors. Not used for logic, just progress bar, so innaccuracy is fine. 
    $TotalLength = 1
    Get-ChildItem -Recurse $SourceDir | ForEach-Object { $TotalLength += $_.Length }
    $ProgressLength = 0
    Get-ChildItem $SourceDir | ForEach-Object {
        Write-Progress -Activity "Copying Directory" -Status "$SourceDir to $DestDir" -Id $ProgressBarIndex -PercentComplete $($ProgressLength*100/$TotalLength)
        $item = $_
        $DestDirPath = Join-Path $DestDir $item.Name
        switch -Regex ($item.Mode) {
            'd-----' { 
                if (-not (Test-Path $DestDirPath)) {
                    New-Item -Path $DestDir -Name $item.Name -ItemType Directory | Write-Verbose
                } 
                Copy-Directory -SourceDir $item.FullName -DestDir $DestDirPath -ProgressBarIndex $($ProgressBarIndex+1) 
            }
            default {
                Copy-Item $item.FullName $DestDirPath -PassThru 
            }
        } 
    } | ForEach-Object {
        $ProgressLength += $_.Length
        $_
    } 
    Write-Progress -Activity "Copying Directory" -Status "$SourceDir to $DestDir" -Completed -Id $ProgressBarIndex
}