martes, 12 de febrero de 2013

Instalando desde la línea de comandos

Hace poco requería conseguir una manera de centralizar desde un mismo punto la instalación de los programas Gpg4win y MORFIS, este último esta desarrollo con .Net 1.1 por lo tanto es un requisito. Pero me urgía hacer esto, así que en ese momento creí que la forma más rápida para hacerlo era con un archivo .bat.

Para lanzar los instaladores solo necesitaba hacer uso del comando start.

start /wait gpg4win.exe
start /wait aspnet1_1.exe /Q
start /wait aspnet1_1sp1.exe /Q
start /wait morfis_setup.ex /qr

El modificador /wait obliga al command a esperar que termine de ejecutarse el exe, modificador /Q y /qr reduce la interacción del usuario con los instaladores. Para el caso del .Net 1.1 SP1 no se presenta ni pantalla.

Para evitar los ruidos de los exes y otros comandos se debe apagar los mensajes de salida con echo.

@echo off

Pero la instalación del .Net está condicionoda por su presencia, así que lo primero es saber como Windows me informa de la presencia de .Net 1.1, san Google me ayudo a encontrar ese dato en un artículo de MS. Era de esperarse que esa información estuviera en el registro de Windows, para poder consultar el regedit, Windows a puesto a mi disposición el comando reg query, pero necesitaba poder leer la salida del este comando así que hice uso de findstr.

reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v1.1.4322" /v install | findstr 0x1

reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v1.1.4322" /v SP | findstr 0x1

reg query "HKLM\SOFTWARE\Wow6432Node\Microsoft\NET Framework Setup\NDP\v1.1.4322" /v Install | findstr 0x1

reg query "HKLM\SOFTWARE\Wow6432Node\Microsoft\NET Framework Setup\NDP\v1.1.4322" /v SP | findstr 0x1

Tengo que hacer 4 consultas porque las llaves cambian según la arquitectura y se deben leer do valores de una llave, el primer valor es para saber si está instalado .Net 1.1 y el segundo valor para saber si ya tiene su SP1. El modificador /v del comando reg query le indica que busque un valor especifico en la llave especificada, el operador | (pipe) redirecciona la salida de reg query a la entrada de findstr al cual le indico que busque la cadena "0x1", si lo encuentra findstr retorna el código 0 de lo contrario 1.

Con un if puedo verificar el código de retorno de findstr y modificar la linea de ejecución con un goto.

reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v1.1.4322" /v install | findstr 0x1
IF %errorlevel% == 0 SET netv1sp1=%netv1sp1%1

reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v1.1.4322" /v SP | findstr 0x1
IF %errorlevel% == 0 SET netv1sp1=%netv1sp1%1

reg query "HKLM\SOFTWARE\Wow6432Node\Microsoft\NET Framework Setup\NDP\v1.1.4322" /v Install | findstr 0x1
IF %errorlevel% == 0 SET netv1sp1=%netv1sp1%1

reg query "HKLM\SOFTWARE\Wow6432Node\Microsoft\NET Framework Setup\NDP\v1.1.4322" /v SP | findstr 0x1
IF %errorlevel% == 0 SET netv1sp1=%netv1sp1%1

IF "%netv1sp1%" == "11" goto morfis
IF "%netv1sp1%" == "" goto ambos
IF "%netv1sp1%" == "1" goto servicepack

El codigo de retorno se almacena en la variable errorlevel si está es igual a cero uso el comando set para saber que tengo instalado en la PC, la variable netv1sp1 puede tener 3 valores. (Para obtener los valores de la variables estás se deben encerrar con  %):
  1. "11": Net 1.1 está instalado y tiene su SP1 así que paso directo a instalar MORFIS
  2. "1": Está instalado .Net 1.1 pero hace falta el SP1
  3. "": Hay que instalar .Net 1.1 y su SP1
Optimece el bat para que funcione en con Windows XP, no vaya hacer me encuentre con un cavernícola que aún lo use.

Para finalizar uso el comando pause.

El resultado final del bat es:

@echo off
echo ==============================================================
echo NO CIERRE ESTA VENTANA
echo ==============================================================
echo 1. Iniciando la Instalación
echo 1.2 Instalando GnuPG
start /wait GnuPG\gpg4win-light-2.1.0.exe

echo 1.3 Instalando Morfis

reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v1.1.4322" /v install | findstr 0x1
IF %errorlevel% == 0 SET netv1sp1=%netv1sp1%1

reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v1.1.4322" /v SP | findstr 0x1
IF %errorlevel% == 0 SET netv1sp1=%netv1sp1%1

reg query "HKLM\SOFTWARE\Wow6432Node\Microsoft\NET Framework Setup\NDP\v1.1.4322" /v Install | findstr 0x1
IF %errorlevel% == 0 SET netv1sp1=%netv1sp1%1

reg query "HKLM\SOFTWARE\Wow6432Node\Microsoft\NET Framework Setup\NDP\v1.1.4322" /v SP | findstr 0x1
IF %errorlevel% == 0 SET netv1sp1=%netv1sp1%1

IF "%netv1sp1%" == "11" goto morfis
IF "%netv1sp1%" == "" goto ambos
IF "%netv1sp1%" == "1" goto servicepack 

:ambos
echo 1.3.1 Instalando net v1.1
start /wait aspnet1_1.exe /Q

:servicepack
echo 1.3.1 Instalando net v1.1 sp 1
start /wait aspnet1_1sp1.exe /Q

:morfis
start /wait morfis_setup.exe /qr

echo INSTALACACIÓN COMPLETA
pause

No hay comentarios:

Publicar un comentario

´