WinGet-Upgrade-Workaround
Auf dieser Seite
Wann wird dieser Workaround benötigt?
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.
Es handelt sich um einen Workaround. Dieser sollte nur für Apps eingesetzt werden, bei denen ein reguläres Upgrade bekanntermaßen fehlschlägt. Eine erzwungene Installation überschreibt die vorhandenen Paketdateien und kann andere Installationsprobleme verdecken.
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).
$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.