mirror of
https://github.com/Raphire/Win11Debloat.git
synced 2026-05-18 11:46:18 +00:00
Starting from this commit, Win11Debloat will automatically create a registry backup every time the script is run. This registry backup can be used to revert any registry changes made by the script.
89 lines
3.0 KiB
PowerShell
89 lines
3.0 KiB
PowerShell
function New-RegistrySettingsBackup {
|
|
param(
|
|
[string[]]$ActionableKeys
|
|
)
|
|
|
|
$ActionableKeys = @($ActionableKeys)
|
|
$selectedFeatures = Get-SelectedFeatures -ActionableKeys $ActionableKeys
|
|
if (@($selectedFeatures | Where-Object { -not [string]::IsNullOrWhiteSpace([string]$_.RegistryKey) }).Count -eq 0) {
|
|
return $null
|
|
}
|
|
|
|
$timestamp = Get-Date
|
|
$backupDirectory = $script:RegistryBackupsPath
|
|
if (-not (Test-Path $backupDirectory)) {
|
|
New-Item -ItemType Directory -Path $backupDirectory -Force | Out-Null
|
|
}
|
|
|
|
$backupFileName = 'Win11Debloat-RegistryBackup-{0}.json' -f $timestamp.ToString('yyyyMMdd_HHmmss')
|
|
$backupFilePath = Join-Path $backupDirectory $backupFileName
|
|
|
|
$backupConfig = Get-RegistryBackupPayload -SelectedFeatures $selectedFeatures -CreatedAt $timestamp
|
|
if (-not (SaveToFile -Config $backupConfig -FilePath $backupFilePath -MaxDepth 25)) {
|
|
throw "Failed to save registry backup to '$backupFilePath'"
|
|
}
|
|
|
|
Write-Host "Backup successfully created: $backupFilePath"
|
|
Write-Host ""
|
|
|
|
return $backupFilePath
|
|
}
|
|
|
|
function Get-SelectedFeatures {
|
|
param(
|
|
[string[]]$ActionableKeys
|
|
)
|
|
|
|
$selectedFeatures = New-Object System.Collections.Generic.List[object]
|
|
$selectedFeatureIds = New-Object 'System.Collections.Generic.HashSet[string]' ([System.StringComparer]::OrdinalIgnoreCase)
|
|
|
|
foreach ($paramKey in $ActionableKeys) {
|
|
if (-not $script:Features.ContainsKey($paramKey)) { continue }
|
|
|
|
$feature = $script:Features[$paramKey]
|
|
if (-not $feature) { continue }
|
|
|
|
$featureId = Get-FeatureId -Feature $feature
|
|
|
|
if ($selectedFeatureIds.Add($featureId)) {
|
|
$selectedFeatures.Add($feature)
|
|
}
|
|
}
|
|
|
|
return @($selectedFeatures.ToArray())
|
|
}
|
|
|
|
function Get-RegistryBackupPayload {
|
|
param(
|
|
[Parameter(Mandatory)]
|
|
[object[]]$SelectedFeatures,
|
|
[Parameter(Mandatory)]
|
|
[datetime]$CreatedAt
|
|
)
|
|
|
|
$selectedFeatureIds = New-Object System.Collections.Generic.List[string]
|
|
$seenSelectedFeatureIds = New-Object 'System.Collections.Generic.HashSet[string]' ([System.StringComparer]::OrdinalIgnoreCase)
|
|
foreach ($feature in $SelectedFeatures) {
|
|
$featureId = Get-FeatureId -Feature $feature
|
|
|
|
if ($seenSelectedFeatureIds.Add($featureId)) {
|
|
$selectedFeatureIds.Add($featureId)
|
|
}
|
|
}
|
|
|
|
$selectedRegistryFeatures = Get-RegistryBackedFeatures -Features $SelectedFeatures
|
|
$capturePlans = Get-RegistryBackupCapturePlans -SelectedRegistryFeatures $SelectedRegistryFeatures
|
|
$registryKeys = @(Get-RegistrySnapshotsForBackup -CapturePlans $capturePlans)
|
|
|
|
return @{
|
|
Version = '1.0'
|
|
BackupType = 'RegistryState'
|
|
CreatedAt = $CreatedAt.ToString('o')
|
|
CreatedBy = 'Win11Debloat'
|
|
Target = (Get-RegistryBackupTargetDescription)
|
|
ComputerName = $env:COMPUTERNAME
|
|
SelectedFeatures = @($selectedFeatureIds)
|
|
RegistryKeys = @($registryKeys)
|
|
}
|
|
}
|