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

- Link: https://binariocero.com/windows/script-powershell-para-instalar-software-desde-archivos-comprimidos-o-msi-solo-si-no-esta-instalado
- Published: 2025-06-07T20:38:00+02:00
- Author: Juan José Fernández Durán

![Loading](https://binariocero.com/wp-content/plugins/page-views-count/ajax-loader-
2x.gif)

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:

    ```wp-block-preformatted
    $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

    ```wp-block-preformatted
    # === 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 archivoWrite-Host "Descargando $softwareName desde: $downloadUrl" -ForegroundColor CyanInvoke-WebRequest -Uri $downloadUrl -OutFile $tempFileif (-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ónif (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 archivoswitch ($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 temporalesRemove-Item $tempFile -ForceRemove-Item $extractPath -Recurse -ForceWrite-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.
