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.
231 lines
7.9 KiB
PowerShell
231 lines
7.9 KiB
PowerShell
param (
|
|
[switch]$CLI,
|
|
[switch]$Silent,
|
|
[switch]$Verbose,
|
|
[switch]$Sysprep,
|
|
[string]$LogPath,
|
|
[string]$User,
|
|
[switch]$NoRestartExplorer,
|
|
[switch]$CreateRestorePoint,
|
|
[switch]$RunAppsListGenerator,
|
|
[switch]$RunDefaults,
|
|
[switch]$RunDefaultsLite,
|
|
[switch]$RunSavedSettings,
|
|
[string]$Config,
|
|
[string]$Apps,
|
|
[string]$AppRemovalTarget,
|
|
[switch]$RemoveApps,
|
|
[switch]$RemoveAppsCustom,
|
|
[switch]$RemoveGamingApps,
|
|
[switch]$RemoveCommApps,
|
|
[switch]$RemoveHPApps,
|
|
[switch]$RemoveW11Outlook,
|
|
[switch]$ForceRemoveEdge,
|
|
[switch]$DisableDVR,
|
|
[switch]$DisableGameBarIntegration,
|
|
[switch]$EnableWindowsSandbox,
|
|
[switch]$EnableWindowsSubsystemForLinux,
|
|
[switch]$DisableTelemetry,
|
|
[switch]$DisableSearchHistory,
|
|
[switch]$DisableFastStartup,
|
|
[switch]$DisableBitlockerAutoEncryption,
|
|
[switch]$DisableModernStandbyNetworking,
|
|
[switch]$DisableStorageSense,
|
|
[switch]$DisableUpdateASAP,
|
|
[switch]$PreventUpdateAutoReboot,
|
|
[switch]$DisableDeliveryOptimization,
|
|
[switch]$DisableBing,
|
|
[switch]$DisableStoreSearchSuggestions,
|
|
[switch]$DisableDesktopSpotlight,
|
|
[switch]$DisableLockscreenTips,
|
|
[switch]$DisableSuggestions,
|
|
[switch]$DisableLocationServices,
|
|
[switch]$DisableFindMyDevice,
|
|
[switch]$DisableEdgeAds,
|
|
[switch]$DisableBraveBloat,
|
|
[switch]$DisableSettings365Ads,
|
|
[switch]$DisableSettingsHome,
|
|
[switch]$ShowHiddenFolders,
|
|
[switch]$ShowKnownFileExt,
|
|
[switch]$HideDupliDrive,
|
|
[switch]$EnableDarkMode,
|
|
[switch]$DisableTransparency,
|
|
[switch]$DisableAnimations,
|
|
[switch]$TaskbarAlignLeft,
|
|
[switch]$CombineTaskbarAlways, [switch]$CombineTaskbarWhenFull, [switch]$CombineTaskbarNever,
|
|
[switch]$CombineMMTaskbarAlways, [switch]$CombineMMTaskbarWhenFull, [switch]$CombineMMTaskbarNever,
|
|
[switch]$MMTaskbarModeAll, [switch]$MMTaskbarModeMainActive, [switch]$MMTaskbarModeActive,
|
|
[switch]$HideSearchTb, [switch]$ShowSearchIconTb, [switch]$ShowSearchLabelTb, [switch]$ShowSearchBoxTb,
|
|
[switch]$HideTaskview,
|
|
[switch]$DisableStartRecommended,
|
|
[switch]$DisableStartAllApps,
|
|
[switch]$DisableStartPhoneLink,
|
|
[switch]$DisableCopilot,
|
|
[switch]$DisableRecall,
|
|
[switch]$DisableClickToDo,
|
|
[switch]$DisableAISvcAutoStart,
|
|
[switch]$DisablePaintAI,
|
|
[switch]$DisableNotepadAI,
|
|
[switch]$DisableEdgeAI,
|
|
[switch]$DisableSearchHighlights,
|
|
[switch]$DisableWidgets,
|
|
[switch]$HideChat,
|
|
[switch]$EnableEndTask,
|
|
[switch]$EnableLastActiveClick,
|
|
[switch]$ClearStart,
|
|
[string]$ReplaceStart,
|
|
[switch]$ClearStartAllUsers,
|
|
[string]$ReplaceStartAllUsers,
|
|
[switch]$RevertContextMenu,
|
|
[switch]$DisableDragTray,
|
|
[switch]$DisableMouseAcceleration,
|
|
[switch]$DisableStickyKeys,
|
|
[switch]$DisableWindowSnapping,
|
|
[switch]$DisableSnapAssist,
|
|
[switch]$DisableSnapLayouts,
|
|
[switch]$HideTabsInAltTab, [switch]$Show3TabsInAltTab, [switch]$Show5TabsInAltTab, [switch]$Show20TabsInAltTab,
|
|
[switch]$HideHome,
|
|
[switch]$HideGallery,
|
|
[switch]$ExplorerToHome,
|
|
[switch]$ExplorerToThisPC,
|
|
[switch]$ExplorerToDownloads,
|
|
[switch]$ExplorerToOneDrive,
|
|
[switch]$AddFoldersToThisPC,
|
|
[switch]$HideOnedrive,
|
|
[switch]$Hide3dObjects,
|
|
[switch]$HideMusic,
|
|
[switch]$HideIncludeInLibrary,
|
|
[switch]$HideGiveAccessTo,
|
|
[switch]$HideShare,
|
|
[switch]$ShowDriveLettersFirst,
|
|
[switch]$ShowDriveLettersLast,
|
|
[switch]$ShowNetworkDriveLettersFirst,
|
|
[switch]$HideDriveLetters
|
|
)
|
|
|
|
# Show error if current powershell environment does not have LanguageMode set to FullLanguage
|
|
if ($ExecutionContext.SessionState.LanguageMode -ne "FullLanguage") {
|
|
Write-Host "Error: Win11Debloat is unable to run on your system. PowerShell execution is restricted by security policies" -ForegroundColor Red
|
|
Write-Output ""
|
|
Write-Output "Press enter to exit..."
|
|
Read-Host | Out-Null
|
|
Exit
|
|
}
|
|
|
|
Clear-Host
|
|
Write-Output "-------------------------------------------------------------------------------------------"
|
|
Write-Output " Win11Debloat Script - Get Dev"
|
|
Write-Output "-------------------------------------------------------------------------------------------"
|
|
|
|
$tempRootPath = $env:TEMP
|
|
$tempWorkPath = Join-Path $tempRootPath 'Win11Debloat'
|
|
$tempArchivePath = Join-Path $tempRootPath 'win11debloat.zip'
|
|
|
|
Write-Output "> Downloading Win11Debloat for development..."
|
|
|
|
# Download latest version of Win11Debloat from GitHub master branch as zip archive
|
|
try {
|
|
Invoke-RestMethod "https://github.com/Raphire/Win11Debloat/archive/refs/heads/master.zip" -OutFile $tempArchivePath
|
|
}
|
|
catch {
|
|
Write-Host "Error: Unable to fetch master branch from GitHub. Please check your internet connection and try again." -ForegroundColor Red
|
|
Write-Output ""
|
|
Write-Output "Press enter to exit..."
|
|
Read-Host | Out-Null
|
|
Exit
|
|
}
|
|
|
|
Write-Output ""
|
|
Write-Output "> Cleaning up old Win11Debloat folder..."
|
|
|
|
# Remove old script folder if it exists, but keep config and log files
|
|
if (Test-Path $tempWorkPath) {
|
|
Get-ChildItem -Path $tempWorkPath -Exclude CustomAppsList,LastUsedSettings.json,Win11Debloat.log,Config,Logs,Backups | Remove-Item -Recurse -Force
|
|
}
|
|
|
|
$configDir = Join-Path $tempWorkPath 'Config'
|
|
$backupDir = Join-Path $tempWorkPath 'ConfigOld'
|
|
|
|
# Temporarily move existing config files if they exist to prevent them from being overwritten by the new script files, will be moved back after the new script is unpacked
|
|
if (Test-Path "$configDir") {
|
|
New-Item -ItemType Directory -Path "$backupDir" -Force | Out-Null
|
|
|
|
$filesToKeep = @(
|
|
'CustomAppsList',
|
|
'LastUsedSettings.json'
|
|
)
|
|
|
|
Get-ChildItem -Path "$configDir" -Recurse | Where-Object { $_.Name -in $filesToKeep } | Move-Item -Destination "$backupDir"
|
|
|
|
Remove-Item "$configDir" -Recurse -Force
|
|
}
|
|
|
|
Write-Output ""
|
|
Write-Output "> Unpacking..."
|
|
|
|
# Unzip archive to Win11Debloat folder
|
|
Expand-Archive $tempArchivePath $tempWorkPath
|
|
|
|
# Remove archive
|
|
Remove-Item $tempArchivePath
|
|
|
|
# Move files
|
|
Get-ChildItem -Path (Join-Path $tempWorkPath '*Win11Debloat-*') -Recurse | Move-Item -Destination $tempWorkPath
|
|
|
|
# Add existing config files back to Config folder
|
|
if (Test-Path "$backupDir") {
|
|
if (-not (Test-Path "$configDir")) {
|
|
New-Item -ItemType Directory -Path "$configDir" -Force | Out-Null
|
|
}
|
|
|
|
Get-ChildItem -Path "$backupDir" -Recurse | Move-Item -Destination "$configDir"
|
|
Remove-Item "$backupDir" -Recurse -Force
|
|
}
|
|
|
|
# Make list of arguments to pass on to the script
|
|
$arguments = $($PSBoundParameters.GetEnumerator() | ForEach-Object {
|
|
if ($_.Value -eq $true) {
|
|
"-$($_.Key)"
|
|
}
|
|
else {
|
|
"-$($_.Key) ""$($_.Value)"""
|
|
}
|
|
})
|
|
|
|
Write-Output ""
|
|
Write-Output "> Launching Win11Debloat..."
|
|
|
|
# Minimize the powershell window when no parameters are provided
|
|
if ($arguments.Count -eq 0) {
|
|
$windowStyle = "Minimized"
|
|
}
|
|
else {
|
|
$windowStyle = "Normal"
|
|
}
|
|
|
|
# Remove Powershell 7 modules from path to prevent module loading issues in the script
|
|
if ($PSVersionTable.PSVersion.Major -ge 7) {
|
|
$NewPSModulePath = $env:PSModulePath -split ';' | Where-Object -FilterScript { $_ -like '*WindowsPowerShell*' }
|
|
$env:PSModulePath = $NewPSModulePath -join ';'
|
|
}
|
|
|
|
# Run Win11Debloat script with the provided arguments
|
|
$debloatScriptPath = Join-Path $tempWorkPath 'Win11Debloat.ps1'
|
|
$debloatProcess = Start-Process powershell.exe -WindowStyle $windowStyle -PassThru -ArgumentList "-executionpolicy bypass -File `"$debloatScriptPath`" $arguments" -Verb RunAs
|
|
|
|
# Wait for the process to finish before continuing
|
|
if ($null -ne $debloatProcess) {
|
|
$debloatProcess.WaitForExit()
|
|
}
|
|
|
|
# Remove all remaining script files, except for CustomAppsList and LastUsedSettings.json files
|
|
if (Test-Path $tempWorkPath) {
|
|
Write-Output ""
|
|
Write-Output "> Cleaning up..."
|
|
|
|
# Cleanup, remove Win11Debloat directory
|
|
Get-ChildItem -Path $tempWorkPath -Exclude CustomAppsList,LastUsedSettings.json,Win11Debloat.log,Win11Debloat-Run.log,Config,Logs,Backups | Remove-Item -Recurse -Force
|
|
}
|
|
|
|
Write-Output ""
|