Come ottenere un elenco di tutti i software installati da PowerShell

Ultimo aggiornamento: 16/10/2025
Autore: Isaac
  • Il Registro di sistema (chiavi di disinstallazione) è la fonte più affidabile per ciò che viene visualizzato da "Installazione applicazioni".
  • Win32_Product funziona per gli MSI, ma è lento e può causare problemi di riparazione; utilizzarlo con cautela.
  • Get-Package elenca i pacchetti PackageManagement (PowerShellGet/NuGet), non tutto il software di sistema.
  • Esporta e confronta con TXT/CSV e Compare-Object; Geek Uninstaller e UninstallView semplificano la creazione di report.

Elenca il software installato con PowerShell

Se hai mai avuto bisogno di scoprire rapidamente quali programmi sono presenti su un computer WindowsChe tu stia gestendo server senza un'interfaccia grafica o reinstallando il sistema, vorrai avere un inventario affidabile. In questo articolo, spiegherò in dettaglio, passo dopo passo. tutti i modi per elencare ed esportare il software installato utilizzando PowerShell, WMI, il Registro e strumenti di terze parti.

Integreremo diverse tecniche comprovate, commentando i loro pro e contro, e vedrai da comandi direttamente alle opzioni avanzate come Ottieni-Pacchetto con PackageManagement, query del Registro di sistema (disinstallazione), esecuzione remota e persino confronti tra gli annunci prima e dopo formatearInoltre, aggiungeremo opzioni di esportazione TXT/CSV/HTML e, per chi lo preferisce, utilità di terze parti che consentono di farlo in soli due clic.

Perché vale la pena elencare i tuoi programmi

Avere un inventario chiaro previene sviste durante la reinstallazione e aiuta a individuare i software che non si utilizzano più. Molti computer accumulano applicazioni non testate che vengono dimenticate, occupando spazio e, peggio ancora, alcuni rimangono sullo sfondo consumando risorse senza che tu te ne accorga.

Un elenco consente di consultare le app a colpo d'occhio, anziché scorrere l'interfaccia "App e funzionalità". Semplifica inoltre il supporto, l'audit e la conformità, consentendo di risparmiare tempo se si gestiscono più PC o server Windows Core. Non c'è un'interfaccia grafica e tutto viene fatto tramite la console..

Queste tecniche funzionano su più versioni di Windows, tra cui Windows Server 2012 R2, 2016, 2019 e Windows 7/10/11, con sfumature che commenteremo quando necessario.

Vedrai più avanti che non tutti i metodi visualizzano la stessa cosa: PowerShell, WMI, il Registro di sistema e PackageManagement interrogano tutti fonti diverse, Ecco perché è importante sapere cosa copre ogni tecnica e quali sono i suoi limiti. per scegliere quello giusto in ogni caso.

Elenco dei programmi installati di PowerShell

Metodi rapidi di PowerShell per visualizzare i programmi installati

PowerShell offre percorsi diretti per generare un elenco. Iniziamo con il più elementare: controlla le chiavi di disinstallazione nel Registro di sistema, che è ciò che in realtà alimenta la classica visualizzazione "Aggiungi/Rimuovi programmi".

L'alias gp (Get-ItemProperty) Permette di leggere rapidamente le proprietà. È possibile combinare due percorsi (a 64 bit e a 32 bit) e filtrare gli elementi con nomi visibili:

gp HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*, HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object { -not ::IsNullOrWhiteSpace($_.DisplayName) } | Select-Object DisplayName

Se preferisci qualcosa di più strutturato (nome, versione, editore, data), separa per architettura e formato in una tabella compatta per la revisione sullo schermo; funziona molto bene per una lettura veloce:

# 64 bits
Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | Format-Table -AutoSize

# 32 bits
Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | Format-Table -AutoSize

Esiste anche il percorso WMI/WMIC per individuare il software installato tramite Windows Installer. I comandi tipici sono questi due, anche se di seguito troverete le relative avvertenze: Possono essere lenti e causare riparazioni MSI.

# Win32_Product (WMI)
Get-WmiObject -Class Win32_Product | Select-Object -Property Name

# Alias rápido
gwmi Win32_Product

# WMIC clásico
wmic product get name,version

Infine, molte persone provano Get-Package. Nota: Get-Package elenca solo i pacchetti installati tramite PackageManagement (NuGet/PowerShellGet e simili), non per tutti i software di sistema tradizionali. Tuttavia, è utile per moduli e script installati da repository.

# Paquetes gestionados por PackageManagement
Get-Package

# Todas las versiones de un proveedor concreto
Get-Package -ProviderName PowerShellGet -AllVersions

# Versión concreta de un paquete
Get-Package -Name PackageManagement -ProviderName PowerShellGet -RequiredVersion 1.3.1

Se gestisci più computer, puoi utilizzare PowerShell Remoting per interrogare i pacchetti gestiti in remoto. Ad esempio, Esegui Get-Package su Server01 con credenziali valide:

Invoke-Command -ComputerName Server01 -Credential CONTOSO\TestUser -ScriptBlock { Get-Package }

Esporta l'elenco in TXT o CSV e confronta prima/dopo

La visualizzazione sullo schermo è buona, ma salvare in un file è più pratico. Con PowerShell puoi inviare l'output a un TXT ordinato per nome del programma per rivederlo con calma o condividerlo.

# 32 bits en TXT
Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* |
  Select-Object DisplayName, DisplayVersion, Publisher, InstallDate |
  Sort-Object DisplayName |
  Out-File -FilePath "C:\Users\TuUsuario\Documents\InstalledPrograms.txt"

Se preferisci un CSV leggibile in Excel/LibreOffice, puoi esportare entrambi i rami (64 e 32 bit) in un file comune. L'esempio classico restituisce un output con estensione .csv con Out-File; tuttavia, per un CSV reale è meglio usare Esporta-Csv -NoTypeInformation.

# 64 bits a CSV
Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* |
  Select-Object DisplayName, DisplayVersion, Publisher, InstallDate |
  Sort-Object DisplayName |
  Export-Csv -NoTypeInformation -Encoding UTF8 -Path "C:\Ruta\De\Tu\Archivo\Programas.csv"

# 32 bits al mismo CSV (añadiendo)
Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* |
  Select-Object DisplayName, DisplayVersion, Publisher, InstallDate |
  Sort-Object DisplayName |
  Export-Csv -NoTypeInformation -Encoding UTF8 -Append -Path "C:\Ruta\De\Tu\Archivo\Programas.csv"

Quando l'obiettivo è reinstallare il sistema senza perdere nulla, una tecnica utile è quella di generare un elenco "prima" e "dopo" e confrontarli. Compare-Object puoi vedere rapidamente cosa manca o cosa è in più; puoi anche combinarlo con le guide per automatizzare l'installazione di software e driver dopo la formattazione.

Compare-Object -ReferenceObject (Get-Content C:\Users\TuUsuario\Documents\InstalledPrograms.txt) \
               -DifferenceObject (Get-Content C:\Users\TuUsuario\Documents\InstalledPrograms2.txt)

Osserva la colonna SideIndicator: il simbolo => indica che si trova nel secondo file e non nel primo, mentre <= significa il contrario. Se compare =, l'elemento appare in entrambe le liste senza differenze.

  Come creare diagrammi in Visio passo dopo passo

Esportare l'elenco dei programmi con PowerShell

Controllare il Registro di sistema: disinstalla chiavi, conteggio e proprietà

La maggior parte dei programmi di installazione convenzionali registra le informazioni di disinstallazione nel Registro di sistema. Quindi, se hai bisogno di un elenco simile a quello in "Installazione applicazioni", La fonte più affidabile è la chiave di disinstallazione della squadra.

Il percorso principale è: HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall e per le applicazioni a 32 bit sui sistemi a 64 bit è presente anche il ramo: HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall.

Per contare quante applicazioni sono registrate in una particolare filiale, puoi usare Get-ChildItem e ottenere il numero di sottochiavi:

$UninstallPath = 'HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall'
(Get-ChildItem -Path $UninstallPath).Count

Se si desidera estrarre proprietà specifiche (ad esempio, solo il nome visualizzato), è possibile estrarre i valori del registro con GetValue('Nome visualizzato') e ordinarli per una lettura più comoda:

Get-ChildItem -Path $UninstallPath |
  ForEach-Object { $_.GetValue('DisplayName') } |
  Sort-Object

Per comporre oggetti con più proprietà (simili a quanto si vedrebbe con Win32Reg_AddRemovePrograms di SCCM), è possibile creare una piccola pipeline che aggiunge un identificatore, un editore, una versione e una data di installazione; In questo modo si ottiene un inventario più completo:

Get-ChildItem $UninstallPath |
  ForEach-Object {
    $ProdID = ($_.Name -split '\\')
    Get-ItemProperty -Path "$UninstallPath\$ProdID" -ErrorAction SilentlyContinue |
      Select-Object DisplayName, InstallDate, @{n='ProdID'; e={$ProdID}}, Publisher, DisplayVersion
  } | Select-Object -First 10

Questo approccio evita gli svantaggi di Win32_Product (lento e con effetti collaterali MSI) e non dipende da SCCM come classe Win32Reg_AggiungiRimuoviProgrammi, rendendolo molto utile per gli audit locali senza infrastrutture aggiuntive.

WMI/WMIC: quando utilizzarli e quali sono i rischi?

Le classi WMI correlate a Windows Installer (come Win32_Product) restituiscono solo il software installato con MSI, escludendo gli installer che utilizzano altri motori. Inoltre, L'interrogazione di Win32_Product può attivare le riparazioni dei prodotti MSI e richiedono molto tempo, il che non è l'ideale sui server di produzione.

Tuttavia, ci sono ambienti in cui sarai interessato estrai esattamente ciò che “sai” Windows Installer. Ecco a cosa servono:

Get-WmiObject -Class Win32_Product | Select-Object -Property Name

gwmi Win32_Product

wmic product get name,version

Se si utilizzano questi comandi, farlo con la dovuta attenzione e durante le finestre di manutenzione. Per gli inventari generali, Il metodo del Registro è solitamente più sicuro e veloce, oltre a coprire uno spettro più ampio di applicazioni.

  Esempi di come creare script con menu di opzioni in Bash

Get-Package in dettaglio: cosa elenca effettivamente e parametri utili

Get-Package appartiene a PackageManagement (OneGet) e restituisce i pacchetti installati dai loro provider (PowerShellGet, NuGet, ecc.), correlati a programmi di installazione di pacchetti software più popolari.

La sintassi di base supporta filtri per nome e versione. È possibile forzare l'inizializzazione del provider, se necessario (bootstrap), elencare tutte le versioni e restringi per provider (PowerShellGet, NuGet) o per tipo (moduli, script):

Get-Package  <String[]>]    
               >]         

Parametri rilevanti da conoscere (alcuni sono dinamici e dipendono dal provider): Ecco la recensione essenziale:

  • -Name: uno o più nomi (sono supportati i caratteri jolly). Utile per trovare pacchetti specifici.
  • -NomeProvider: Filtra per fornitore; valori tipici: Bootstrap, NuGet, PowerShellGet. Da utilizzare al meglio con -AllVersions.
  • -Tutte le versioni: Restituisce tutte le versioni installate, non solo la più recente.
  • -Versione richiesta, -MinimumVersion, -MaximumVersion: limita la versione esatta o l'intervallo di versioni da restituire.
  • -Ambito di applicazione: CurrentUser o AllUsers, a seconda di dove è installato il pacchetto.
  • -Vigore: Evita le conferme e forza il comando quando è opportuno.
  • -ForceBootstrap: Installa automaticamente il provider richiesto se non presente.
  • -ConsentiPrereleaseVersions: include versioni preliminari nei risultati.
  • -InstallaAggiorna: Per scenari in cui Get-Package può installare aggiornamenti con provider che lo supportano.
  • -Genere (PowerShellGet): Modulo, Copione o Tutti.
  • -ExcludeVersion e -Destinazione (NuGet): influenzano il nome della cartella e la directory di estrazione, se applicabile.
  • -Salta Dipendenze (NuGet): salta la ricerca delle dipendenze.
  • -SaltaControlloEditore (PowerShellGet): ignora i controlli dell'editore in determinati casi.
  • -PackageManagementProvider: Specifica il provider di gestione dei pacchetti.
  • -Nessun aggiornamento del percorso: Parametro dinamico Install-Script; in realtà non si applica a Get-Package.
  • Parametri comuni: Verbose, Debug, ErrorAction, WarningAction, OutVariable, ecc.

Esempi pratici tipici includono l'elenco di tutto ciò che è installato con PowerShellGet, la ricerca di una versione specifica e persino la disinstallazione tramite concatenamento con Disinstalla-Pacchetto attraverso la canalizzazione:

# Todo lo de PowerShellGet, con todas las versiones
Get-Package -ProviderName PowerShellGet -AllVersions

# Versión exacta de PackageManagement
Get-Package -Name PackageManagement -ProviderName PowerShellGet -RequiredVersion 1.3.1

# Desinstalar una versión concreta de un paquete
Get-Package -Name posh-git -RequiredVersion 0.7.3 | Uninstall-Package

Si noti che Get-Package è compatibile con il comando remoto (Invoke-Command o Enter-PSSession) e che i provider possono aggiungere parametri dinamici. L'output è un oggetto di tipo Microsoft.PackageManagement.Packaging.SoftwareIdentity, con metadati del pacchetto.

  Come abilitare le chiamate esclusivamente dai contatti riconosciuti su iPhone

E il software "installato manualmente"? Limitazioni da tenere a mente

Esistono applicazioni che vengono distribuite copiando le cartelle e non registrano un programma di disinstallazione. Queste non appariranno in Disinstalla o Win32_Product, né in Gestione Pacchetti. In questi casi, gestiscile come file e cartelle, seguendo le tecniche per installare i programmi manualmente, con script che cercano percorsi, eseguibili o firme specifici.

Per lo stesso motivo, due computer con lo stesso software potrebbero mostrare risultati diversi se uno è stato installato con MSI e l'altro con MSI. con un programma di installazione diverso senza registrare la disinstallazioneL'inventario ideale combina diverse tecniche a seconda dell'ambiente.

Esecuzione remota e compatibilità della versione di Windows

Per server e flotte di PC, PowerShell Remoting è la soluzione ideale. Con una sessione remota (Enter-PSSession) o un'invocazione di comando (Invoke-Command), è possibile raccogliere dati con gli stessi comandi utilizzati in precedenza. centralizzare l'inventario dal tuo computer.

Esempio di base per interrogare Get-Package su un server remoto con credenziali di dominio valide, ideale se hai già configurato WinRM:

Invoke-Command -ComputerName Server01 -Credential CONTOSO\TestUser -ScriptBlock { Get-Package }

Le tecniche del Registro di sistema (disinstallazione) funzionano su Windows 7/10/11 e Windows Server 2012 R2/2016/2019, mentre Get-Package richiede di avere Gestione dei pacchetti e fornitori appropriato presente o autoinstallabile (ForceBootstrap aiuta).

elenca i programmi installati con powershell-3
Articolo correlato:
Elencare i programmi installati in Windows con PowerShell e altre tecniche