mirror of
https://github.com/Raphire/Win11Debloat.git
synced 2026-05-18 19:56:25 +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.
117 lines
3.9 KiB
PowerShell
117 lines
3.9 KiB
PowerShell
# Import & execute regfile
|
|
function ImportRegistryFile {
|
|
param (
|
|
$message,
|
|
$path
|
|
)
|
|
|
|
Write-Host $message
|
|
|
|
$usesOfflineHive = $script:Params.ContainsKey("Sysprep") -or $script:Params.ContainsKey("User")
|
|
$regFilePath = if ($usesOfflineHive) {
|
|
"$script:RegfilesPath\Sysprep\$path"
|
|
}
|
|
else {
|
|
"$script:RegfilesPath\$path"
|
|
}
|
|
|
|
if (-not (Test-Path $regFilePath)) {
|
|
$errorMessage = "Unable to find registry file: $path ($regFilePath)"
|
|
Write-Host "Error: $errorMessage" -ForegroundColor Red
|
|
Write-Host ""
|
|
throw $errorMessage
|
|
}
|
|
|
|
# Reset exit code before running reg.exe for reliable success detection
|
|
$global:LASTEXITCODE = 0
|
|
|
|
if ($usesOfflineHive) {
|
|
# Sysprep targets Default user, User targets the specified user
|
|
$hiveDatPath = if ($script:Params.ContainsKey("Sysprep")) {
|
|
GetUserDirectory -userName "Default" -fileName "NTUSER.DAT"
|
|
} else {
|
|
GetUserDirectory -userName $script:Params.Item("User") -fileName "NTUSER.DAT"
|
|
}
|
|
|
|
$regResult = Invoke-NonBlocking -ScriptBlock {
|
|
param($hivePath, $targetRegFilePath)
|
|
$result = @{
|
|
Output = @()
|
|
ExitCode = 0
|
|
Error = $null
|
|
}
|
|
|
|
try {
|
|
$global:LASTEXITCODE = 0
|
|
reg load "HKU\Default" $hivePath | Out-Null
|
|
$loadExitCode = $LASTEXITCODE
|
|
|
|
if ($loadExitCode -ne 0) {
|
|
throw "Failed to load user hive at '$hivePath' (exit code: $loadExitCode)"
|
|
}
|
|
|
|
$output = reg import $targetRegFilePath 2>&1
|
|
$importExitCode = $LASTEXITCODE
|
|
|
|
if ($output) {
|
|
$result.Output = @($output)
|
|
}
|
|
$result.ExitCode = $importExitCode
|
|
|
|
if ($importExitCode -ne 0) {
|
|
throw "Registry import failed with exit code $importExitCode for '$targetRegFilePath'"
|
|
}
|
|
}
|
|
catch {
|
|
$result.Error = $_.Exception.Message
|
|
$result.ExitCode = if ($LASTEXITCODE -ne 0) { $LASTEXITCODE } else { 1 }
|
|
}
|
|
finally {
|
|
$global:LASTEXITCODE = 0
|
|
reg unload "HKU\Default" | Out-Null
|
|
$unloadExitCode = $LASTEXITCODE
|
|
if ($unloadExitCode -ne 0 -and -not $result.Error) {
|
|
$result.Error = "Failed to unload registry hive HKU\Default (exit code: $unloadExitCode)"
|
|
$result.ExitCode = $unloadExitCode
|
|
}
|
|
}
|
|
|
|
return $result
|
|
} -ArgumentList @($hiveDatPath, $regFilePath)
|
|
}
|
|
else {
|
|
$regResult = Invoke-NonBlocking -ScriptBlock {
|
|
param($targetRegFilePath)
|
|
$global:LASTEXITCODE = 0
|
|
$output = reg import $targetRegFilePath 2>&1
|
|
return @{ Output = @($output); ExitCode = $LASTEXITCODE; Error = $null }
|
|
} -ArgumentList $regFilePath
|
|
}
|
|
|
|
$regOutput = @($regResult.Output)
|
|
$hasSuccess = ($regResult.ExitCode -eq 0) -and -not $regResult.Error
|
|
|
|
if ($regOutput) {
|
|
foreach ($line in $regOutput) {
|
|
$lineText = if ($line -is [System.Management.Automation.ErrorRecord]) { $line.Exception.Message } else { $line.ToString() }
|
|
if ($lineText -and $lineText.Length -gt 0) {
|
|
if ($hasSuccess) {
|
|
Write-Host $lineText
|
|
}
|
|
else {
|
|
Write-Host $lineText -ForegroundColor Red
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (-not $hasSuccess) {
|
|
$details = if ($regResult.Error) { $regResult.Error } else { "Exit code: $($regResult.ExitCode)" }
|
|
$errorMessage = "Failed importing registry file '$path'. $details"
|
|
Write-Host $errorMessage -ForegroundColor Red
|
|
Write-Host ""
|
|
throw $errorMessage
|
|
}
|
|
|
|
Write-Host ""
|
|
} |