From 27b0a59abb0d12fdc022b1698e1ca0ee2c490b37 Mon Sep 17 00:00:00 2001 From: Chris Titus Date: Tue, 10 Feb 2026 13:37:37 -0600 Subject: [PATCH] Zeus-toggle-fix (#4017) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix Get Installed toggle detection and multiple config bugs Fixes the issue where "Get Installed" in the Tweaks tab was not correctly pulling all toggle states, plus several additional config bugs discovered during investigation. Changes: - Unified toggle detection logic using Get-WinUtilToggleStatus - Fixed registry value detection (0 values were incorrectly treated as missing) - Added DefaultState support for missing registry keys - Fixed WPFTweaksUTC registry type (QWord → DWord) - Fixed WPFTweaksServices startup types (TermService, VaultSvc: Automatic → Manual) - Fixed duplicate order collisions in tweaks - Fixed FFmpeg display name - Improved OneDrive removal script reliability - Improved Copilot removal script with wildcard pattern and null check - Fixed code formatting (added spaces after if/Foreach statements) Files changed: - functions/private/Invoke-WinUtilCurrentSystem.ps1 - functions/private/Get-WinUtilToggleStatus.ps1 - config/tweaks.json - config/applications.json Fixes #3762 Fixes #3189 Fixes #3876 Potentially fixes #3008 Potentially fixes #3815 * Fix toggles --------- Co-authored-by: Akhil Achanta --- config/applications.json | 2 +- config/tweaks.json | 15 ++-- functions/private/Get-WinUtilToggleStatus.ps1 | 2 +- .../private/Invoke-WinUtilCurrentSystem.ps1 | 78 +++++++++++++------ 4 files changed, 64 insertions(+), 33 deletions(-) diff --git a/config/applications.json b/config/applications.json index b43b7be1..59bf5f1e 100644 --- a/config/applications.json +++ b/config/applications.json @@ -555,7 +555,7 @@ "ffmpeg": { "category": "Utilities", "choco": "na", - "content": "eibol.FFmpegBatchAVConverter", + "content": "FFmpeg Batch AV Converter", "description": "FFmpeg Batch AV Converter is a universal audio and video encoder, that allows to use the full potential of ffmpeg command line with a few mouse clicks in a convenient GUI with drag and drop, progress information.", "link": "https://ffmpeg-batch.sourceforge.io/", "winget": "eibol.FFmpegBatchAVConverter" diff --git a/config/tweaks.json b/config/tweaks.json index c35c1240..c49e32b1 100644 --- a/config/tweaks.json +++ b/config/tweaks.json @@ -665,7 +665,7 @@ }, { "Name": "TermService", - "StartupType": "Automatic", + "StartupType": "Manual", "OriginalType": "Manual" }, { @@ -725,7 +725,7 @@ }, { "Name": "VaultSvc", - "StartupType": "Automatic", + "StartupType": "Manual", "OriginalType": "Manual" }, { @@ -2043,11 +2043,12 @@ Get-AppxPackage -AllUsers *Copilot* | Remove-AppxPackage -AllUsers Get-AppxPackage -AllUsers Microsoft.MicrosoftOfficeHub | Remove-AppxPackage -AllUsers - $Appx = (Get-AppxPackage MicrosoftWindows.Client.CoreAI).PackageFullName - $Sid = (Get-LocalUser $Env:UserName).Sid.Value - - New-Item \"HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Appx\\AppxAllUserStore\\EndOfLife\\$Sid\\$Appx\" -Force - Remove-AppxPackage $Appx + $Appx = (Get-AppxPackage *MicrosoftWindows.Client.CoreAI*).PackageFullName + if ($Appx) { + $Sid = (Get-LocalUser $Env:UserName).Sid.Value + New-Item \"HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Appx\\AppxAllUserStore\\EndOfLife\\$Sid\\$Appx\" -Force + Remove-AppxPackage $Appx + } " ], "UndoScript": [ diff --git a/functions/private/Get-WinUtilToggleStatus.ps1 b/functions/private/Get-WinUtilToggleStatus.ps1 index a19dbf9b..135754fb 100644 --- a/functions/private/Get-WinUtilToggleStatus.ps1 +++ b/functions/private/Get-WinUtilToggleStatus.ps1 @@ -45,7 +45,7 @@ Function Get-WinUtilToggleStatus { } else { Write-Debug "$($regentry.Name) is false (state: $regstate, value: $($regentry.Value), original: $($regentry.OriginalValue))" } - if (!$regstate) { + if ($null -eq $regstate) { switch ($regentry.DefaultState) { "true" { $regstate = $regentry.Value diff --git a/functions/private/Invoke-WinUtilCurrentSystem.ps1 b/functions/private/Invoke-WinUtilCurrentSystem.ps1 index fe4778cb..823adca4 100644 --- a/functions/private/Invoke-WinUtilCurrentSystem.ps1 +++ b/functions/private/Invoke-WinUtilCurrentSystem.ps1 @@ -41,47 +41,73 @@ Function Invoke-WinUtilCurrentSystem { } } - if($CheckBox -eq "tweaks") { + if ($CheckBox -eq "tweaks") { - if(!(Test-Path 'HKU:\')) {$null = (New-PSDrive -PSProvider Registry -Name HKU -Root HKEY_USERS)} + if (!(Test-Path 'HKU:\')) {$null = (New-PSDrive -PSProvider Registry -Name HKU -Root HKEY_USERS)} $ScheduledTasks = Get-ScheduledTask $sync.configs.tweaks | Get-Member -MemberType NoteProperty | ForEach-Object { $Config = $psitem.Name #WPFEssTweaksTele - $registryKeys = $sync.configs.tweaks.$Config.registry - $scheduledtaskKeys = $sync.configs.tweaks.$Config.scheduledtask - $serviceKeys = $sync.configs.tweaks.$Config.service + $entry = $sync.configs.tweaks.$Config + $registryKeys = $entry.registry + $scheduledtaskKeys = $entry.scheduledtask + $serviceKeys = $entry.service + $appxKeys = $entry.appx + $invokeScript = $entry.InvokeScript + $entryType = $entry.Type - if($registryKeys -or $scheduledtaskKeys -or $serviceKeys) { + if ($registryKeys -or $scheduledtaskKeys -or $serviceKeys) { $Values = @() + if ($entryType -eq "Toggle") { + if (-not (Get-WinUtilToggleStatus $Config)) { + $values += $False + } + } else { + $registryMatchCount = 0 + $registryTotal = 0 - Foreach ($tweaks in $registryKeys) { - Foreach($tweak in $tweaks) { + Foreach ($tweaks in $registryKeys) { + Foreach ($tweak in $tweaks) { + $registryTotal++ + $regstate = $null - if(test-path $tweak.Path) { - $actualValue = Get-ItemProperty -Name $tweak.Name -Path $tweak.Path -ErrorAction SilentlyContinue | Select-Object -ExpandProperty $($tweak.Name) - $expectedValue = $tweak.Value - if ($expectedValue -eq "") { - if ($null -ne $actualValue) { - $values += $False - } - } elseif ($expectedValue -notlike $actualValue) { - $values += $False + if (Test-Path $tweak.Path) { + $regstate = Get-ItemProperty -Name $tweak.Name -Path $tweak.Path -ErrorAction SilentlyContinue | Select-Object -ExpandProperty $($tweak.Name) + } + + if ($null -eq $regstate) { + switch ($tweak.DefaultState) { + "true" { + $regstate = $tweak.Value + } + "false" { + $regstate = $tweak.OriginalValue + } + default { + $regstate = $tweak.OriginalValue + } + } + } + + if ($regstate -eq $tweak.Value) { + $registryMatchCount++ } - } else { - $values += $False } } + + if ($registryTotal -gt 0 -and $registryMatchCount -ne $registryTotal) { + $values += $False + } } Foreach ($tweaks in $scheduledtaskKeys) { - Foreach($tweak in $tweaks) { + Foreach ($tweak in $tweaks) { $task = $ScheduledTasks | Where-Object {$($psitem.TaskPath + $psitem.TaskName) -like "\$($tweak.name)"} - if($task) { + if ($task) { $actualValue = $task.State $expectedValue = $tweak.State if ($expectedValue -ne $actualValue) { @@ -92,10 +118,10 @@ Function Invoke-WinUtilCurrentSystem { } Foreach ($tweaks in $serviceKeys) { - Foreach($tweak in $tweaks) { + Foreach ($tweak in $tweaks) { $Service = Get-Service -Name $tweak.Name - if($Service) { + if ($Service) { $actualValue = $Service.StartType $expectedValue = $tweak.StartupType if ($expectedValue -ne $actualValue) { @@ -105,9 +131,13 @@ Function Invoke-WinUtilCurrentSystem { } } - if($values -notcontains $false) { + if ($values -notcontains $false) { Write-Output $Config } + } else { + if ($invokeScript -or $appxKeys) { + Write-Debug "Skipping $Config in Get Installed: no detectable registry, scheduled task, or service state." + } } } }