Public/Restore-EdgeProfile.ps1

Function Restore-EdgeProfile {
    <#
    .SYNOPSIS
    Restores edge profile from backup zip archive.
    THIS CODE IS MADE AVAILABLE AS IS, WITHOUT WARRANTY OF ANY KIND. THE ENTIRE
    RISK OF THE USE OR THE RESULTS FROM THE USE OF THIS CODE REMAINS WITH THE USER.
    .DESCRIPTION
    Restores Microsoft Edge profile and reg keys from the zip archive.
    .NOTES
    Initial draft.
    .INPUTS
    Zip archive of backup profile and reg keys.
    .EXAMPLE
    .\Restore-EdgeProfile.ps1 -BackupZip 'C:\myfilepath\backup.zip'
#>


    #====================================================================================================
    # Requires
    #====================================================================================================
    #region Requires

    #Requires -Version 5.0
    #-- Requires -ShellId <ShellId>
    #-- Requires -RunAsAdministrator
    #-- Requires -PSSnapin <PSSnapin-Name> [-Version <N>[.<n>]]

    #endregion Requires

    #====================================================================================================
    # Parameters
    #====================================================================================================
    #region Parameters
    [cmdletbinding()]
    param(
        [Parameter(Mandatory = $true)]
        [ValidateSet('Stable', 'Beta', 'Dev', 'Canary')]
        [string]$Channel,

        [Parameter(Mandatory = $true)]
        [string]$BackupZip
    )

    #endregion Parameters

    #====================================================================================================
    # Initialize
    #====================================================================================================
    #region Initialize

    $ErrorActionPreference = 'Stop'

    $isMSEdgeRunning = Get-Process -Name 'msedge' -ErrorAction Continue 2>$null

    $tempPath = "$env:TEMP\edgebackup"

    $destinationFolder = $BackupZip.Split('\')[-1]
    $destinationFolder = $destinationFolder.Split('.')[0]

    #endregion Initialize

    #====================================================================================================
    # Main
    #====================================================================================================
    #region Main

    if ($null -ne $isMSEdgeRunning) {
        Write-Host 'Microsoft Edge is running. Please exit and run again.' -ForegroundColor 'Red'
        exit
    } else {
        Write-Verbose 'Checking temp directory.'
        if (!(Test-Path -Path $tempPath)) {
            Write-Verbose 'No temp directory found, creating directory.'
            New-Item -Path $tempPath -ItemType 'Directory' | Out-Null
        } else {
            Write-Verbose 'Temp directory found, removing any files from previous runs.'
            Remove-Item -Path "$tempPath\*" -Recurse -Force
        }
    }

    # Expand archive
    Write-Verbose 'Expanding zip archive to temp folder.'
    try {
        Expand-Archive -Path $BackupZip -DestinationPath "$tempPath\$destinationFolder\"
    } catch {
        Write-Error -Message 'Error expanding backup archive to temp folder.'
        Exit
    }

    Write-Verbose 'Backing up current edge profile to zip file.'
    switch ($channel) {
        Stable { Compress-Archive -Path "$($env:LOCALAPPDATA)\Microsoft\Edge\*" -DestinationPath "$HOME\Downloads\edge_current_backup.zip" -CompressionLevel Fastest }
        Beta { Compress-Archive -Path "$($env:LOCALAPPDATA)\Microsoft\Edge Beta\*" -DestinationPath "$HOME\Downloads\edge_current_backup.zip" -CompressionLevel Fastest }
        Dev { Compress-Archive -Path "$($env:LOCALAPPDATA)\Microsoft\Edge Dev\*" -DestinationPath "$HOME\Downloads\edge_current_backup.zip" -CompressionLevel Fastest }
        Canary { Compress-Archive -Path "$($env:LOCALAPPDATA)\Microsoft\Edge SxS\*" -DestinationPath "$HOME\Downloads\edge_current_backup.zip" -CompressionLevel Fastest }
    }

    Write-Verbose 'Backing up current edge windows registry keys.'
    switch ($channel) {
        Stable { Invoke-Command { reg export 'HKEY_CURRENT_USER\SOFTWARE\Microsoft\Edge\PreferenceMACs' "$tempPath\edge_current.reg" } }
        Beta { Invoke-Command { reg export 'HKEY_CURRENT_USER\SOFTWARE\Microsoft\Edge Beta\PreferenceMACs' "$tempPath\edgebeta_current.reg" } }
        Dev { Invoke-Command { reg export 'HKEY_CURRENT_USER\SOFTWARE\Microsoft\Edge Dev\PreferenceMACs' "$tempPath\edgedev_current.reg" } }
        Canary { Invoke-Command { reg export 'HKEY_CURRENT_USER\SOFTWARE\Microsoft\Edge SxS\PreferenceMACs' "$tempPath\edgecanary_current.reg" } }
    }

    Write-Verbose 'Adding reg key to zip file.'
    Compress-Archive -Path "$tempPath\*.reg" -DestinationPath "$HOME\Downloads\edge_current_backup.zip" -CompressionLevel Fastest -Update

    Write-Verbose 'Removing current Edge profile'
    switch ($channel) {
        Stable { Remove-Item -Path "$($env:LOCALAPPDATA)\Microsoft\Edge\*" -Recurse -Force }
        Beta { Remove-Item -Path "$($env:LOCALAPPDATA)\Microsoft\Edge Beta\*" -Recurse -Force }
        Dev { Remove-Item -Path "$($env:LOCALAPPDATA)\Microsoft\Edge Dev\*" -Recurse -Force }
        Canary { Remove-Item -Path "$($env:LOCALAPPDATA)\Microsoft\Edge SxS\*" -Recurse -Force }
    }

    Write-Verbose 'Removing current Edge windows registry keys.'
    switch ($channel) {
        Stable { Invoke-Command { reg delete 'HKEY_CURRENT_USER\SOFTWARE\Microsoft\Edge\PreferenceMACs' /f } }
        Beta { Invoke-Command { reg delete 'HKEY_CURRENT_USER\SOFTWARE\Microsoft\Edge Beta\PreferenceMACs' /f } }
        Dev { Invoke-Command { reg delete 'HKEY_CURRENT_USER\SOFTWARE\Microsoft\Edge Dev\PreferenceMACs' /f } }
        Canary { Invoke-Command { reg delete 'HKEY_CURRENT_USER\SOFTWARE\Microsoft\Edge SxS\PreferenceMACs' /f } }
    }

    Write-Verbose 'Importing backed up reg keys.'
    switch ($channel) {
        Stable { Invoke-Command { reg import "$($tempPath)\$($destinationFolder)\edge.reg" } }
        Beta { Invoke-Command { reg import "$tempPath\$destinationFolder\edgebeta.reg" } }
        Dev { Invoke-Command { reg import "$tempPath\$destinationFolder\edgedev.reg" } }
        Canary { Invoke-Command { reg import "$tempPath\$destinationFolder\edgecanary.reg" } }
    }

    Write-Verbose 'Moving backed up profile into application folder.'
    switch ($channel) {
        Stable { Move-Item -Path "$tempPath\$destinationFolder\*" -Destination "$($env:LOCALAPPDATA)\Microsoft\Edge\" -Force }
        Beta { Move-Item -Path "$tempPath\$destinationFolder\*" -Destination "$($env:LOCALAPPDATA)\Microsoft\Edge Beta\*" -Force }
        Dev { Move-Item -Path "$tempPath\$destinationFolder\*" -Destination "$($env:LOCALAPPDATA)\Microsoft\Edge Dev\*" -Force }
        Canary { Move-Item -Path "$tempPath\$destinationFolder\*" -Destination "$($env:LOCALAPPDATA)\Microsoft\Edge SxS\*" -Force }
    }

    Write-Verbose 'Cleaning up exported files.'
    Remove-Item -Path $tempPath -Recurse -Force

    #endregion Main
}