Einleitung
Software kommt und geht. Ein Programm wird für ein Projekt benötigt, später durch eine andere Anwendung ersetzt oder soll aus Sicherheits- beziehungsweise Lizenzgründen von einem System verschwinden.
Traditionell führt der Weg unter Windows über Einstellungen → Apps → Installierte Apps oder über die klassische Systemsteuerung.
Mit Winget geht es deutlich schneller:
winget uninstall --id Mozilla.Firefox --exact
Der Windows Package Manager sucht die entsprechende Installation und ruft den für die Anwendung hinterlegten Deinstallationsmechanismus auf.
Dabei besitzt Winget eine interessante Eigenschaft: Ein Programm muss nicht zwingend ursprünglich über Winget installiert worden sein. Wenn Winget die vorhandene Installation erkennen kann, lässt sie sich häufig trotzdem über winget uninstall entfernen.
Installierte Programme finden
Bevor ein Programm entfernt wird, sollte zunächst ermittelt werden, unter welchem Namen beziehungsweise welcher ID Winget die Anwendung kennt.
Dafür verwenden wir:
winget list
Der Befehl zeigt die von Winget erkannten installierten Anwendungen an.
Bei einem System mit vielen Programmen kann die Ausgabe entsprechend umfangreich sein.
Deshalb kann direkt nach einer Anwendung gesucht werden:
winget list firefox
Oder beispielsweise:
winget list "Visual Studio Code"
Besonders interessant ist die Paket-ID.
Eine Ausgabe könnte beispielsweise sinngemäß enthalten:
Name ID ------------------------------------------- Mozilla Firefox Mozilla.Firefox Microsoft PowerToys Microsoft.PowerToys Visual Studio Code Microsoft.VisualStudioCode
Für automatisierte Prozesse sollte nach Möglichkeit mit dieser eindeutigen ID gearbeitet werden.
Warum die Paket-ID wichtig ist
Grundsätzlich lässt sich ein Programm auch über seinen Namen deinstallieren:
winget uninstall "Mozilla Firefox"
Das funktioniert allerdings nur zuverlässig, wenn die Anwendung eindeutig identifiziert werden kann. Bei mehreren passenden Ergebnissen verlangt Winget eine weitere Eingrenzung.
Für Skripte ist deshalb die ID besser geeignet:
winget uninstall --id Mozilla.Firefox
Noch eindeutiger wird der Befehl mit:
winget uninstall --id Mozilla.Firefox --exact
Die Option --exact, kurz -e, verlangt eine exakte Übereinstimmung anstelle einer Teilübereinstimmung.
Für administrative Skripte empfiehlt sich deshalb grundsätzlich das Schema:
winget uninstall --id <Paket-ID> --exact
Software nach Namen deinstallieren
Natürlich muss nicht zwingend die Paket-ID verwendet werden.
Eine Deinstallation kann auch anhand des Namens erfolgen:
winget uninstall --name "Mozilla Firefox"
Oder als einfache Suchabfrage:
winget uninstall firefox
Gerade bei manueller Nutzung ist das bequem.
Wenn Winget jedoch mehrere passende Anwendungen findet, kann keine eindeutige Deinstallation erfolgen.
Deshalb gilt:
Manuelle Verwendung: Name häufig ausreichend.
Automatisierung: ID und --exact bevorzugen.
Aliase für uninstall
Für uninstall existieren zwei praktische Kurzformen:
winget remove
und:
winget rm
Microsoft führt beide offiziell als Aliase von uninstall.
Damit funktioniert beispielsweise auch:
winget remove --id Mozilla.Firefox --exact
Für Skripte würde ich trotzdem die ausgeschriebene Variante bevorzugen:
winget uninstall
Sie ist beim späteren Lesen eines Skripts sofort verständlich.
Mehrere Programme deinstallieren
Aktuelle Winget-Versionen können mehrere Anwendungen innerhalb eines einzigen Aufrufs entfernen.
Microsoft nennt beispielsweise:
winget uninstall Microsoft.NuGet Microsoft.Edit
Winget verarbeitet dabei mehrere Paketangaben innerhalb des Deinstallationsvorgangs.
Das kann beispielsweise bei der Bereinigung eines Rechners hilfreich sein.
Ein weiteres Beispiel:
winget uninstall Microsoft.PowerToys Microsoft.VisualStudioCode
Bei produktiven Skripten sollte allerdings sorgfältig geprüft werden, ob alle angegebenen Pakete tatsächlich eindeutig identifiziert werden.
Alternative: Mehrere Programme per PowerShell entfernen
Für komplexere Automatisierungen ist PowerShell oft flexibler.
Beispielsweise:
$Apps = @(
"Mozilla.Firefox",
"Microsoft.PowerToys",
"Microsoft.VisualStudioCode"
)
foreach ($App in $Apps) {
winget uninstall --id $App --exact
}
Der Vorteil dieser Variante liegt darin, dass die Paketliste sehr einfach erweitert werden kann.
Außerdem können später zusätzliche Funktionen ergänzt werden, beispielsweise:
- Logging
- Fehlerbehandlung
- Exitcodes
- Ausschlusslisten
- Protokollierung
- Benachrichtigungen
Damit eignet sich diese Methode besonders für Administratoren.
Stille Deinstallation
Für automatisierte Prozesse soll normalerweise kein Deinstallationsdialog auf dem Bildschirm erscheinen.
Winget unterstützt deshalb:
--silent
beziehungsweise die Kurzform:
-h
Beispiel:
winget uninstall --id Mozilla.Firefox --exact --silent
Winget führt den Uninstaller damit im Silent-Modus aus und unterdrückt dessen Benutzeroberfläche.
Das eignet sich beispielsweise für:
- automatisierte Softwarebereinigung
- Arbeitsplatzmigrationen
- Testsysteme
- virtuelle Maschinen
- standardisierte Clients
- Softwareablösung
Interaktive Deinstallation erzwingen
Das Gegenstück zu --silent ist:
--interactive
beziehungsweise:
-i
Beispiel:
winget uninstall --id Mozilla.Firefox --exact --interactive
Damit wird der Uninstaller ausdrücklich im interaktiven Modus gestartet.
Das ist hilfreich, wenn der Benutzer während der Deinstallation beispielsweise entscheiden soll, ob Einstellungen oder Benutzerdaten erhalten bleiben.
Interaktive Rückfragen von Winget deaktivieren
Für vollständig automatisierte Prozesse existiert zusätzlich:
--disable-interactivity
Ein möglicher Aufruf lautet:
winget uninstall --id Mozilla.Firefox --exact --silent --disable-interactivity
Damit werden interaktive Eingabeaufforderungen des Winget-Clients deaktiviert.
Das ist besonders für geplante Aufgaben oder Deployment-Skripte interessant.
Programme entfernen, die nicht mit Winget installiert wurden
Eine besonders praktische Eigenschaft von Winget wird häufig übersehen:
Winget kann auch Programme deinstallieren, die ursprünglich nicht mit Winget installiert wurden.
Microsoft weist ausdrücklich darauf hin, dass winget list mehr Anwendungen anzeigen kann als diejenigen, die ursprünglich über Winget eingerichtet wurden. Solche Anwendungen können trotzdem mit Winget entfernt werden, sofern die Installation entsprechend erkannt wird.
Das bedeutet beispielsweise:
Eine Anwendung wurde vor Jahren manuell über
setup.exe
installiert.
Winget erkennt sie heute mit:
winget list
Dann kann unter Umständen trotzdem:
winget uninstall --id <ID>
verwendet werden.
Winget wird damit zu einer einheitlichen Schnittstelle für vorhandene Windows-Softwarebestände.
Nach Product Code deinstallieren
Winget unterstützt außerdem die Identifikation über einen Product Code:
winget uninstall --product-code <Product-Code>
Das ist besonders bei MSI-basierten Installationen interessant.
Microsoft führt --product-code als eigenen Filter für die Deinstallation.
Dadurch können Administratoren Anwendungen auch dann gezielt ansprechen, wenn eine Paket-ID nicht die beste Identifikationsmöglichkeit darstellt.
Eine bestimmte Version deinstallieren
Sind mehrere Versionen einer Anwendung vorhanden, kann gezielt eine Version ausgewählt werden:
winget uninstall --name <Programm> --version <Version>
Microsoft dokumentiert beispielsweise die Möglichkeit, eine konkrete Version über --version beziehungsweise -v zu bestimmen. Ohne diese Angabe wird bei mehreren Versionen die höchste Version für die Deinstallation ausgewählt.
Das kann bei Entwicklungswerkzeugen oder parallel installierten Softwareständen hilfreich sein.
Alle Versionen einer Anwendung entfernen
Noch interessanter ist:
--all-versions
beziehungsweise:
--all
Damit können alle erkannten Versionen eines Programms entfernt werden.
Schematisch:
winget uninstall --id <Paket-ID> --all-versions
Das sollte selbstverständlich mit besonderer Vorsicht eingesetzt werden.
User- und Machine-Installationen unterscheiden
Eine Anwendung kann nur für einen Benutzer oder systemweit installiert sein.
Winget bietet dafür den Filter:
--scope
mit den Bereichen:
user machine
Beispielsweise:
winget uninstall --id <Paket-ID> --scope user
oder:
winget uninstall --id <Paket-ID> --scope machine
Damit lässt sich die Deinstallation auf den entsprechenden Installationsbereich beschränken.
Gerade wenn dieselbe Software in unterschiedlichen Kontexten installiert wurde, kann diese Option sehr hilfreich sein.
Besonderheit: Portable Anwendungen
Winget unterstützt auch portable Pakete.
Bei deren Entfernung existieren zwei interessante Optionen:
--purge
und:
--preserve
--purge löscht bei einem portablen Paket sämtliche Dateien und Verzeichnisse innerhalb des Paketverzeichnisses.
--preserve sorgt dagegen dafür, dass dort angelegte Dateien und Verzeichnisse erhalten bleiben.
Damit lässt sich bei portabler Software steuern, wie gründlich aufgeräumt werden soll.
Deinstallation bedeutet nicht automatisch vollständige Bereinigung
Ein wichtiger Punkt wird häufig übersehen.
winget uninstall bedeutet nicht automatisch:
Sämtliche Spuren dieser Anwendung werden vom Computer gelöscht.
Winget startet grundsätzlich den vorgesehenen Deinstallationsmechanismus der jeweiligen Anwendung. Was dieser tatsächlich entfernt, hängt vom Hersteller beziehungsweise Installer ab.
Nach einer Deinstallation können beispielsweise erhalten bleiben:
- Benutzerprofile
- Konfigurationsdateien
- Cache-Dateien
- Logs
- Datenbanken
- Dokumente
- Registry-Einstellungen
- Verzeichnisse unter
%APPDATA% - Verzeichnisse unter
%LOCALAPPDATA%
Das kann durchaus gewollt sein.
Wird die Anwendung später erneut installiert, stehen die bisherigen Einstellungen möglicherweise wieder zur Verfügung.
Benutzerdaten nicht leichtfertig löschen
Gerade bei automatisierten Bereinigungsskripten sollte zwischen Programmdateien und Benutzerdaten unterschieden werden.
Angenommen, eine Anwendung wurde entfernt, besitzt aber weiterhin Daten unter:
C:\Users\<Benutzer>\AppData\
Diese Daten einfach automatisch zu löschen, kann problematisch sein.
Sie könnten enthalten:
- Profile
- Einstellungen
- Projekte
- Datenbanken
- gespeicherte Sitzungen
- Zertifikate
- individuelle Konfigurationen
Eine vollständige Bereinigung sollte deshalb bewusst geplant werden und nicht pauschal Bestandteil jedes Uninstall-Skripts sein.
Besonderheit Microsoft Store
Beim Deinstallieren kann Winget unter Umständen eine Vereinbarung der Microsoft-Store-Quelle anzeigen. Microsoft erklärt, dass dies damit zusammenhängt, wie Winget seine Paketquellen abfragt. Soll bei einem passenden Paket ausschließlich die Winget-Quelle verwendet werden, kann die Abfrage beispielsweise mit --source winget eingeschränkt werden.
Beispiel:
winget uninstall --id Mozilla.Firefox --exact --source winget
Alternativ existiert:
--accept-source-agreements
um Vereinbarungen der Paketquelle zu akzeptieren.
Typischer Fehler: Mehrere Treffer
Ein häufiger Fehler entsteht, wenn der angegebene Name nicht eindeutig ist.
Beispielsweise:
winget uninstall python
Auf einem Entwicklerrechner könnten mehrere Python-Komponenten oder Versionen vorhanden sein.
Winget kann dann mehrere Treffer anzeigen.
Die Lösung:
winget list python
Anschließend die korrekte ID auswählen und eindeutig deinstallieren:
winget uninstall --id <Paket-ID> --exact
Typischer Fehler: Programm wird nicht gefunden
Meldet Winget, dass keine passende Anwendung gefunden wurde, sollte zunächst geprüft werden:
winget list
Anschließend kann gezielter gesucht werden:
winget list <Suchbegriff>
Mögliche Ursachen sind:
- anderer Anzeigename
- andere Paket-ID
- unterschiedliche Installation für Benutzer und Computer
- beschädigte Installation
- nicht korrekt registrierter Uninstaller
- Software wurde bereits entfernt
Typischer Fehler: Administratorrechte fehlen
Systemweit installierte Programme benötigen für die Deinstallation häufig erhöhte Rechte.
Schlägt die Deinstallation aufgrund fehlender Berechtigungen fehl, sollte Windows Terminal beziehungsweise PowerShell mit entsprechenden Administratorrechten gestartet werden.
Bei automatisierten Skripten muss ebenfalls berücksichtigt werden, in welchem Sicherheitskontext das Skript ausgeführt wird.
Typischer Fehler: Programm läuft noch
Viele Anwendungen können nicht vollständig entfernt werden, solange zugehörige Prozesse laufen.
Typische Beispiele sind:
- Browser
- Editoren
- Kommunikationsprogramme
- Datenbanken
- Hintergrunddienste
- Systemwerkzeuge
Je nach Uninstaller wird die Anwendung automatisch beendet, eine Rückfrage angezeigt oder die Deinstallation abgebrochen.
Bei Silent-Deinstallationen sollte dieses Verhalten deshalb unbedingt getestet werden.
Typischer Fehler: Silent funktioniert nicht wie erwartet
Winget kann den Silent-Modus anfordern:
winget uninstall --id <Paket-ID> --exact --silent
Die eigentliche Deinstallation wird jedoch weiterhin vom Uninstaller der Anwendung durchgeführt.
Das bedeutet:
Winget vereinheitlicht den Aufruf, aber nicht jeden Drittanbieter-Uninstaller.
Unterschiedliche Hersteller können sich unterschiedlich verhalten.
Vor einem unternehmensweiten Rollout sollte eine Silent-Deinstallation deshalb immer getestet werden.
Fehler protokollieren
Winget kann die Ausgabe des Deinstallationsvorgangs in eine Logdatei schreiben:
winget uninstall --id <Paket-ID> --log "C:\Logs\uninstall.log"
Außerdem stehen unter anderem:
--open-logs
und:
--verbose-logs
zur Verfügung.
Bei Problemen kann beispielsweise ausgeführt werden:
winget uninstall --id <Paket-ID> --exact --verbose-logs
Gerade bei automatisierten Deployments ist Logging ausgesprochen empfehlenswert.
Vorsicht mit --force
Winget besitzt auch bei der Deinstallation:
--force
Damit kann der Vorgang trotz bestimmter nicht sicherheitsrelevanter Probleme fortgesetzt werden.
Diese Option sollte nicht standardmäßig Bestandteil eines Administrationsskripts sein.
Wenn eine normale Deinstallation fehlschlägt, sollte zunächst untersucht werden, warum sie fehlschlägt.
Praktisches Beispiel: Firefox entfernen
Zunächst prüfen:
winget list firefox
Anschließend:
winget uninstall --id Mozilla.Firefox --exact
Für eine stille Deinstallation:
winget uninstall --id Mozilla.Firefox --exact --silent
Danach kann überprüft werden:
winget list firefox
Praktisches Beispiel: PowerToys entfernen
Installation suchen:
winget list PowerToys
Anschließend eindeutig entfernen:
winget uninstall --id Microsoft.PowerToys --exact
Automatisiert:
winget uninstall --id Microsoft.PowerToys --exact --silent --disable-interactivity
Praktisches Beispiel: Visual Studio Code entfernen
Zunächst:
winget list "Visual Studio Code"
Danach:
winget uninstall --id Microsoft.VisualStudioCode --exact
Auch hier kann für automatisierte Prozesse ergänzt werden:
winget uninstall --id Microsoft.VisualStudioCode --exact --silent
PowerShell-Skript für mehrere Anwendungen
Für größere Bereinigungsaktionen bietet sich ein PowerShell-Skript an:
$Apps = @(
"Mozilla.Firefox",
"Microsoft.PowerToys",
"Microsoft.VisualStudioCode"
)
foreach ($App in $Apps) {
Write-Host "Deinstalliere $App ..."
winget uninstall `
--id $App `
--exact `
--silent `
--disable-interactivity
if ($LASTEXITCODE -eq 0) {
Write-Host "$App erfolgreich verarbeitet."
}
else {
Write-Warning "Fehler bei $App. Exitcode: $LASTEXITCODE"
}
}
Damit erhalten wir bereits eine einfache Grundlage für eine automatisierte Softwarebereinigung.
Für den produktiven Einsatz sollte das Skript zusätzlich um Logging und eine differenzierte Behandlung der Winget- beziehungsweise Installer-Exitcodes erweitert werden.
Vorher prüfen, nachher kontrollieren
Für administrative Deinstallationen empfiehlt sich ein einfacher Ablauf:
winget list
↓
Anwendung identifizieren
↓
Paket-ID prüfen
↓
Deinstallation testen
↓
Silent-Modus testen
↓
Deinstallation durchführen
↓
winget list
↓
Ergebnis kontrollieren
Damit wird verhindert, dass versehentlich eine falsche oder ähnlich benannte Anwendung entfernt wird.
Winget als Werkzeug für Softwarebereinigung
Die Deinstallationsfunktion eröffnet einige interessante Einsatzmöglichkeiten.
Ein Unternehmen könnte beispielsweise definieren, welche Software auf einem Standardarbeitsplatz nicht vorhanden sein darf.
Ein PowerShell-Skript prüft anschließend regelmäßig, ob diese Programme installiert sind, und entfernt sie gegebenenfalls.
Ebenso lassen sich Migrationen unterstützen:
Alte Anwendung
↓
Daten sichern
↓
winget uninstall
↓
Neue Anwendung installieren
↓
Daten übernehmen
Winget kann damit nicht nur bei der Bereitstellung, sondern auch beim gesamten Lebenszyklus einer Anwendung helfen.
Die wichtigsten Befehle
Installierte Programme anzeigen:
winget list
Nach einer installierten Anwendung suchen:
winget list <Suchbegriff>
Nach ID deinstallieren:
winget uninstall --id <Paket-ID> --exact
Silent deinstallieren:
winget uninstall --id <Paket-ID> --exact --silent
Interaktive Rückfragen deaktivieren:
winget uninstall --id <Paket-ID> --exact --silent --disable-interactivity
Bestimmte Version entfernen:
winget uninstall --id <Paket-ID> --version <Version>
Alle Versionen entfernen:
winget uninstall --id <Paket-ID> --all-versions
Nur Benutzerinstallation berücksichtigen:
winget uninstall --id <Paket-ID> --scope user
Nur systemweite Installation berücksichtigen:
winget uninstall --id <Paket-ID> --scope machine
Und die vollständige Hilfe erhalten Sie jederzeit über:
winget uninstall --help
Best Practices
Für die tägliche Administration lassen sich einige einfache Regeln ableiten:
- Vorher immer
winget listverwenden. So sehen Sie, wie Winget die Anwendung tatsächlich erkennt. - In Skripten mit Paket-IDs arbeiten. Namen können sich ändern oder mehrdeutig sein.
--exactverwenden. Dadurch wird die Auswahl zusätzlich präzisiert.- Silent-Deinstallationen vorher testen. Nicht jeder Hersteller-Uninstaller verhält sich identisch.
- Benutzerdaten nicht automatisch löschen. Eine Deinstallation und eine vollständige Datenbereinigung sind zwei unterschiedliche Vorgänge.
- Logging aktivieren. Besonders bei mehreren Systemen muss nachvollziehbar bleiben, was passiert ist.
--forcenur gezielt einsetzen. Fehler sollten nicht einfach übergangen werden.- Nach der Deinstallation kontrollieren. Mit
winget listlässt sich schnell überprüfen, ob die Anwendung tatsächlich verschwunden ist.
Winget deckt auch die Deinstallation von Windows-Software erstaunlich umfassend ab. Für eine einfache Entfernung genügt bereits:
winget uninstall --id <Paket-ID> --exact
Mit --silent und --disable-interactivity lässt sich daraus ein automatisierbarer Vorgang machen. Mehrere Anwendungen können in einem Aufruf oder über PowerShell-Schleifen verarbeitet werden. Zusätzlich lassen sich bestimmte Versionen, Benutzer- beziehungsweise Computerinstallationen und sogar Product Codes gezielt auswählen.
Besonders praktisch ist, dass Winget nicht ausschließlich auf Anwendungen beschränkt ist, die zuvor mit winget install eingerichtet wurden. Erkennt Windows Package Manager eine bestehende Installation und deren Deinstallationsinformationen, kann Winget häufig auch diese Anwendung entfernen.
Dennoch ist winget uninstall kein universeller Systemreiniger. Die eigentliche Entfernung wird weiterhin durch den jeweiligen Uninstaller bestimmt. Benutzerdaten, Konfigurationsdateien und andere Überreste können bewusst erhalten bleiben.
Damit beherrscht Winget nach Installation und Aktualisierung nun auch den dritten wichtigen Abschnitt des Softwarelebenszyklus: die kontrollierte Entfernung von Anwendungen.