Solution de contournement WinGet Upgrade

Quand l’utiliser

Certaines applications WinGet ne peuvent pas être mises à jour par winget upgrade, bien qu’une version plus récente soit listée dans le magasin d’applications Relution. La cause est presque toujours un manifeste défectueux côté WinGet — la commande de mise à jour échoue alors avec no applicable upgrade, package not found, no applicable installer found ou une erreur apparentée.

La solution de contournement proposée par Microsoft consiste à réinstaller l’application avec le drapeau --force. Le script ci-dessous automatise cette récupération pour une application WinGet unique et peut être distribué aux appareils via un script de magasin Relution ou une action de script.

Il s’agit d’une solution de contournement. Utilisez-la uniquement pour les applications dont la mise à jour normale est connue pour échouer. Une installation forcée remplace les fichiers de paquet existants et peut masquer d’autres problèmes d’installation.

Script

Le script peut être créé dans Relution et exécuté sur un appareil via une action de script. Au début du script, la variable $AppIdentifier doit être définie sur l’identifiant WinGet exact de l’application à réparer (par exemple Nextcloud.NextcloudDesktop).

$AppIdentifier = 'À remplacer'

# Silent flags required by Relution (Companion runs as SYSTEM, no UI)
$SilentFlags = @(
    '--silent',
    '--disable-interactivity',
    '--accept-package-agreements',
    '--accept-source-agreements'
)

# Resolve winget.exe for SYSTEM context (DesktopAppInstaller package)
$winget = Resolve-Path 'C:\Program Files\WindowsApps\Microsoft.DesktopAppInstaller_*\winget.exe' -ErrorAction SilentlyContinue |
    Select-Object -First 1 -ExpandProperty Path

if (-not $winget) {
    Write-Error 'winget.exe not found in System context.'
    exit 1
}

Write-Host "Using winget at: $winget"

# 1. Check if the app is installed
& $winget list --id $AppIdentifier --exact --accept-source-agreements --disable-interactivity | Out-Null
if ($LASTEXITCODE -ne 0) {
    Write-Host "$AppIdentifier is not installed - nothing to do."
    exit 0
}

# 2. Try the upgrade
& $winget upgrade --id $AppIdentifier --exact @SilentFlags
$code = $LASTEXITCODE

if ($code -eq 0) {
    Write-Host "Upgrade completed successfully."
    exit 0
}

Write-Warning "Upgrade failed with exit code $code."

# 3. Fallback for broken manifests / no applicable installer / package not found
$FallbackCodes = @(
    -1978335189,  # no applicable upgrade
    -1978335215,  # package not found
    -1978335192,  # no applicable installer found
    -1978335216   # manifest / installer failure observed in practice
)

if ($code -in $FallbackCodes) {
    Write-Warning "Retrying as 'install --force'..."
    & $winget install --id $AppIdentifier --exact --force @SilentFlags
    exit $LASTEXITCODE
}

exit $code

Fonctionnement

  1. Le script recherche winget.exe dans C:\Program Files\WindowsApps\Microsoft.DesktopAppInstaller_* — l’installation utilisée par le Windows Companion dans le contexte système.
  2. Il appelle winget list --id <AppIdentifier> --exact pour vérifier si l’application est déjà installée. Si ce n’est pas le cas, le script se termine sans rien faire.
  3. Il appelle winget upgrade --id <AppIdentifier> --exact avec les paramètres silencieux obligatoires de Relution. Les paramètres sont étalés avec @SilentFlags afin que PowerShell transmette chaque élément comme argument distinct — nécessaire pour que WinGet les analyse correctement. Si la mise à jour réussit, le script se termine.
  4. Si la mise à jour se termine avec l’un des codes d’erreur WinGet récupérables, le script réessaie en tant que winget install --id <AppIdentifier> --exact --force avec les mêmes paramètres silencieux. Les codes reconnus sont :
    • -1978335189no applicable upgrade
    • -1978335215package not found
    • -1978335192no applicable installer found
    • -1978335216 — erreur de manifeste/installeur observée en pratique
  5. Tout autre code de sortie WinGet est transmis tel quel.