From 9ceaf058430c45cbf5bcadbca80c917516f0f6d3 Mon Sep 17 00:00:00 2001 From: Thomas Nieto <38873752+ThomasNieto@users.noreply.github.com> Date: Sun, 30 Mar 2025 19:43:27 -0500 Subject: [PATCH 1/3] Add Uninstall-Package --- .cspell.jsonc | 1 + src/AnyPackage.Appx.psm1 | 36 +++++++++++++++++++++++++++++++- test/Uninstall-Package.Tests.ps1 | 10 +++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 test/Uninstall-Package.Tests.ps1 diff --git a/.cspell.jsonc b/.cspell.jsonc index 33d684c..43622dd 100644 --- a/.cspell.jsonc +++ b/.cspell.jsonc @@ -5,6 +5,7 @@ "davidanson", "devcontainers", "Nieto", + "Roamable", "runneradmin", "SARIF", "windir" diff --git a/src/AnyPackage.Appx.psm1 b/src/AnyPackage.Appx.psm1 index d3ff135..62a2664 100644 --- a/src/AnyPackage.Appx.psm1 +++ b/src/AnyPackage.Appx.psm1 @@ -9,7 +9,7 @@ using namespace Windows.Management.Deployment using namespace Microsoft.Windows.Appx.PackageManager.Commands [PackageProvider('Appx')] -class AppxProvider : PackageProvider, IGetPackage { +class AppxProvider : PackageProvider, IGetPackage, IUninstallPackage { [string[]] $Members = @() [void] GetPackage([PackageRequest] $request) { @@ -57,6 +57,28 @@ class AppxProvider : PackageProvider, IGetPackage { } } + [void] UninstallPackage([PackageRequest] $request) { + $removeAppxPackageParameters = @{ ErrorAction = 'Stop' } + + if ($request.DynamicParameters.User) { + $removeAppxPackageParameters['User'] = $request.DynamicParameters.User + } + + if ($request.DynamicParameters.PreserveRoamableApplicationData) { + $removeAppxPackageParameters['PreserveRoamableApplicationData'] = $request.DynamicParameters.PreserveRoamableApplicationData + } + + if ($request.DynamicParameters.PreserveApplicationData) { + $removeAppxPackageParameters['PreserveApplicationData'] = $request.DynamicParameters.PreserveApplicationData + } + + Get-Package -Name $request.Name -Provider $request.ProviderInfo | + ForEach-Object { + Remove-AppxPackage -Package $_.Metadata['PackageFullName'] @removeAppxPackageParameters + $request.WritePackage($_) + } + } + [object] GetDynamicParameters([string] $commandName) { return $(switch ($commandName) { 'Get-Package' { return [GetPackageDynamicParameters]::new() } @@ -84,6 +106,18 @@ class GetPackageDynamicParameters { [switch] $AllUsers } +class UninstallPackageDynamicParameters { + [Parameter()] + [ValidateNotNullOrEmpty()] + [string] $User + + [Parameter()] + [switch] $PreserveRoamableApplicationData + + [Parameter()] + [switch] $PreserveApplicationData +} + [guid] $id = '429b9f84-2d16-48bd-aace-f0d6bf5d04e5' [PackageProviderManager]::RegisterProvider($id, [AppxProvider], $MyInvocation.MyCommand.ScriptBlock.Module) diff --git a/test/Uninstall-Package.Tests.ps1 b/test/Uninstall-Package.Tests.ps1 new file mode 100644 index 0000000..8aef366 --- /dev/null +++ b/test/Uninstall-Package.Tests.ps1 @@ -0,0 +1,10 @@ +#Requires -Modules AnyPackage.Appx + +Describe Uninstall-Package { + Context 'with -Name parameter' { + It 'should uninstall Microsoft.WindowsFeedbackHub' { + Uninstall-Package -Name Microsoft.WindowsFeedbackHub | + Should -Not -BeNullOrEmpty + } + } +} From 754cbdabec0a1a6246975484d06c59faec1878c7 Mon Sep 17 00:00:00 2001 From: Thomas Nieto <38873752+ThomasNieto@users.noreply.github.com> Date: Sun, 30 Mar 2025 19:45:44 -0500 Subject: [PATCH 2/3] Add PassThru --- test/Uninstall-Package.Tests.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Uninstall-Package.Tests.ps1 b/test/Uninstall-Package.Tests.ps1 index 8aef366..4b949c2 100644 --- a/test/Uninstall-Package.Tests.ps1 +++ b/test/Uninstall-Package.Tests.ps1 @@ -3,7 +3,7 @@ Describe Uninstall-Package { Context 'with -Name parameter' { It 'should uninstall Microsoft.WindowsFeedbackHub' { - Uninstall-Package -Name Microsoft.WindowsFeedbackHub | + Uninstall-Package -Name Microsoft.WindowsFeedbackHub -PassThru | Should -Not -BeNullOrEmpty } } From a219b944b11a8c247f323315d57ae381fa89b4dc Mon Sep 17 00:00:00 2001 From: Thomas Nieto <38873752+ThomasNieto@users.noreply.github.com> Date: Sun, 30 Mar 2025 19:50:24 -0500 Subject: [PATCH 3/3] Remove trailing whitespace --- src/AnyPackage.Appx.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/AnyPackage.Appx.psm1 b/src/AnyPackage.Appx.psm1 index 62a2664..0d12c96 100644 --- a/src/AnyPackage.Appx.psm1 +++ b/src/AnyPackage.Appx.psm1 @@ -73,7 +73,7 @@ class AppxProvider : PackageProvider, IGetPackage, IUninstallPackage { } Get-Package -Name $request.Name -Provider $request.ProviderInfo | - ForEach-Object { + ForEach-Object { Remove-AppxPackage -Package $_.Metadata['PackageFullName'] @removeAppxPackageParameters $request.WritePackage($_) }