Cómo obtener una lista de todo el software instalado desde PowerShell

Última actualización: 16/10/2025
Autor: Isaac
  • El Registro (claves Uninstall) es la fuente más fiable para reflejar lo que muestra “Agregar o quitar programas”.
  • Win32_Product sirve para MSI pero es lento y puede provocar reparaciones; úsalo con cautela.
  • Get-Package lista paquetes de PackageManagement (PowerShellGet/NuGet), no todo el software del sistema.
  • Exporta y compara con TXT/CSV y Compare-Object; Geek Uninstaller y UninstallView agilizan informes.

Lista de software instalado con PowerShell

Si alguna vez has necesitado averiguar rápidamente qué programas hay en un equipo Windows, ya sea porque administras servidores sin interfaz gráfica o porque vas a reinstalar el sistema, te interesará tener un inventario fiable. En este artículo te cuento, con detalle y paso a paso, todas las formas de listar y exportar el software instalado usando PowerShell, WMI, el Registro y herramientas de terceros.

Vamos a integrar varias técnicas contrastadas, comentando sus pros y contras, y verás desde comandos directos hasta opciones avanzadas como Get-Package con PackageManagement, consultas al Registro (Uninstall), ejecución remota e incluso comparativas entre listados antes y después de formatear. Además, añadiremos opciones de exportación a TXT/CSV/HTML y, para quien lo prefiera, utilidades de terceros que resuelven esto en dos clics.

Por qué merece la pena listar tus programas

Contar con un inventario claro evita olvidos al reinstalar y ayuda a detectar software que ya no usas. En muchos equipos se acumulan aplicaciones por probar que quedan olvidadas ocupando espacio y, peor aún, algunas permanecen en segundo plano consumiendo recursos sin que te enteres.

Un listado te permite revisar de un vistazo, mejor que desplazándote por la interfaz de “Aplicaciones y características”. También te facilita tareas de soporte, auditoría y cumplimiento, y te ahorra tiempo si gestionas varios PCs o servidores Windows Core donde no hay GUI y todo se hace por consola.

Estas técnicas funcionan en múltiples versiones de Windows, incluidas Windows Server 2012 R2, 2016, 2019 y Windows 7/10/11, con matices que iremos comentando cuando sea necesario.

Más adelante verás que no todos los métodos muestran lo mismo: PowerShell, WMI, el Registro y PackageManagement consultan fuentes distintas, por eso conviene conocer qué cubre cada técnica y sus limitaciones para elegir la adecuada en cada caso.

PowerShell listar programas instalados

Métodos rápidos con PowerShell para ver los programas instalados

PowerShell ofrece caminos directos para sacar una lista. Empezamos por lo inmediato: consultar las claves de desinstalación del Registro, que es lo que realmente alimenta la vista clásica de “Agregar o quitar programas”.

El alias gp (Get-ItemProperty) permite leer propiedades rápidamente. Puedes combinar dos rutas (64 y 32 bits) y filtrar los elementos con nombre visible:

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

Si prefieres algo más estructurado (nombre, versión, editor, fecha), separa por arquitectura y formatea en tabla de forma compacta para revisar en pantalla; funciona muy bien para una lectura rápida:

# 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

También existe la vía WMI/WMIC para localizar software instalado vía Windows Installer. Los comandos típicos son estos dos, aunque verás más abajo sus advertencias: pueden ser lentos y provocar reparaciones 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

Por último, mucha gente prueba con Get-Package. Ojo: Get-Package sólo lista paquetes instalados a través de PackageManagement (NuGet/PowerShellGet y similares), no todo el software tradicional del sistema. Aun así, es útil para módulos y scripts instalados desde repositorios.

# 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

Si administras varios equipos, puedes usar PowerShell Remoting para consultar paquetes gestionados en remoto. Por ejemplo, ejecutas Get-Package en Server01 con credenciales válidas:

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

Exportar la lista a TXT o CSV y comparar antes/después

Ver en pantalla está bien, pero lo más práctico es guardar a fichero. Con PowerShell puedes enviar la salida a un TXT ordenado por nombre de programa para revisarlo con calma o compartirlo.

# 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"

Si prefieres un CSV legible en Excel/LibreOffice, puedes exportar ambas ramas (64 y 32 bits) a un archivo común. El ejemplo clásico vuelca con Out-File a una extensión .csv; aun así, para un CSV real es mejor usar Export-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"

Cuando el objetivo es reinstalar el sistema sin perder nada, una técnica útil es generar un listado “antes” y otro “después” y compararlos. Con Compare-Object puedes ver rápidamente qué falta o qué sobra; además puedes combinarlo con guías para automatizar la instalación de software y drivers tras formatear.

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

Fíjate en la columna SideIndicator: el símbolo => indica que está en el segundo archivo y no en el primero, mientras que <= significa lo contrario. Si aparece =, es que el elemento figura en ambos listados sin diferencias.

  Cómo usar FaceTime en tu PC con Windows

Exportar lista de programas con PowerShell

Consultar el Registro: claves Uninstall, recuento y propiedades

La mayoría de instaladores convencionales registran información de desinstalación en el Registro. Por eso, si necesitas una lista similar a la de “Agregar o quitar programas”, la fuente más fiable es la clave Uninstall del equipo.

La ruta principal es: HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall, y para aplicaciones de 32 bits en sistemas de 64 bits tienes también la rama: HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall.

Para contar cuántas aplicaciones hay registradas en una rama concreta, puedes usar Get-ChildItem y obtener el número de subclaves:

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

Si lo que buscas es extraer propiedades específicas (por ejemplo, sólo el nombre visible), puedes tirar de los valores del Registro con GetValue(‘DisplayName’) y ordenarlos para una lectura más cómoda:

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

Para componer objetos con varias propiedades (similar a lo que verías con Win32Reg_AddRemovePrograms de SCCM), puedes construir un pequeño pipeline que añada un identificador, editor, versión y fecha de instalación; así obtienes un inventario más 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

Este enfoque evita las pegas de Win32_Product (lento y con efectos secundarios MSI) y no depende de SCCM como la clase Win32Reg_AddRemovePrograms, por lo que resulta muy útil para auditorías locales sin infraestructura adicional.

WMI/WMIC: cuándo conviene y qué riesgos tienen

Las clases WMI relacionadas con Windows Installer (como Win32_Product) sólo devuelven software instalado con MSI, dejando fuera instaladores que usen otros motores. Además, consultar Win32_Product puede disparar reparaciones de los productos MSI y tardar bastante, algo nada ideal en servidores de producción.

Aun así, hay entornos donde te interesará extraer justo lo que “sabe” Windows Installer. Para eso están:

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

gwmi Win32_Product

wmic product get name,version

Si utilizas estos comandos, hazlo con conocimiento de causa y en ventanas de mantenimiento. Para inventarios generales, el método del Registro suele ser más seguro y rápido, además de abarcar un espectro mayor de aplicaciones.

  Arreglo: Error de la pila de control de Windows 10

Get-Package a fondo: qué lista realmente y parámetros útiles

Get-Package pertenece a PackageManagement (OneGet) y devuelve paquetes instalados por sus proveedores (PowerShellGet, NuGet, etc.), relacionados con los instaladores de paquetes de software más populares.

La sintaxis base admite filtros por nombre y versiones. Puedes forzar la inicialización del proveedor si hace falta (bootstrap), listar todas las versiones y acotar por proveedor (PowerShellGet, NuGet) o por tipo (módulos, scripts):

Get-Package  <String[]>]    
               >]         

Parámetros relevantes que conviene conocer (algunos son dinámicos y dependen del proveedor): aquí tienes el repaso esencial:

  • -Name: uno o varios nombres (admite comodines). Útil para encontrar paquetes concretos.
  • -ProviderName: filtra por proveedor; valores típicos: Bootstrap, NuGet, PowerShellGet. Mejor combinado con -AllVersions.
  • -AllVersions: devuelve todas las versiones instaladas, no sólo la más reciente.
  • -RequiredVersion, -MinimumVersion, -MaximumVersion: acotan la versión exacta o el rango de versiones a devolver.
  • -Scope: CurrentUser o AllUsers, según dónde esté instalado el paquete.
  • -Force: evita confirmaciones y fuerza el comando cuando procede.
  • -ForceBootstrap: instala automáticamente el proveedor requerido si no está presente.
  • -AllowPrereleaseVersions: incluye versiones preliminares en los resultados.
  • -InstallUpdate: para escenarios donde Get-Package puede instalar actualizaciones con proveedores que lo soporten.
  • -Type (PowerShellGet): Module, Script o All.
  • -ExcludeVersion y -Destination (NuGet): afectan al nombre de carpeta y al directorio de extracción cuando aplica.
  • -SkipDependencies (NuGet): omite la búsqueda de dependencias.
  • -SkipPublisherCheck (PowerShellGet): ignora comprobaciones de editor en ciertos casos.
  • -PackageManagementProvider: especifica el proveedor de administración de paquetes.
  • -NoPathUpdate: parámetro dinámico de Install-Script; no aplica realmente a Get-Package.
  • CommonParameters: Verbose, Debug, ErrorAction, WarningAction, OutVariable, etc.

Ejemplos prácticos típicos incluyen listar todo lo instalado con PowerShellGet, buscar una versión concreta y hasta desinstalar encadenando con Uninstall-Package mediante la canalización:

# 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

Ten en cuenta que Get-Package es compatible con remoto (Invoke-Command o Enter-PSSession) y que los proveedores pueden añadir parámetros dinámicos. La salida es un objeto de tipo Microsoft.PackageManagement.Packaging.SoftwareIdentity, con metadatos del paquete.

  How you can Take away Developer Choices From Settings Menu On Android Cellphone

¿Y el software “instalado a mano”? Limitaciones a tener en cuenta

Hay aplicaciones que se despliegan copiando carpetas y no registran un desinstalador. Esas no aparecerán en Uninstall ni en Win32_Product, y tampoco en PackageManagement. En esos casos, gestiónalas como archivos y carpetas, siguiendo técnicas para instalar programas manualmente, con scripts que busquen rutas, ejecutables o firmas específicas.

Por el mismo motivo, dos equipos con el mismo software pueden mostrar resultados distintos si en uno se instaló con MSI y en otro con un instalador diferente sin registrar la desinstalación. El inventario ideal combina varias técnicas según el entorno.

Ejecución remota y compatibilidad por versiones de Windows

Para servidores y flotas de PCs, PowerShell Remoting es el camino. Con una sesión remota (Enter-PSSession) o Invocación de Comandos (Invoke-Command) puedes recolectar datos con las mismas instrucciones vistas, centralizando el inventario desde tu equipo.

Ejemplo básico para consultar Get-Package en un servidor remoto con credenciales de dominio válidas, ideal si ya tienes WinRM configurado:

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

Las técnicas de Registro (Uninstall) funcionan en Windows 7/10/11 y Windows Server 2012 R2/2016/2019, mientras que Get-Package requiere tener PackageManagement y los proveedores apropiados presentes o autoinstalables (ForceBootstrap ayuda).

listar programas instalados con powershell-3
Artículo relacionado:
Listar programas instalados en Windows con PowerShell y otras técnicas