mirror of
https://github.com/ChrisTitusTech/winutil.git
synced 2026-08-10 18:11:16 +10:00
fix: resolve silent failures in AppX removal and PS7 DISM bugs (#4822)
* fix: resolve silent failures in AppX removal and PS7 DISM bugs
- Fixed a bug where Remove-AppxPackage failed silently in PowerShell 7 due to pipeline binding issues. We now explicitly loop through Get-AppxPackage results and pass PackageFullName directly.
- Added wildcard matching to Get-AppxPackage and Get-AppxProvisionedPackage to reliably locate packages regardless of short name vs family name variations.
- Offloaded Get-AppxProvisionedPackage and Remove-AppxProvisionedPackage execution to Windows PowerShell 5.1 (powershell.exe) to bypass PowerShell 7 DISM COM exceptions ("Class not registered") and performance hangs.
- Deduplicated AppX removal logic by calling Remove-WinUtilAPPX directly from Invoke-WPFAppxRemoval instead of copying the implementation.
* refactor(Remove-WinUtilAPPX): use script block to improve readability
* feat: enhance AppX removal process and add provisioned package removal function
* fix(tests): update AppX removal tests
This also adds tests for the new Remove-WinUtilProvisionedAPPX functionality
* Move AppX removal under Tweaks
* Address AppX removal review feedback
* Complete AppX removal error handling
* Prevent AppX cleanup confirmation prompts
---------
Co-authored-by: Chris Titus <contact@christitus.com>
This commit is contained in:
+23
-1
@@ -134,7 +134,6 @@ Describe "XAML document" {
|
||||
"WPFTab3BT",
|
||||
"WPFTab4BT",
|
||||
"WPFTab5BT",
|
||||
"WPFTab6BT",
|
||||
"SearchBar",
|
||||
"SearchBarClearButton",
|
||||
"appscategory",
|
||||
@@ -148,6 +147,7 @@ Describe "XAML document" {
|
||||
"WPFAdvanced",
|
||||
"WPFClearTweaksSelection",
|
||||
"WPFGetInstalledTweaks",
|
||||
"WPFAppxRemoval",
|
||||
"WPFTweaksbutton",
|
||||
"WPFUndoall",
|
||||
"WPFUpdatesdefault",
|
||||
@@ -157,6 +157,7 @@ Describe "XAML document" {
|
||||
"WPFGetInstalledAppx",
|
||||
"WPFSelectAllAppx",
|
||||
"WPFClearAppxSelection",
|
||||
"WPFBackToTweaks",
|
||||
"WPFRemoveSelectedAppx"
|
||||
)
|
||||
|
||||
@@ -223,6 +224,27 @@ Describe "XAML document" {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
It "opens AppX removal from Tweaks and provides a return path" {
|
||||
$navPanel = $script:xaml.SelectSingleNode('//*[local-name()="StackPanel"][@Name="NavDockPanel"]')
|
||||
$tweaksTab = $script:xaml.SelectSingleNode('//*[local-name()="TabItem"][@Name="WPFTab2"]')
|
||||
$appxTab = $script:xaml.SelectSingleNode('//*[local-name()="TabItem"][@Name="WPFTab6"]')
|
||||
$openButton = $tweaksTab.SelectSingleNode('.//*[local-name()="Button"][@Name="WPFAppxRemoval"]')
|
||||
$buttonNames = @($openButton.ParentNode.SelectNodes('./*[local-name()="Button"]') | ForEach-Object { $_.GetAttribute("Name") })
|
||||
$getInstalledIndex = [array]::IndexOf($buttonNames, "WPFGetInstalledTweaks")
|
||||
$openAppxIndex = [array]::IndexOf($buttonNames, "WPFAppxRemoval")
|
||||
$buttonSource = Get-Content -Path $script:buttonScriptPath -Raw
|
||||
$tabSource = Get-Content -Path (Join-Path $script:functionRoot "public\Invoke-WPFTab.ps1") -Raw
|
||||
|
||||
$navPanel.SelectSingleNode('./*[local-name()="ToggleButton"][@Name="WPFTab6BT"]') | Should -BeNullOrEmpty
|
||||
$openButton.GetAttribute("Content").Trim() | Should -Be "AppX Removal"
|
||||
$openAppxIndex | Should -Be ($getInstalledIndex + 1)
|
||||
$appxTab.SelectSingleNode('.//*[local-name()="Button"][@Name="WPFBackToTweaks"]') | Should -Not -BeNullOrEmpty
|
||||
$appxTab.SelectSingleNode('.//*[local-name()="Button"][@Name="WPFRemoveSelectedAppx"]') | Should -Not -BeNullOrEmpty
|
||||
$buttonSource | Should -Match '"WPFAppxRemoval"\s*\{Invoke-WPFTab "WPFTab6BT"\}'
|
||||
$buttonSource | Should -Match '"WPFBackToTweaks"\s*\{Invoke-WPFTab "WPFTab2BT"\}'
|
||||
$tabSource | Should -Match '\$sync\.\$tabNav\.Items\[\$tabNumber\]\.IsSelected = \$true'
|
||||
}
|
||||
}
|
||||
|
||||
Describe "XAML and sync wiring" {
|
||||
|
||||
Reference in New Issue
Block a user