Blog Windows e utilità

Aggiornare tutti i programmi di Windows con un comando, quasi

Due categorie di programmi che winget upgrade --all salta in silenzio, e come usare lo stesso strumento per rimettere i programmi su un PC nuovo.

Un PC nuovo, o una reinstallazione di Windows, finisce sempre nello stesso modo: un paio d’ore a cercare i siti dei programmi, scaricare installatori e premere «Avanti» quindici volte. Nel frattempo, sulla macchina vecchia, mezza dozzina di programmi è rimasta a versioni di due anni prima. Windows ha in casa lo strumento che risolve le due cose insieme, e buona parte di chi lo usa non sa di averlo.

Si chiama winget ed è un gestore di pacchetti: un programma che tiene un catalogo di software, sa dove scaricarlo e lo installa, aggiorna e disinstalla al posto tuo. Su Linux è la norma da decenni, su Windows è arrivato col nome di Windows Package Manager. Si guida da riga di comando — una finestra di testo in cui si scrivono comandi, il Terminale di Windows o il vecchio Prompt dei comandi — e i comandi che servono sono quattro.

Dove si trova, e da quale versione di Windows

La pagina di panoramica di Microsoft Learn dice che cosa lo porta sul PC: «WinGet the Windows Package Manager is available on Windows 11, modern versions of Windows 10, and Windows Server 2025 as a part of the App Installer», con un requisito minimo preciso, «only supported on Windows 10 version 1809 (build 17763) or later». L’App Installer, il componente che contiene winget, «is a System Component delivered and updated by the Microsoft store on Windows Desktop versions»: se manca o è vecchio si aggiorna dal Microsoft Store, non scaricando un installatore da un sito qualsiasi. Le citazioni di questo articolo sono il testo inglese della documentazione; la resa italiana è di redazione.

«Aggiorna tutto» non aggiorna tutto

Il comando quotidiano è upgrade. Scritto da solo mostra l’elenco dei programmi per cui esiste una versione più recente, ed è il modo più rapido di capire com’è ridotta una macchina. Con l’opzione --all li aggiorna tutti: «upgrade --all will upgrade all installed applications that have an available update». Qui comincia la parte che conviene conoscere, perché la stessa pagina documenta due categorie di programmi che quel comando salta senza protestare.

La prima sono i programmi di cui winget non riesce a stabilire la versione installata: «Some applications do not provide a version. They are always latest», e in quel caso «an upgrade will not be possible unless the -u, --unknown, --include-unknown option is specified». Non è un caso di scuola: ci finisce parecchio software installato a mano, con installatori che non lasciano un numero di versione leggibile nell’elenco delle applicazioni installate. Chi dà upgrade --all, vede scorrere due righe e conclude che è tutto a posto, sta guardando un elenco incompleto.

La seconda sono i programmi appuntati, quelli per cui qualcuno ha chiesto esplicitamente di non aggiornare: «Some applications may have been pinned using WinGet and will not be upgraded if the --all option is specified unless the --include-pinned option is specified». Il comando che fa davvero quello che la gente crede di aver chiesto è dunque upgrade --all --include-unknown --include-pinned. Le due opzioni in più vanno però aggiunte sapendo cosa fanno, non per abitudine: la seconda scavalca una decisione presa in precedenza, e su una macchina ereditata da qualcun altro quella decisione aveva un motivo che forse nessuno ha scritto da nessuna parte.

Il pin: tenere fermo un programma

Capita di avere un programma che non deve cambiare: il gestionale che funziona solo con quella versione del runtime, lo strumento di misura la cui versione nuova ha cambiato formato di file. Serve il comando pin, e la documentazione ne descrive tre tipi: «WinGet supports three types of package pins». Il pin semplice esclude il pacchetto da upgrade --all ma lascia passare l’aggiornamento chiesto per nome — «The package is excluded from winget upgrade --all but allows winget upgrade <package>». Il pin bloccante, che si ottiene con --blocking, chiude anche quella strada: «you will have to unpin the package to let WinGet perform an upgrade». Il terzo tipo, chiamato gating, fissa il pacchetto a una versione o a un intervallo con --version, dove l’asterisco può stare solo come ultima parte del numero.

Un avvertimento che quella pagina mette nero su bianco vale più di tutto il resto: «A pinned package may still upgrade on its own and be upgraded from outside the Windows Package Manager». Il pin vincola winget, non il programma: se quello ha un aggiornatore automatico suo, continuerà ad aggiornarsi per conto proprio, e per fermarlo bisogna spegnere quello. I pin si rivedono con pin list, si togliono con pin remove e si azzerano tutti con pin reset, che senza --force «will show the pins that would be removed» invece di rimuoverli: è il modo giusto di guardare che cosa è stato deciso su una macchina che si prende in gestione.

Portare i programmi su un PC nuovo

Qui entrano export e import. Il primo «exports a JSON file of apps to a specified file»: guarda i programmi installati e ne scrive l’elenco in un file di testo. Il secondo lo rilegge e installa quello che trova, uno dopo l’altro — «it attempts to install the specified applications in a serial fashion». Due dettagli decidono se l’operazione riesce.

Il primo sono le versioni. Senza opzioni l’export scrive solo i nomi dei pacchetti, e all’importazione si prende l’ultima versione disponibile: «By default, unless specified, import will use latest». Con --include-versions scrive anche il numero di versione installato, e il PC nuovo riceverà esattamente quelle: utile per allineare due macchine, scomodo se nel frattempo una versione è uscita dal catalogo. In quel caso la via di fuga è --ignore-versions, che «ignores versions specified in the JSON file and installs the latest available version».

Il secondo sono i programmi che winget non riconosce. L’export «attempts to export all the applications installed on the PC», ma «If the winget export command is not able to match an application to an application from an available source, the export command will show a warning»: l’abbinamento dipende dai metadati del manifest della sorgente e da quelli che l’installatore ha lasciato nell’elenco delle applicazioni installate. La pagina si ferma lì e non dice se quel programma finisca comunque nel file o ne resti fuori: è una cosa da controllare aprendo il file, non da dare per scontata. All’importazione, --ignore-unavailable «suppresses errors if the app requested is unavailable» e --no-upgrade «skips upgrade if an installed version already exists»: la prima evita che un pacchetto sparito interrompa il discorso, la seconda serve su un PC che ha già qualcosa installato.

Il file, e cosa conviene toccarci

La documentazione dell’importazione descrive la gerarchia del file con quattro voci: Sources, «the sources application manifests come from»; Packages, «the collection of packages to install»; PackageIdentifier, «the Windows Package Manager package identifier used to specify the package»; e Version, facoltativo. Lo schema completo sta nel deposito del progetto su GitHub, che non è stato possibile consultare per questo articolo: il frammento qui sotto mostra soltanto le voci documentate, non il file vero che l’export produce, che contiene anche altro. Da cui la regola pratica più importante del pezzo: questo file non si scrive a mano, si parte da quello esportato e si cancellano le voci dei programmi che non si vogliono.

winget upgrade
winget upgrade --all --include-unknown
winget pin add --id Microsoft.PowerToys --blocking
winget pin list
winget export -o programmi.json
winget import -i programmi.json --ignore-unavailable --no-upgrade
{
    "Sources": [
        {
            "Packages": [
                { "PackageIdentifier": "Microsoft.PowerToys" },
                { "PackageIdentifier": "7zip.7zip" },
                { "PackageIdentifier": "Notepad++.Notepad++", "Version": "8.6.9" }
            ]
        }
    ]
}
Quello che export e import non portano con sé

Il file contiene nomi di pacchetti, non dati: non porta impostazioni, profili, licenze, chiavi di attivazione né documenti. Non è un backup e non ne fa le veci. L’importazione installa i programmi come li installerebbe il loro installatore, quindi la configurazione resta tutta da rifare. In compenso nessuno dei comandi di questo articolo tocca il registro di sistema o i criteri di gruppo, perciò non c’è nulla da annullare se si cambia idea: si disinstalla quello che non serve e si tolgono i pin con pin remove.

Dove è stato verificato, e dove no

Dichiarazione dovuta: questo articolo è stato scritto senza una macchina Windows a disposizione, quindi nessuna delle procedure è stata eseguita. Tutto ciò che è affermato su comandi, opzioni e comportamenti viene dalle cinque pagine di Microsoft Learn elencate in fondo, che riportano «Last updated on 2026-07-19» (panoramica, upgrade, pinning, export) e 2026-07-21 (import). Il frammento JSON qui sopra è l’unica cosa provata davvero: riletto con il modulo json di Python 3.13.16, risulta sintatticamente valido. Che winget accetti all’importazione un file ridotto alle sole voci documentate non è stato verificato e non viene affermato.

Cosa si può fare oggi, in cinque minuti. Apri il Terminale e dai winget upgrade senza altro: l’elenco che compare dice da quanto tempo nessuno guarda quel PC. Poi aggiungi --all --include-unknown, perché senza la seconda opzione metà del lavoro non si vede. Esporta l’elenco dei programmi e tienilo accanto ai backup, rigenerandolo due o tre volte l’anno: è un file di pochi kilobyte che il giorno della reinstallazione vale due ore. E se un programma non deve cambiare versione, mettici un pin bloccante e scrivi da qualche parte perché, con la data: chi lo troverà con pin list fra due anni — magari tu — non avrà altro modo di saperlo.

Fonti

  1. Microsoft Learn — winget, panoramica e elenco dei comandi
  2. Microsoft Learn — comando upgrade
  3. Microsoft Learn — pin, tipi e sottocomandi
  4. Microsoft Learn — comando export
  5. Microsoft Learn — comando import