Winget : mettre à jour tous vos logiciels Windows en une ligne de commande
🧩 Introduction
Depuis Windows 10, Microsoft a discrètement introduit un gestionnaire de paquets nommé Winget. Comparable à APT sous Linux ou Brew sur macOS, Winget permet d’installer, de mettre à jour ou de supprimer des applications directement depuis une ligne de commande. Pour les utilisateurs avertis ou les administrateurs système, c’est un gain de temps énorme. Mais attention : certaines commandes puissantes, comme winget upgrade –all, nécessitent quelques précautions ⚠️.
📦 Qu’est-ce que Winget ?
Winget est l’outil en ligne de commande de Microsoft pour gérer les logiciels sur Windows :
- Il est intégré à Windows 10/11 (à jour) ou installable via le Microsoft Store.
- Il fonctionne avec PowerShell ou CMD.
- Il s’appuie sur un catalogue officiel d’applications appelé Microsoft Community Package Manifest Repository.
📋 Vérifier si Winget est disponible
Ouvrez PowerShell et tapez :
winget list
Si vous obtenez une liste de logiciels, vous êtes prêt ! Sinon, vous devrez l’installer via le Microsoft Store ou un script spécial si vous êtes sur Windows Server (voir plus bas).
🔄 Mettre à jour tous les logiciels avec winget upgrade –all
Voici LA commande star :
winget upgrade --all --include-unknown
Cette commande met à jour toutes les applications connues, y compris celles non issues du catalogue officiel grâce à l’option –include-unknown.
✅ Avantages :
- Mise à jour de tous les logiciels installés (y compris 7-Zip, Chrome…).
- Automatisation possible dans des scripts d’administration.
- Évite les recherches manuelles de mises à jour.
⚠️ Précautions :
- Évitez avec les produits Autodesk, qui peuvent casser suite à une mise à jour forcée.
- Testez d’abord sur une machine non critique.
- Toujours exécuter en mode administrateur pour un fonctionnement optimal.
🛠️ Installer un logiciel spécifique avec Winget
Vous pouvez installer un logiciel précis en une ligne :
winget install --id 7zip.7zip --accept-package-agreements --silent --scope machine
Pour Google Chrome :
winget install --id Google.Chrome --accept-package-agreements --accept-source-agreements --silent --scope machine
💡 Astuce : utilisez winget search pour trouver l’ID exact d’un paquet.
⚙️ Installer Winget sur Windows Server (2019/2022)
Sur certaines versions de Windows Server, Winget n’est pas disponible par défaut. Voici un script pour l’installer correctement, y compris les prérequis comme NuGet et PowerShellGet :
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Unrestricted -Force Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force Install-Module PowerShellGet -Force Set-PSRepository -InstallationPolicy Trusted -Name PSGallery Install-Script -Name winget-install winget-install
🔧 Ce script installe Winget et ses dépendances même dans des contextes complexes comme un compte SYSTEM ou un environnement serveur.
# Active le protocole TLS 1.2 pour sécuriser les connexions réseau [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 # Autorise temporairement l'exécution de scripts dans cette session Set-ExecutionPolicy -Scope Process -ExecutionPolicy Unrestricted -Force > $null # Fonction pour s'assurer qu'un module est installé et à jour function Ensure-Module { param ( [Parameter(Mandatory)] [string]$ModuleName ) Write-Host "`n[INFO] Vérification du module : $ModuleName" $onlineVersion = (Find-Module $ModuleName -Repository PSGallery).Version $localModule = Get-InstalledModule $ModuleName -ErrorAction SilentlyContinue $localVersion = $localModule?.Version if ($onlineVersion -ne $localVersion) { Write-Host "[ACTION] Installation ou mise à jour de $ModuleName (version $onlineVersion)..." if ($localModule) { Uninstall-Module -Name $ModuleName -Force -ErrorAction SilentlyContinue } Install-Module -Name $ModuleName -Repository PSGallery -Force Import-Module -Name $ModuleName } else { Write-Host "[OK] $ModuleName est à jour (version $localVersion)" } } # Configure la PowerShell Gallery comme source fiable Write-Host "`n[INFO] Configuration de PowerShellGet et NuGet..." Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force Install-Module PowerShellGet -Force Set-PSRepository -Name PSGallery -InstallationPolicy Trusted # Assure que NuGet est prêt Ensure-Module -ModuleName "NuGet" # Installe et exécute le script winget-install Write-Host "`n[INFO] Installation du script 'winget-install'..." Install-Script -Name winget-install -Force Write-Host "[EXEC] Exécution du script 'winget-install'..." winget-install
🧰 Exécution de Winget dans un script ou contexte SYSTEM
Dans des cas automatisés (tâches planifiées, scripts de déploiement…), vous devrez localiser winget.exe manuellement :
🔄 Script : Détection et ajout de Winget au PATH
# Active TLS 1.2 pour les connexions sécurisées si le script est utilisé en ligne [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 # Fonction pour localiser winget.exe, même s’il est dans un chemin "WindowsApps" function Find-WinGet-Path { Write-Host "[INFO] Recherche de winget.exe..." # Chemin où est déployé Winget en tant qu'application AppX (WindowsApps) $WinGetPathToResolve = Join-Path -Path $ENV:ProgramFiles -ChildPath 'WindowsApps\Microsoft.DesktopAppInstaller_*_*__8wekyb3d8bbwe' try { # Résout les versions installées triées par version croissante $ResolveWinGetPath = Resolve-Path -Path $WinGetPathToResolve -ErrorAction Stop | Sort-Object { [version]($_.Path -replace '^[^\d]+_((\d+\.)*\d+)_.*', '$1') } if ($ResolveWinGetPath) { # Utilise la version la plus récente $WinGetPath = $ResolveWinGetPath[-1].Path } } catch { $WinGetPath = $null } # Recherche du chemin utilisateur de winget.exe $WinGetExePath = Get-Command -Name winget.exe -CommandType Application -ErrorAction SilentlyContinue # Sélection du bon chemin if ($WinGetPath -and (Test-Path -Path (Join-Path $WinGetPath 'winget.exe'))) { # Contexte SYSTEM ou installation AppX $WinGet = Join-Path $WinGetPath 'winget.exe' Write-Host "[INFO] Winget trouvé dans le dossier AppX : $WinGet" } elseif ($WinGetExePath) { # Contexte utilisateur $WinGet = $WinGetExePath.Path Write-Host "[INFO] Winget trouvé via le PATH utilisateur : $WinGet" } else { Write-Host "[ERREUR] Winget n’a pas été trouvé sur ce système." exit 1 } # Retourne uniquement le dossier (sans le .exe) return ($WinGet -replace '\\winget.exe$', '') } # Fonction pour ajouter dynamiquement un chemin au PATH de la session PowerShell function Add-PathVariable { param ( [Parameter(Mandatory)] [string]$addPath ) if (Test-Path $addPath) { $escapedPath = [regex]::Escape($addPath) # Filtrer les doublons $cleanPath = $env:Path -split ';' | Where-Object { $_ -notMatch "^$escapedPath\\?" } $env:Path = ($cleanPath + $addPath) -join ';' Write-Host "[OK] Chemin ajouté au PATH : $addPath" } else { Throw "[ERREUR] '$addPath' n’est pas un chemin valide." } } # Ajoute automatiquement le chemin vers winget au PATH de session $wingetFolder = Find-WinGet-Path Add-PathVariable -addPath $wingetFolder
💡 Utile pour les administrateurs qui travaillent en contexte SYSTEM ou sur des VMs non interactives.
🧹 Nettoyage et gestion fine
- Désinstallez proprement un logiciel :
winget uninstall --id NomDuLogiciel
- Liste des logiciels installés :
winget list
🧭 Conclusion : un outil à connaître absolument
Winget n’est plus un simple outil d’expérimentation, c’est une brique essentielle de la gestion moderne de Windows. Il permet un gain de temps énorme, tout en nécessitant une certaine prudence. Utilisé avec rigueur, il peut simplifier grandement l’installation et la mise à jour de vos logiciels, même en entreprise 🏢.