Public/Remove-MSIXDependencies.ps1

function Remove-MSIXDependencies {
<#
.SYNOPSIS
    Removes PackageDependency entries from an MSIX manifest. TargetDeviceFamily
    is never touched.
.PARAMETER MSIXFolderPath
    Expanded MSIX package folder. Pipeline by property name.
.PARAMETER Name
    Name of a specific PackageDependency. Omit to remove all.
.EXAMPLE
    Get-MSIXDependencies -MSIXFolder $pkg | Where-Object Name -like '*WindowsAppRuntime*' | Remove-MSIXDependencies
.NOTES
    Andreas Nick, 2026
#>

    [CmdletBinding(SupportsShouldProcess = $true)]
    param(
        [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true, Position = 0)]
        [System.IO.DirectoryInfo] $MSIXFolderPath,

        [Parameter(ValueFromPipelineByPropertyName = $true, Position = 1)]
        [string] $Name
    )

    begin {
        # Keyed by resolved folder path -> list of dependency names to remove (empty = all)
        $pending = @{}
    }

    process {
        $key = $MSIXFolderPath.FullName
        if (-not $pending.ContainsKey($key)) {
            $pending[$key] = [System.Collections.Generic.List[string]]::new()
        }
        if (-not [string]::IsNullOrEmpty($Name)) {
            $pending[$key].Add($Name)
        }
    }

    end {
        foreach ($folder in $pending.Keys) {
            $manifestPath = Join-Path $folder 'AppxManifest.xml'
            if (-not (Test-Path $manifestPath)) {
                Write-Warning "AppxManifest.xml not found in '$folder' - skipping."
                continue
            }

            $manifest = New-Object System.Xml.XmlDocument
            $manifest.PreserveWhitespace = $false
            $manifest.Load($manifestPath)

            $nsmgr = New-Object System.Xml.XmlNamespaceManager($manifest.NameTable)
            $AppXNamespaces.GetEnumerator() | ForEach-Object { $null = $nsmgr.AddNamespace($_.Key, $_.Value) }

            $dependenciesNode = $manifest.SelectSingleNode('//ns:Package/ns:Dependencies', $nsmgr)
            if ($null -eq $dependenciesNode) {
                Write-Warning "No <Dependencies> section in '$folder' - nothing to do."
                continue
            }

            $targetNames = $pending[$folder]   # empty list = remove all PackageDependency entries
            $removedAny  = $false

            foreach ($dep in @($dependenciesNode.SelectNodes('ns:PackageDependency', $nsmgr))) {
                $depName = $dep.GetAttribute('Name')

                if ($targetNames.Count -gt 0 -and $targetNames -notcontains $depName) {
                    continue
                }

                if (-not $PSCmdlet.ShouldProcess($folder, "Remove PackageDependency '$depName'")) {
                    continue
                }

                $null = $dependenciesNode.RemoveChild($dep)
                $removedAny = $true
                Write-Verbose "Removed PackageDependency '$depName'."
            }

            if ($removedAny) {
                $manifest.Save($manifestPath)
                Write-Verbose "Saved $manifestPath"
            }
            else {
                Write-Warning "No matching PackageDependency found in '$folder'."
            }
        }
    }
}