<# Instalador de aplicaciones con winget Herramientas BAIT · https://bait.cl/herramientas/script-instalar-apps/ Generado el 16-10-2026 (selección básica) con 8 aplicaciones. Qué hace: 1. Revisa que winget (Instalador de aplicación de Microsoft) esté disponible. 2. Para cada aplicación, revisa si ya está instalada y si no, la instala sin preguntas. 3. Muestra un resumen con lo instalado, lo que ya estaba y lo que falló. Los programas se descargan desde sus fuentes oficiales a través de winget. Conviene ejecutarlo como administrador para que no aparezca un aviso por cada programa. Uso: Clic derecho > Ejecutar con PowerShell o bien: powershell -ExecutionPolicy Bypass -File .\instalar-apps.ps1 #> $Host.UI.RawUI.WindowTitle = 'Instalador de aplicaciones (BAIT)' # ---------- aplicaciones elegidas ---------- # Puedes quitar líneas o agregar otras. Busca los Id con: winget search nombre $apps = @( @{ Id = 'Google.Chrome'; Nombre = 'Google Chrome'; Fuente = 'winget' }, @{ Id = 'Mozilla.Firefox'; Nombre = 'Mozilla Firefox'; Fuente = 'winget' }, @{ Id = '7zip.7zip'; Nombre = '7-Zip'; Fuente = 'winget' }, @{ Id = 'Adobe.Acrobat.Reader.64-bit'; Nombre = 'Adobe Acrobat Reader'; Fuente = 'winget' }, @{ Id = 'VideoLAN.VLC'; Nombre = 'VLC'; Fuente = 'winget' }, @{ Id = 'Zoom.Zoom'; Nombre = 'Zoom'; Fuente = 'winget' }, @{ Id = 'AnyDesk.AnyDesk'; Nombre = 'AnyDesk'; Fuente = 'winget' }, @{ Id = 'Notepad++.Notepad++'; Nombre = 'Notepad++'; Fuente = 'winget' } ) # ---------- revisar winget ---------- if (-not (Get-Command winget -ErrorAction SilentlyContinue)) { Write-Host 'No se encontró winget en este equipo.' -ForegroundColor Red Write-Host 'Instala o actualiza "Instalador de aplicación" desde Microsoft Store y vuelve a ejecutar el script.' if ((Read-Host '¿Abrir Microsoft Store ahora? (S/N)') -match '^[sS]') { Start-Process 'ms-windows-store://pdp/?ProductId=9NBLGGH4NNS1' } Read-Host 'Presiona Enter para cerrar' | Out-Null exit 1 } $principal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent()) if (-not $principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) { Write-Host 'No estás como administrador: Windows puede pedir permiso para cada programa.' -ForegroundColor Yellow } Write-Host '' Write-Host "=== Instalando $($apps.Count) aplicaciones ===" -ForegroundColor Cyan # Códigos de salida de winget que significan "ya estaba instalado" $yaInstalado = @(-1978335189, -1978335135) $resumen = @() foreach ($app in $apps) { Write-Host '' Write-Host "> $($app.Nombre)" -ForegroundColor Cyan # winget list devuelve 0 si encuentra el programa instalado winget list --id $app.Id --exact --source $app.Fuente --accept-source-agreements | Out-Null if ($LASTEXITCODE -eq 0) { Write-Host ' Ya está instalado.' -ForegroundColor Gray $resumen += [pscustomobject]@{ Aplicación = $app.Nombre; Resultado = 'Ya estaba' } continue } winget install --id $app.Id --exact --source $app.Fuente --silent --accept-package-agreements --accept-source-agreements $codigo = $LASTEXITCODE if ($codigo -eq 0) { $resumen += [pscustomobject]@{ Aplicación = $app.Nombre; Resultado = 'Instalada' } } elseif ($yaInstalado -contains $codigo) { $resumen += [pscustomobject]@{ Aplicación = $app.Nombre; Resultado = 'Ya estaba' } } else { $resumen += [pscustomobject]@{ Aplicación = $app.Nombre; Resultado = ('Falló (código 0x{0:X8})' -f $codigo) } } } # ---------- resumen ---------- Write-Host '' Write-Host '=== Resumen ===' -ForegroundColor Cyan foreach ($r in $resumen) { $color = 'Green' if ($r.Resultado -like 'Falló*') { $color = 'Red' } elseif ($r.Resultado -eq 'Ya estaba') { $color = 'Gray' } Write-Host ('{0,-40} {1}' -f $r.Aplicación, $r.Resultado) -ForegroundColor $color } $fallas = @($resumen | Where-Object { $_.Resultado -like 'Falló*' }).Count if ($fallas -gt 0) { Write-Host '' Write-Host 'Algunas fallaron. Revisa la conexión a internet o prueba de nuevo como administrador.' -ForegroundColor Yellow } Write-Host '' Write-Host '¿Necesitas preparar varios equipos? En BAIT lo hacemos por ti: https://bait.cl' Read-Host 'Presiona Enter para cerrar' | Out-Null