Script PowerShell para Instalar Software desde Archivos Comprimidos o .MSI (Sólo si No Está Instalado)

Artículos Guías Manuales Sistemas Linux Windows Redes MySql Binario 0 Binario Cero Artículos Guías Manuales Sistemas Linux Windows Redes MySql Binario 0 Binario Cero

Cuando automatizamos la instalación de software en Windows, puede ser necesario trabajar con distintos formatos de distribución: .zip, .msi, .7z, .rar, etc. Este artículo presenta un script PowerShell flexible que:

Verifica si el software ya está instalado.
Descarga automáticamente el archivo comprimido o el instalador.
Extrae si es necesario (.zip, .rar, .7z).
Ejecuta la instalación en modo silencioso.
Limpia los archivos temporales.

Formatos soportados

Este script soporta los siguientes formatos de instalación:

  • .msi → Instalador ejecutable de Windows.
  • .zip → Archivo comprimido (nativo en PowerShell).
  • .7z, .rar → Requieren 7-Zip instalado (o portable).

Variables personalizables

Para usar el script, debes editar las siguientes variables:

$softwareName = "NombreDelSoftware"                  # Nombre del software en el registro de Windows
$downloadUrl = "https://ejemplo.com/archivo.7z" # URL directa del archivo a descargar
$silentArgs = "/quiet" # Argumentos para instalación silenciosa (por tipo)

Requisitos

  • PowerShell 5.0 o superior.
  • Ejecutar como Administrador.
  • 7-Zip debe estar instalado o accesible como binario (puedes usar versión portable).
  • Conexión a Internet para descargar el archivo.

Script PowerShell Generalizado

# === PERSONALIZAR ESTAS VARIABLES ===
$softwareName = "NombreDelSoftware"
$downloadUrl = "https://ejemplo.com/archivo.7z"
$silentArgs = "/quiet" # Para .msi usa /quiet, para .exe normalmente /S
# =====================================

# Rutas temporales
$fileName = [System.IO.Path]::GetFileName($downloadUrl)
$tempFile = "$env:TEMP\$fileName"
$extractPath = "$env:TEMP\SoftwareInstall"

# Comprobación previa: ¿Ya está instalado?
$installed = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*" `
-ErrorAction SilentlyContinue | Where-Object { $_.DisplayName -like "*$softwareName*" }

if ($installed) {
Write-Host "$softwareName ya está instalado. No se realizará ninguna acción." -ForegroundColor Yellow
exit 0
}

# Descargar el archivo
Write-Host "Descargando $softwareName desde: $downloadUrl" -ForegroundColor Cyan
Invoke-WebRequest -Uri $downloadUrl -OutFile $tempFile

if (-Not (Test-Path $tempFile)) {
Write-Error "Error al descargar el archivo."
exit 1
}

# Detectar extensión
$ext = [System.IO.Path]::GetExtension($tempFile).ToLower()

# Crear carpeta de extracción
if (Test-Path $extractPath) { Remove-Item $extractPath -Recurse -Force }
New-Item -ItemType Directory -Path $extractPath | Out-Null

# Función para buscar el primer instalador (.exe o .msi)
function Find-Installer($path) {
return Get-ChildItem -Path $path -Recurse -Include *.exe, *.msi | Select-Object -First 1
}

# Procesar por tipo de archivo
switch ($ext) {
".msi" {
Write-Host "Instalando archivo MSI..." -ForegroundColor Cyan
Start-Process "msiexec.exe" -ArgumentList "/i `"$tempFile`" $silentArgs" -Wait -Verb RunAs
}
".zip" {
Expand-Archive -Path $tempFile -DestinationPath $extractPath -Force
$installer = Find-Installer $extractPath
if ($installer) {
Start-Process -FilePath $installer.FullName -ArgumentList $silentArgs -Wait -Verb RunAs
} else {
Write-Error "No se encontró instalador dentro del ZIP."
}
}
".7z" | ".rar" {
# Requiere 7-Zip instalado
$sevenZip = "${env:ProgramFiles}\7-Zip\7z.exe"
if (-Not (Test-Path $sevenZip)) {
Write-Error "7-Zip no está instalado en $sevenZip."
exit 1
}
& $sevenZip x $tempFile -o"$extractPath" -y | Out-Null
$installer = Find-Installer $extractPath
if ($installer) {
Start-Process -FilePath $installer.FullName -ArgumentList $silentArgs -Wait -Verb RunAs
} else {
Write-Error "No se encontró instalador en el archivo extraído."
}
}
default {
Write-Error "Formato de archivo no soportado: $ext"
exit 1
}
}

# Limpieza de archivos temporales
Remove-Item $tempFile -Force
Remove-Item $extractPath -Recurse -Force

Write-Host "Instalación de $softwareName completada." -ForegroundColor Green

¿Cómo funciona?

  1. Comprueba si está instalado buscando el nombre en el registro.
  2. Descarga el archivo desde una URL.
  3. Detecta el tipo de archivo (.zip, .msi, .7z, .rar).
  4. Extrae o ejecuta directamente el instalador.
  5. Instala en modo silencioso con los argumentos definidos.
  6. Limpia archivos temporales.

Consejos útiles

  • Para .exe no estandarizados, asegúrate de conocer los argumentos de instalación silenciosa del fabricante (/S, /quiet, /qn, etc.).
  • Si quieres mayor compatibilidad, puedes incluir comprobación en el registro de WOW6432Node para programas de 32 bits.
  • Puedes adaptar el script para integrarlo en scripts de dominio, tareas programadas o despliegues automatizados.
Binario 0
Resumen de privacidad

Esta web utiliza cookies para que podamos ofrecerte la mejor experiencia de usuario posible. La información de las cookies se almacena en tu navegador y realiza funciones tales como reconocerte cuando vuelves a nuestra web o ayudar a nuestro equipo a comprender qué secciones de la web encuentras más interesantes y útiles.