PowerShell - Edge Scripts¶
Contents¶
Backup Edge Profile Module¶
backup-edge-profile.psm1
<#
.Synopsis
Allows for easy backup and restore of Microsoft EDGE (Anaheim) Profiles.
EDGE MUST BE CLOSED DURING!
.Description
Will backup all EDGE "User Data" for the current user. This data contains all the "Profiles" within the browser, and the corresponding registry keys will also be saved alongside the backup.
Backups are zipped to allow for easy storage on locations like OneDrive.
Before archiving the backup, all profiles have their Cache emptied.
Restore will replace the current users EDGE data. The command requires that the user chooses how to handle existing data.
.Example
# Backup the current users EDGE Profiles to the _EdgeProfilesBackup folder in the users own OneDrive.
Backup-EDGEProfiles
.Example
# Backup the current users EDGE Profiles to the users own TEMP folder.
Backup-EDGEProfiles -Destination $env:TEMP
.Example
# Restore a previous backup and remove existing user data.
Restore-EDGEProfiles -ZIPSource EDGE-UserData30July2021-MichaelMardahl.zip -REGSource EDGE-ProfilesRegistry30July2021-MichaelMardahl.reg -ExistingDataAction Remove
#>
#Requires -Version 5
function Backup-EDGEProfiles {
<#
.Synopsis
Backup current users Microsoft EDGE (Anaheim) Profiles.
.Description
Will backup all EDGE "User Data" for the current user.
.Parameter Verbose
Enables extended output
.Parameter Destination
(optional)
Location in which to save the backup ZIP and REG files
Defaults to the users OneDrive
.Parameter AddDate
(optional - $true/$false)
Applies a date stamp to the filenames.
Defaults to $true
.Example
# Backup the current users EDGE Profiles to the _EdgeProfilesBackup folder in the users own OneDrive.
Backup-EDGEProfiles
.Example
# Backup the current users EDGE Profiles to the users own TEMP folder.
Backup-EDGEProfiles -Destination $env:TEMP
.NOTES
This function backs up the following for an Edge User Profile:
- Compressed archive backup of folder: %LOCALAPPDATA%\Microsoft\Edge
- Registry backup of path: HKCU\Software\Microsoft\Edge\PreferenceMACs
#>
[CmdletBinding()]
param (
[Parameter(Mandatory = $false,
HelpMessage = "Destination of the EDGE profile backup (Defaults to OneDrive Backups folder: ~\OneDrive\Backups\EdgeProfilesBackup)")]
[string]$Destination = (Join-Path -Path $env:OneDrive -ChildPath "\Backups\EdgeProfilesBackup"),
[Parameter(Mandatory = $false,
HelpMessage = "Append the current date to the backup (Defaults to true)")]
[bool]$AddDate = $true
)
#region Execute
#Verify that the entered destination exists
if ((-not (Test-Path $Destination) -and ($Destination -eq (Join-Path -Path $env:OneDrive -ChildPath "\_EdgeProfilesBackup")))) {
#Create default destination
New-Item -ItemType Directory -Path $Destination -Force | Out-Null
}
elseif (-not (Test-Path $Destination)) {
Write-Warning "The entered destination path could not be validated ($Destination)"
break
}
#Verify EDGE is closed
if (Get-Process msedge -ErrorAction SilentlyContinue) {
Write-Error "EDGE is still running, please close any open EDGE Browsers and try again."
break
}
Write-Output "Starting EDGE profiles backup for $($env:USERNAME) to ($Destination) - DON'T OPEN EDGE! and please wait..."
Write-Verbose "Destination root : $Destination"
Write-Verbose "Append date : $AddDate"
#Date name addition check
if ($AddDate) {
$dateName = (get-date -Format ddMMMMyyyy).ToString()
}
else {
$dateName = ""
}
#Setting some important variables
$edgeProfilesPath = (Join-Path -Path $env:LOCALAPPDATA -ChildPath "\Microsoft\Edge")
$edgeProfilesRegistry = "HKCU\Software\Microsoft\Edge\PreferenceMACs"
#Export registry key
$regBackupDestination = (Join-Path -Path $Destination -ChildPath "\EDGE-ProfilesRegistry$($dateName)-$($env:USERNAME).reg")
Write-Verbose "Exporting Registry backup to $regBackupDestination"
#Remove any existing destination file, else the export will stall.
if (($regBackupDestination -ilike "*.reg") -and (Test-Path $regBackupDestination)) {
Remove-Item $regBackupDestination -Force -ErrorAction SilentlyContinue
}
$regCMD = Invoke-Command { reg export "$edgeProfilesRegistry" "$regBackupDestination" }
#Export user data
#Cleaning cache
Write-Verbose "Cleaning up cache before export."
if (Test-Path $edgeProfilesPath) {
$cacheFolders = Get-ChildItem -Path $edgeProfilesPath -r | Where-Object { $_.PsIsContainer -and $_.Name -eq "Cache" }
Foreach ($folder in $cacheFolders) {
$rmPath = Join-Path -Path $folder.fullname -ChildPath "\*"
Write-Verbose "Emptying $rmPath"
Remove-Item $rmPath -Recurse -Force
}
Write-Verbose "Cleanup completed."
}
else {
Write-Error "EDGE user data folder missing - terminating!"
break
}
#Creating ZIP Archive
$zipBackupDestination = (Join-Path -Path $Destination -ChildPath "\EDGE-UserData$($dateName)-$($env:USERNAME).zip")
Write-Verbose "Exporting user data backup to $zipBackupDestination"
#Remove any existing destination file, else the export will fail.
if (($zipBackupDestination -ilike "*.zip") -and (Test-Path $zipBackupDestination)) {
Remove-Item $zipBackupDestination -Force -ErrorAction SilentlyContinue
}
#Compressing data to backup location
try {
Get-ChildItem -Path $edgeProfilesPath | Compress-Archive -DestinationPath $zipBackupDestination -CompressionLevel Fastest
Write-Output "EDGE Profile export completed to: $Destination"
}
catch {
#Error out and cleanup
Write-Error $_
Remove-Item $zipBackupDestination -Force -ErrorAction SilentlyContinue
Remove-Item $regBackupDestination -Force -ErrorAction SilentlyContinue
Write-Error "EDGE Backup failed, did you forget to keep EDGE closed?!"
break
}
#endregion Execute
}
function Restore-EDGEProfiles {
<#
.Synopsis
Restore Microsoft EDGE (Anaheim) Profiles to the current users EDGE Browser.
.Description
Will restore all EDGE "User Data" for the current user from an archive created by the Backup-EDGEProfiles function.
.Parameter Verbose
Enables extended output
.Parameter ZIPSource
(Mandatory - file path)
Location of the User Data backup archive file.
.Parameter REGSource
(Mandatory - file path)
Location of the profile data registry file.
.Parameter ExistingDataAction
(Mandatory - Rename/Remove)
Choose wheather to have the existing User Data removed completely or just renamed. Renaming will add a datestamp to the existing USer Data folder.
.Example
# Restore a previous backup and remove existing user data.
Restore-EDGEProfiles -ZIPSource EDGE-UserData30July2021-MichaelMardahl.zip -REGSource EDGE-ProfilesRegistry30July2021-MichaelMardahl.reg -ExistingDataAction Remove
#>
#Add the -verbose parameter to commandline to get extra output.
[CmdletBinding()]
param (
[Parameter(Mandatory = $true,
HelpMessage = "Source of the EDGE User Data profile backup archive")]
[string]$ZIPSource,
[Parameter(Mandatory = $true,
HelpMessage = "Source of the EDGE Registry profile backup file")]
[string]$REGSource,
[Parameter(Mandatory = $true,
HelpMessage = "How to handle the existing profiles? Options are Backup or Remove")]
[ValidateSet('Rename', 'Remove')]
[string]$ExistingDataAction
)
#region Execute
#Verify that the entered sources exits and have the right fileextention
if (-not ((Test-Path $ZIPSource) -or (-not ($ZIPSource -ilike "*.zip")))) {
Write-Error "The entered source file could not be validated ($ZIPSource)"
break
}
if (-not ((Test-Path $REGSource) -or (-not ($REGSource -ilike "*.reg")))) {
Write-Error "The entered source file could not be validated ($REGSource)"
break
}
#Verify EDGE is closed
if (Get-Process msedge -ErrorAction SilentlyContinue) {
Write-Error "EDGE is still running, please close any open EDGE Browsers and try again."
Break
}
Write-Output "Starting EDGE profiles restore for $($env:USERNAME) - (DON'T OPEN EDGE!) please wait..."
Write-Verbose "Source archive : $ZIPSource"
Write-Verbose "Source registry : $REGSource"
#Define location of EDGE Profile for current user
$edgeProfilesPath = (Join-Path -Path $env:LOCALAPPDATA -ChildPath "\Microsoft\Edge")
#Handle existing User Data
$UserData = (Join-Path -Path $edgeProfilesPath -ChildPath "\User Data")
if (Test-Path $UserData) {
Write-Verbose "Existing User Data folder found in $edgeProfilesPath"
if ($ExistingDataAction -eq "Rename") {
$renameFolder = "$($UserData)-$((get-date -Format ddMMMMyyyy-HHmmss).ToString())"
Write-Verbose "Rename parameter set - Renaming folder to '$renameFolder'"
Rename-Item $UserData $renameFolder
}
else {
Write-Verbose "Remove parameter set - Deleting existing data."
Remove-Item $UserData -Recurse -Force
}
}
#Import registry key
Write-Verbose "Importing Registry backup from $REGSource"
$regCMD = Invoke-Command { reg import "$REGSource" }
#Import user data
#
Write-Verbose "Decompressing '$ZIPSource' to $edgeProfilesPath"
try {
Expand-Archive -Path $ZIPSource -DestinationPath $edgeProfilesPath -Force
Write-Output "EDGE Profile import completed to: $UserData"
}
catch {
#Error out and cleanup
Write-Error $_
Remove-Item $zipBackupDestination -Force -ErrorAction SilentlyContinue
Remove-Item $regBackupDestination -Force -ErrorAction SilentlyContinue
Write-Error "EDGE import failed, did you forget to keep EDGE closed?!"
break
}
#endregion Execute
}
Export-ModuleMember -Function Backup-EDGEProfiles, Restore-EDGEProfiles
Backup-EDGEProfiles¶
function Backup-EDGEProfiles {
<#
.Synopsis
Backup current users Microsoft EDGE (Anaheim) Profiles.
.Description
Will backup all EDGE "User Data" for the current user.
.Parameter Verbose
Enables extended output
.Parameter Destination
(optional)
Location in which to save the backup ZIP and REG files
Defaults to the users OneDrive
.Parameter AddDate
(optional - $true/$false)
Applies a date stamp to the filenames.
Defaults to $true
.Example
# Backup the current users EDGE Profiles to the _EdgeProfilesBackup folder in the users own OneDrive.
Backup-EDGEProfiles
.Example
# Backup the current users EDGE Profiles to the users own TEMP folder.
Backup-EDGEProfiles -Destination $env:TEMP
.NOTES
This function backs up the following for an Edge User Profile:
- Compressed archive backup of folder: %LOCALAPPDATA%\Microsoft\Edge
- Registry backup of path: HKCU\Software\Microsoft\Edge\PreferenceMACs
#>
[CmdletBinding()]
param (
[Parameter(Mandatory = $false,
HelpMessage = "Destination of the EDGE profile backup (Defaults to OneDrive Backups folder: ~\OneDrive\Backups\EdgeProfilesBackup)")]
[string]$Destination = (Join-Path -Path $env:OneDrive -ChildPath "\Backups\EdgeProfilesBackup"),
[Parameter(Mandatory = $false,
HelpMessage = "Append the current date to the backup (Defaults to true)")]
[bool]$AddDate = $true
)
#region Execute
#Verify that the entered destination exists
if ((-not (Test-Path $Destination) -and ($Destination -eq (Join-Path -Path $env:OneDrive -ChildPath "\_EdgeProfilesBackup")))) {
#Create default destination
New-Item -ItemType Directory -Path $Destination -Force | Out-Null
}
elseif (-not (Test-Path $Destination)) {
Write-Warning "The entered destination path could not be validated ($Destination)"
break
}
#Verify EDGE is closed
if (Get-Process msedge -ErrorAction SilentlyContinue) {
Write-Error "EDGE is still running, please close any open EDGE Browsers and try again."
break
}
Write-Output "Starting EDGE profiles backup for $($env:USERNAME) to ($Destination) - DON'T OPEN EDGE! and please wait..."
Write-Verbose "Destination root : $Destination"
Write-Verbose "Append date : $AddDate"
#Date name addition check
if ($AddDate) {
$dateName = (get-date -Format ddMMMMyyyy).ToString()
}
else {
$dateName = ""
}
#Setting some important variables
$edgeProfilesPath = (Join-Path -Path $env:LOCALAPPDATA -ChildPath "\Microsoft\Edge")
$edgeProfilesRegistry = "HKCU\Software\Microsoft\Edge\PreferenceMACs"
#Export registry key
$regBackupDestination = (Join-Path -Path $Destination -ChildPath "\EDGE-ProfilesRegistry$($dateName)-$($env:USERNAME).reg")
Write-Verbose "Exporting Registry backup to $regBackupDestination"
#Remove any existing destination file, else the export will stall.
if (($regBackupDestination -ilike "*.reg") -and (Test-Path $regBackupDestination)) {
Remove-Item $regBackupDestination -Force -ErrorAction SilentlyContinue
}
$regCMD = Invoke-Command { reg export "$edgeProfilesRegistry" "$regBackupDestination" }
#Export user data
#Cleaning cache
Write-Verbose "Cleaning up cache before export."
if (Test-Path $edgeProfilesPath) {
$cacheFolders = Get-ChildItem -Path $edgeProfilesPath -r | Where-Object { $_.PsIsContainer -and $_.Name -eq "Cache" }
Foreach ($folder in $cacheFolders) {
$rmPath = Join-Path -Path $folder.fullname -ChildPath "\*"
Write-Verbose "Emptying $rmPath"
Remove-Item $rmPath -Recurse -Force
}
Write-Verbose "Cleanup completed."
}
else {
Write-Error "EDGE user data folder missing - terminating!"
break
}
#Creating ZIP Archive
$zipBackupDestination = (Join-Path -Path $Destination -ChildPath "\EDGE-UserData$($dateName)-$($env:USERNAME).zip")
Write-Verbose "Exporting user data backup to $zipBackupDestination"
#Remove any existing destination file, else the export will fail.
if (($zipBackupDestination -ilike "*.zip") -and (Test-Path $zipBackupDestination)) {
Remove-Item $zipBackupDestination -Force -ErrorAction SilentlyContinue
}
#Compressing data to backup location
try {
Get-ChildItem -Path $edgeProfilesPath | Compress-Archive -DestinationPath $zipBackupDestination -CompressionLevel Fastest
Write-Output "EDGE Profile export completed to: $Destination"
}
catch {
#Error out and cleanup
Write-Error $_
Remove-Item $zipBackupDestination -Force -ErrorAction SilentlyContinue
Remove-Item $regBackupDestination -Force -ErrorAction SilentlyContinue
Write-Error "EDGE Backup failed, did you forget to keep EDGE closed?!"
break
}
#endregion Execute
}
Restore-EDGEProfiles¶
function Restore-EDGEProfiles {
<#
.Synopsis
Restore Microsoft EDGE (Anaheim) Profiles to the current users EDGE Browser.
.Description
Will restore all EDGE "User Data" for the current user from an archive created by the Backup-EDGEProfiles function.
.Parameter Verbose
Enables extended output
.Parameter ZIPSource
(Mandatory - file path)
Location of the User Data backup archive file.
.Parameter REGSource
(Mandatory - file path)
Location of the profile data registry file.
.Parameter ExistingDataAction
(Mandatory - Rename/Remove)
Choose wheather to have the existing User Data removed completely or just renamed. Renaming will add a datestamp to the existing USer Data folder.
.Example
# Restore a previous backup and remove existing user data.
Restore-EDGEProfiles -ZIPSource EDGE-UserData30July2021-MichaelMardahl.zip -REGSource EDGE-ProfilesRegistry30July2021-MichaelMardahl.reg -ExistingDataAction Remove
#>
#Add the -verbose parameter to commandline to get extra output.
[CmdletBinding()]
param (
[Parameter(Mandatory = $true,
HelpMessage = "Source of the EDGE User Data profile backup archive")]
[string]$ZIPSource,
[Parameter(Mandatory = $true,
HelpMessage = "Source of the EDGE Registry profile backup file")]
[string]$REGSource,
[Parameter(Mandatory = $true,
HelpMessage = "How to handle the existing profiles? Options are Backup or Remove")]
[ValidateSet('Rename', 'Remove')]
[string]$ExistingDataAction
)
#region Execute
#Verify that the entered sources exits and have the right fileextention
if (-not ((Test-Path $ZIPSource) -or (-not ($ZIPSource -ilike "*.zip")))) {
Write-Error "The entered source file could not be validated ($ZIPSource)"
break
}
if (-not ((Test-Path $REGSource) -or (-not ($REGSource -ilike "*.reg")))) {
Write-Error "The entered source file could not be validated ($REGSource)"
break
}
#Verify EDGE is closed
if (Get-Process msedge -ErrorAction SilentlyContinue) {
Write-Error "EDGE is still running, please close any open EDGE Browsers and try again."
Break
}
Write-Output "Starting EDGE profiles restore for $($env:USERNAME) - (DON'T OPEN EDGE!) please wait..."
Write-Verbose "Source archive : $ZIPSource"
Write-Verbose "Source registry : $REGSource"
#Define location of EDGE Profile for current user
$edgeProfilesPath = (Join-Path -Path $env:LOCALAPPDATA -ChildPath "\Microsoft\Edge")
#Handle existing User Data
$UserData = (Join-Path -Path $edgeProfilesPath -ChildPath "\User Data")
if (Test-Path $UserData) {
Write-Verbose "Existing User Data folder found in $edgeProfilesPath"
if ($ExistingDataAction -eq "Rename") {
$renameFolder = "$($UserData)-$((get-date -Format ddMMMMyyyy-HHmmss).ToString())"
Write-Verbose "Rename parameter set - Renaming folder to '$renameFolder'"
Rename-Item $UserData $renameFolder
}
else {
Write-Verbose "Remove parameter set - Deleting existing data."
Remove-Item $UserData -Recurse -Force
}
}
#Import registry key
Write-Verbose "Importing Registry backup from $REGSource"
$regCMD = Invoke-Command { reg import "$REGSource" }
#Import user data
#
Write-Verbose "Decompressing '$ZIPSource' to $edgeProfilesPath"
try {
Expand-Archive -Path $ZIPSource -DestinationPath $edgeProfilesPath -Force
Write-Output "EDGE Profile import completed to: $UserData"
}
catch {
#Error out and cleanup
Write-Error $_
Remove-Item $zipBackupDestination -Force -ErrorAction SilentlyContinue
Remove-Item $regBackupDestination -Force -ErrorAction SilentlyContinue
Write-Error "EDGE import failed, did you forget to keep EDGE closed?!"
break
}
#endregion Execute
}
Personal Script¶
Source: jimbrig/jimsdots My personalized dotfiles and configs for Windows 10 ⚙️
# Edge Backup Script (PowerShell Core)
$dotdir = "$env:DOTDIR"
$edge_backup_dir = "$dotdir\edge\backups\edge"
$edge_dev_backup_dir = "$dotdir\edge\backups\edge_dev"
$edge_appdata_dir = "$env:LocalAppData\Microsoft\Edge"
$edge_dev_appdata_dir = "$env:LocalAppData\Microsoft\Edge Dev"
Copy-Item $edge_appdata_dir -Destination $env:TEMP\edge -Force -Recurse
Copy-Item $edge_dev_appdata_dir -Destination $env:TEMP\edge_dev -Force -Recurse
Compress-Archive -Path "$env:TEMP\edge\User Data" -DestinationPath "$edge_backup_dir\UserData.zip" -Update
Compress-Archive -Path "$env:TEMP\edge_dev\User Data" -DestinationPath "$edge_dev_backup_dir\UserData.zip" -Update
Invoke-Command { reg export 'HKCU\Software\Microsoft\Edge\PreferenceMACs' $dotdir\edge\backups\edge\edge_registry_settings.reg }
Invoke-Command { reg export 'HKCU\Software\Microsoft\Edge Dev\PreferenceMACs' $dotdir\edge\backups\edge_dev\edge_dev_registry_settings.reg }
Appendix: Links¶
Related
Backlinks: