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..0d12c96 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..4b949c2 --- /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 -PassThru | + Should -Not -BeNullOrEmpty + } + } +}