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 mit der Geräteaktion PowerShell-Skript ausführen auf Geräten ausgeführt werden.
Skript
Das Skript wird unter Skripte → Skripte über Hinzufügen als PowerShell-Skript angelegt und anschließend mit der Geräteaktion PowerShell-Skript ausführen oder in der Skriptliste über Auf Gerät ausführen auf Geräten ausgeführt. Die Ausführung erfolgt über den Windows Companion im Gerätekontext (SYSTEM). Im Skript muss am Anfang die Variable $AppIdentifier auf den exakten WinGet-Bezeichner der zu reparierenden App gesetzt werden (z. B. Nextcloud.NextcloudDesktop).
Alternativ lässt sich der Bezeichner im Feld Argumente übergeben (z. B. $AppIdentifier='Nextcloud.NextcloudDesktop'), sodass ein Skript für mehrere Apps genutzt werden kann. In diesem Fall muss die erste Zeile des Skripts entfernt werden, da sie den übergebenen Wert sonst überschreibt.
Für Skripte ist standardmäßig eine Zeitüberschreitung (in Minuten) von 5 Minuten hinterlegt. Da Upgrade und erzwungene Installation großer Apps länger dauern können, sollte der Wert beim Anlegen des Skripts oder in der Aktion entsprechend erhöht werden (höchstens 30 Minuten).
Vollständiges Skript 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.
Ausführungsstatus sowie Ergebnis- und Fehlerausgabe des Skripts (z. B. die Meldungen von Write-Host) sind in der Historie des Skripts unter Skripte → Skripte einsehbar (Ergebnisausgabe anzeigen, Fehlerausgabe anzeigen).
Soll die Reparatur regelmäßig laufen, lässt sich das Skript auch über die Richtlinienkonfiguration Windows Skript Konfiguration → zeit- oder ereignisgesteuert ausführen.