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?
- Comprueba si está instalado buscando el nombre en el registro.
- Descarga el archivo desde una URL.
- Detecta el tipo de archivo (.zip, .msi, .7z, .rar).
- Extrae o ejecuta directamente el instalador.
- Instala en modo silencioso con los argumentos definidos.
- 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.