Automatiza la auditoría y actualización de programas en Windows con Winget y PowerShell
Aprende a usar `winget` y PowerShell para detectar programas desactualizados, generar un reporte local en CSV y actualizar aplicaciones de forma controlada sin instalar herramientas de terceros.
Por Equipo Starbyte
Automatiza la auditoría y actualización de programas en Windows con Winget y PowerShell
Problema real
En muchas computadoras con Windows, los programas se actualizan de forma desordenada: algunos muestran alertas, otros se actualizan solos y otros quedan olvidados durante meses. Esto genera tres problemas concretos:
- Riesgo de seguridad por software desactualizado.
- Pérdida de tiempo revisando programa por programa.
- Falta de evidencia para saber qué se actualizó y qué quedó pendiente.
La solución práctica es usar winget, el administrador de paquetes oficial de Windows, junto con PowerShell para generar un reporte local y ejecutar actualizaciones de forma controlada.
Esta guía te permite crear un pequeño flujo de mantenimiento que puedes usar en tu propia PC, en equipos de oficina o como rutina básica de soporte técnico.
Qué vas a lograr
Al finalizar tendrás:
- Un inventario rápido de programas instalados.
- Una lista de aplicaciones con actualizaciones disponibles.
- Un reporte
.csvguardado en tu escritorio. - Un comando seguro para actualizar todo.
- Una alternativa para actualizar solo una aplicación específica.
- Un archivo JSON para respaldar la lista de programas instalables con
winget.
Requisitos previos
| Requisito | Detalle |
|---|---|
| Sistema operativo | Windows 10 1809 o superior, Windows 11 o Windows Server 2025 |
| Herramienta | Windows Package Manager / winget |
| Consola recomendada | PowerShell o Windows Terminal |
| Permisos | Usuario estándar para listar; administrador para algunas actualizaciones |
| Conexión | Internet activa |
Paso 1: Verifica si Winget está instalado
Abre PowerShell y ejecuta:
winget --version
Si aparece una versión, por ejemplo:
v1.10.390
entonces winget está disponible.
Si el sistema responde que el comando no existe, actualiza o instala App Installer desde Microsoft Store, ya que winget forma parte del Administrador de paquetes de Windows.
Paso 2: Lista los programas instalados
Ejecuta:
winget list
Este comando muestra aplicaciones instaladas en el equipo, tanto las instaladas con winget como muchas instaladas por otros medios.
Para buscar una aplicación concreta:
winget list --name "Google Chrome"
O por identificador:
winget list --id Google.Chrome
Paso 3: Revisa qué programas tienen actualización disponible
Ejecuta:
winget upgrade
Este comando muestra una tabla con aplicaciones que tienen una versión más reciente disponible.
Ejemplo de salida esperada:
Name Id Version Available
Google Chrome Google.Chrome 123.0.0 124.0.0
7-Zip 7zip.7zip 23.01 24.05
Visual Studio Code Microsoft.VisualStudioCode 1.89 1.90
Paso 4: Genera un reporte local en CSV
Crea una carpeta para reportes:
New-Item -ItemType Directory -Path "$env:USERPROFILE\Desktop\Reporte-Winget" -Force
Ahora genera un archivo de texto con las actualizaciones detectadas:
winget upgrade > "$env:USERPROFILE\Desktop\Reporte-Winget\actualizaciones-winget.txt"
Este método es simple y funciona bien para revisión rápida.
Si deseas un CSV estructurado, usa este script:
$Fecha = Get-Date -Format "yyyy-MM-dd_HH-mm"
$Ruta = "$env:USERPROFILE\Desktop\Reporte-Winget"
$Archivo = "$Ruta\actualizaciones-winget-$Fecha.csv"
New-Item -ItemType Directory -Path $Ruta -Force | Out-Null
$Salida = winget upgrade
$Lineas = $Salida | Select-Object -Skip 2 | Where-Object {
$_ -match '\S' -and $_ -notmatch '^-+'
}
$Resultado = foreach ($Linea in $Lineas) {
$Texto = $Linea -replace '\s{2,}', '|'
$Partes = $Texto.Split('|')
if ($Partes.Count -ge 4) {
[PSCustomObject]@{
Nombre = $Partes[0].Trim()
Id = $Partes[1].Trim()
VersionInstalada = $Partes[2].Trim()
VersionDisponible = $Partes[3].Trim()
FechaReporte = (Get-Date -Format "yyyy-MM-dd HH:mm:ss")
}
}
}
$Resultado | Export-Csv -Path $Archivo -NoTypeInformation -Encoding UTF8
Write-Host "Reporte generado en: $Archivo"
Resultado esperado:
actualizaciones-winget-2026-05-12_10-30.csv
Este archivo puede abrirse en Excel, Power BI o cualquier editor CSV.
Paso 5: Actualiza todas las aplicaciones disponibles
Para actualizar todo lo que winget detecte:
winget upgrade --all
Para evitar confirmaciones repetitivas en escenarios controlados:
winget upgrade --all --accept-package-agreements --accept-source-agreements
Recomendación: antes de ejecutar una actualización masiva, revisa la lista con:
winget upgrade
Paso 6: Actualiza una sola aplicación
Si solo quieres actualizar Google Chrome:
winget upgrade --id Google.Chrome
Para Visual Studio Code:
winget upgrade --id Microsoft.VisualStudioCode
Para 7-Zip:
winget upgrade --id 7zip.7zip
Este método es más seguro cuando estás en una PC de trabajo y no quieres modificar todo el entorno de una sola vez.
Paso 7: Exporta tu lista de aplicaciones instalables
Si quieres respaldar una lista de aplicaciones para reinstalarlas luego en otra PC, ejecuta:
winget export -o "$env:USERPROFILE\Desktop\Reporte-Winget\apps-winget.json"
Esto genera un archivo JSON con aplicaciones reconocidas por winget.
Ejemplo:
{
"$schema": "https://aka.ms/winget-packages.schema.2.0.json",
"Sources": [
{
"Packages": [
{
"PackageIdentifier": "Google.Chrome"
},
{
"PackageIdentifier": "Microsoft.VisualStudioCode"
}
],
"SourceDetails": {
"Argument": "https://cdn.winget.microsoft.com/cache",
"Identifier": "Microsoft.Winget.Source_8wekyb3d8bbwe",
"Name": "winget",
"Type": "Microsoft.PreIndexed.Package"
}
}
]
}
Paso 8: Importa aplicaciones en otra PC
En una nueva computadora, puedes usar:
winget import -i "$env:USERPROFILE\Desktop\Reporte-Winget\apps-winget.json"
Esto es útil para:
- Reinstalar rápidamente programas después de formatear.
- Preparar una laptop nueva.
- Estandarizar equipos de oficina.
- Documentar entornos técnicos de trabajo.
Script completo: auditoría + reporte + actualización opcional
Guarda el siguiente contenido como:
mantenimiento-winget.ps1
Código:
$Ruta = "$env:USERPROFILE\Desktop\Reporte-Winget"
$Fecha = Get-Date -Format "yyyy-MM-dd_HH-mm"
$ArchivoTxt = "$Ruta\actualizaciones-winget-$Fecha.txt"
$ArchivoCsv = "$Ruta\actualizaciones-winget-$Fecha.csv"
$ArchivoJson = "$Ruta\apps-winget-$Fecha.json"
New-Item -ItemType Directory -Path $Ruta -Force | Out-Null
Write-Host "Verificando versión de Winget..."
winget --version
Write-Host "Generando reporte TXT..."
winget upgrade > $ArchivoTxt
Write-Host "Procesando reporte CSV..."
$Salida = winget upgrade
$Lineas = $Salida | Select-Object -Skip 2 | Where-Object {
$_ -match '\S' -and $_ -notmatch '^-+'
}
$Resultado = foreach ($Linea in $Lineas) {
$Texto = $Linea -replace '\s{2,}', '|'
$Partes = $Texto.Split('|')
if ($Partes.Count -ge 4) {
[PSCustomObject]@{
Nombre = $Partes[0].Trim()
Id = $Partes[1].Trim()
VersionInstalada = $Partes[2].Trim()
VersionDisponible = $Partes[3].Trim()
FechaReporte = (Get-Date -Format "yyyy-MM-dd HH:mm:ss")
}
}
}
$Resultado | Export-Csv -Path $ArchivoCsv -NoTypeInformation -Encoding UTF8
Write-Host "Exportando lista de aplicaciones reconocidas por Winget..."
winget export -o $ArchivoJson --accept-source-agreements
Write-Host ""
Write-Host "Reportes generados:"
Write-Host "TXT: $ArchivoTxt"
Write-Host "CSV: $ArchivoCsv"
Write-Host "JSON: $ArchivoJson"
Write-Host ""
$Respuesta = Read-Host "¿Deseas actualizar todas las aplicaciones ahora? Escribe SI para continuar"
if ($Respuesta -eq "SI") {
winget upgrade --all --accept-package-agreements --accept-source-agreements
} else {
Write-Host "Actualización cancelada. Solo se generaron los reportes."
}
Para ejecutarlo:
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
.\mantenimiento-winget.ps1
Casos prácticos de uso
Caso 1: mantenimiento mensual de una laptop personal
Ejecutas el script una vez al mes, revisas el CSV y actualizas solo los programas importantes.
Comando recomendado:
winget upgrade
Luego actualizas individualmente:
winget upgrade --id Mozilla.Firefox
Caso 2: soporte técnico en oficina pequeña
Antes de intervenir una PC, generas evidencia:
winget upgrade > "$env:USERPROFILE\Desktop\actualizaciones-pendientes.txt"
Luego actualizas:
winget upgrade --all
Y guardas el archivo como respaldo de la atención realizada.
Caso 3: preparar una PC nueva
En la PC antigua:
winget export -o "$env:USERPROFILE\Desktop\apps-winget.json"
En la PC nueva:
winget import -i "$env:USERPROFILE\Desktop\apps-winget.json"
Esto no reemplaza una imagen corporativa completa, pero acelera mucho la reinstalación básica.
Errores comunes y soluciones
| Error o situación | Causa probable | Solución |
|---|---|---|
winget no se reconoce como comando |
App Installer no está instalado o no se ha registrado | Actualiza App Installer desde Microsoft Store y reinicia sesión |
| El comando pide confirmar acuerdos | Falta aceptar términos de paquetes o fuentes | Usa --accept-package-agreements --accept-source-agreements |
Una aplicación no aparece en winget upgrade |
No está registrada o no coincide con el repositorio | Busca manualmente con winget search nombre |
| Se actualiza una app equivocada | Nombre ambiguo | Usa --id en lugar de --name |
| El script CSV no separa bien algunas filas | Algunas salidas de consola tienen espacios irregulares | Usa el TXT como respaldo o valida manualmente apps críticas |
| Fallan apps que requieren permisos elevados | Falta ejecutar como administrador | Abre PowerShell como administrador |
| El import no instala todo | Algunas apps no existen en el repositorio o cambiaron de identificador | Revisa el JSON y valida con winget search |
Buenas prácticas
- Revisa primero con
winget upgradeantes de actualizar. - Usa
--idpara evitar ambigüedades. - Ejecuta actualizaciones masivas fuera del horario de trabajo.
- Genera reportes antes y después de actualizar.
- No automatices actualizaciones críticas sin probarlas antes.
- Mantén un respaldo de tu lista de aplicaciones con
winget export. - En equipos institucionales, valida políticas internas antes de instalar software.
- No mezcles actualizaciones de drivers, BIOS o firmware con este flujo;
wingetestá enfocado en aplicaciones.
Comandos rápidos de referencia
| Acción | Comando |
|---|---|
| Ver versión de Winget | winget --version |
| Listar programas instalados | winget list |
| Buscar una aplicación | winget search nombre |
| Ver actualizaciones disponibles | winget upgrade |
| Actualizar todo | winget upgrade --all |
| Actualizar una app por ID | winget upgrade --id Google.Chrome |
| Exportar lista de apps | winget export -o apps.json |
| Importar lista de apps | winget import -i apps.json |
Idea clave
Mantener Windows actualizado no debería depender de revisar programa por programa. Con winget y PowerShell puedes convertir una tarea manual y desordenada en un proceso repetible: auditar, registrar, actualizar y documentar. Esa es la diferencia entre “hacer mantenimiento” y tener una rutina técnica confiable.