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 :

powershell
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 :

powershell
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 :

powershell
winget install --id 7zip.7zip --accept-package-agreements --silent --scope machine

Pour Google Chrome :

powershell
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 :

powershell
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 :
powershell
winget uninstall --id NomDuLogiciel
  • Liste des logiciels installés :
powershell
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 🏢.

cedetrick

👤 Présentation personnelle Né en 1970, je suis un passionné d'informatique depuis mon tout premier ZX81. Curieux de nature, j'ai toujours aimé explorer, démonter, comprendre - et parfois même réparer - tout ce qui touche au numérique. Officiellement vintage, j'ai traversé les époques technologiques : du TI99/4A, CPC6128, aux calculatrices HP 48G / GX / 40G et TI92, sans oublier l'arrivée des PCs, que j'ai suivie de près, du i386 jusqu'aux configurations modernes. 💻 Je reste un utilisateur convaincu de Windows, même si je m'essaie régulièrement à Linux pour sortir de ma zone de confort. Le monde Mac ? Disons qu'on ne s'est jamais vraiment croisés. 🎮 Côté consoles, c'est toute une vie de gaming (ou presque) : de l'Atari (avant même qu'il s'appelle 2600) à la SNES, puis les PS1 et PS2 de mon petit frère - que je formais au passage à Doom, Wolfenstein, et aux assemblages Lego sur PC. Aujourd'hui, même si j'ai une PS3, PS4 et Switch, le temps me manque pour vraiment en profiter... mais elles sont là, fidèles, comme un musée interactif prêt à s'allumer ! 🎥📚 Passionné de cinéma, de séries, et de lecture, j'aime aussi simplement découvrir, apprendre et m'émerveiller. Car au fond, ce qui m'anime depuis toujours, c'est cette curiosité insatiable, ce plaisir de creuser un sujet jusqu'à en comprendre les rouages.