WinGet-Upgrade-Workaround
Auf dieser Seite
Manche WinGet-Apps lassen sich mit winget upgrade nicht aktualisieren, obwohl im Relution-AppStore bereits eine neuere Version eingetragen ist. Ursache ist fast immer ein defektes Manifest auf WinGet-Seite — das Upgrade bricht dann mit no applicable upgrade, package not found, no applicable installer found oder einem verwandten Fehler ab.
Microsofts eigener Workaround ist, die App mit dem Schalter --force erneut zu installieren. Das folgende Skript automatisiert diese Recovery für eine einzelne WinGet-App und kann über eine Relution Skript-Aktion auf Geräte ausgerollt werden.
Skript
Das Skript kann in Relution angelegt werden und per Skript-Aktion auf einem Gerät ausgeführt werden. Im Skript muss am Anfang die Variable $AppIdentifier auf den exakten WinGet-Bezeichner der zu reparierenden App gesetzt werden (z. B. Nextcloud.NextcloudDesktop).
Vollständiges Konfigurationsbeispiel anzeigen
$AppIdentifier = 'Muss ersetzt werden'
# 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
Funktionsweise
- Das Skript sucht
winget.exeunterhalb vonC:\Program Files\WindowsApps\Microsoft.DesktopAppInstaller_*— das ist die Installation, die der Windows Companion im System-Kontext verwendet. - Mit
winget list --id <AppIdentifier> --exactwird geprüft, ob die App auf dem Gerät installiert ist. Wenn nicht, wird das Skript ohne weitere Aktion beendet. - Es wird
winget upgrade --id <AppIdentifier> --exactmit den von Relution vorgeschriebenen Silent-Parametern → aufgerufen. Die Parameter werden mit@SilentFlagsgesplattet, damit PowerShell jedes Element als eigenes Argument übergibt — sonst werden sie von WinGet nicht korrekt geparst. Ist das Upgrade erfolgreich, endet das Skript. - Wenn das Upgrade mit einem der erkannten Fehlercodes endet, wiederholt das Skript den Aufruf als
winget install --id <AppIdentifier> --exact --forcemit den gleichen Silent-Parametern. Die erkannten Codes sind:-1978335189—no applicable upgrade-1978335215—package not found-1978335192—no applicable installer found-1978335216— in der Praxis beobachteter Manifest-/Installer-Fehler
- Alle übrigen WinGet-Exit-Codes werden unverändert durchgereicht.
Die Erkennung erfolgt ausschließlich über die Exit-Codes von WinGet. Die Textausgabe wäre abhängig von der Sprache des Geräts und würde auf englischen und deutschen Windows-Installationen unterschiedlich ausfallen.