Menu.bat Una forma cómoda de ejecutar comandos y aplicaciones, por ejemplo para Maven

2
40630

Menu.bat Una forma cómoda de ejecutar comandos y aplicaciones, por ejemplo para Maven

Índice de contenidos

1. Introducción
2. Ventajas de usar el menu.bat en los desarrollos
3. El menú menu.bat
4. Añadiendo una opción de menú
5. Un menu.bat de producción
6. Portarlo a Linux y Unix
7. Conclusión

1. Introducción

El trabajo diario con entornos de desarrollo complejos normalmente está plagado de tareas repetitivas que se deben realizar, muchas de las cuales se realizan mediante ficheros de procesos por lotes o scripts en Windows o Unix.

Para resolver este problema he creado un menú genérico en formato Windows que es muy fácil de modificar, añadiéndole funcionalidades. Este menú organiza la forma de ejecuta tareas, comandos y aplicaciones repetitivas o comunes.

Como responsable de desarrollo para diversas empresas siempre que comienzo un proyecto y organizo el entono de desarrollo me creo un pequeño menú.bat. Este archivo lo coloco siempre en la raíz del código fuente del proyecto, de manera que se sube al control de versiones con el resto del proyecto.

Puede parecer simple, pero los que lo prueban, y lo digo por experiencia, cuando comienzan un nuevo proyecto Maven lo primero que hacen es copiar mi menú.bat y modifícalo…

2. Ventajas de usar el menu.bat en los desarrollos

El hecho de utilizar este menú en los desarrollos tiene varias ventajas:

  • Acelera las tareas repetitivas. Por ejemplo podemos crear opciones de menú para compilar, probar, desplegar, compilar y probar con otras condiciones o perfiles, etc.
  • Se integra dentro del código fuente del proyecto con facilidad y su mantenimiento y control de versiones es simple.
  • Documenta claramente qué tareas se han definido dentro del entorno de desarrollo.
  • No requiere instalar software adicional en el PC de desarrollo.
  • Facilitar la curva de aprendizaje cuando se incorpora un nuevo miembro al proyecto.
  • Está preparado para Windows 7 y XP, aunque se puede portar con facilidad a otros entornos.
  • Se puede realizar fácilmente la versión Unix para la Shell.

3. El menú menu.bat

Vamos a comenzar por una versión simple:

@echo off
echo ########################################################
echo .
echo . menu.bat Meny para ejecución sencilla de tareas
echo . (C) Cristobal Gonzalez Almiron 2014
echo .
echo ########################################################
echo .



rem ########################################################

rem #### Subcommands execution
IF NOT "%1"=="" GOTO subcomandos

rem ########################################################


:menu_start
rem Variables actuales
rem Aña
echo .
echo . -------------------------------------------
echo .    Menu JDYNAMICS
echo . -------------------------------------------
set OPTION=1
SET CHOICE=

:menu
set CHOICES=
rem only for debbuging
rem echo CHOICE: %CHOICE%
rem  OPTION: %OPTION%

rem ########################################################
rem Opciones de menú
rem ########################################################



set LABEL=compilarLimpio
set TEXT=Compilar proyecto
set KEY=0
if "%CHOICE%"=="" echo . %KEY%. %TEXT%  
if "%OPTION%"=="%CHOICE%" OPCION ELEGIDA:  %KEY%. %TEXT%  
if "%OPTION%"=="%CHOICE%" start %CD%\menu.bat %LABEL%
if "%OPTION%"=="%CHOICE%" goto menu_start
set CHOICES=%CHOICES%%KEY%
set /a "OPTION+=1"


rem ########################################################

echo .
choice /C %CHOICES%
set CHOICE=%errorlevel%
set OPTION=1
goto menu


rem ########################################################
rem 
rem Subcomandos externos: se ejecutan en procesos separados
rem 
rem ########################################################

:subcomandos
echo . -------------------------------------------
echo .    Menu jdynamics . Subcomando %1
echo . -------------------------------------------

rem Ejecución del subcomando
goto %1

echo .
echo ERROR. Subcomando no reconocido %1
echo . 
pause
goto end

rem ########################################################
ren Subcomandos
rem ########################################################


:compilarLimpio
call mvn  clean install
goto end



rem ########################################################

:end
pause
exit

Al ejecutar el menu.bat nos aparece esta ventana de comandos:

Cuando pulsemos sobre la opción 0 se abrirá una ventana adicional y comenzará la ejecución del subcomando, permaneciendo siempre abierto el menu.bat. De esta manera podremos lanzar las opciones del menú a conveniencia.

4. Añadiendo una opción de menú

Bien, ya tenemos nuestro menú básico. Vamos a añadirle una opción de menú. Además lo vamos a hacer con un poco de gracia:

  • La opción de menú debe ejecutar el comando «mvn jetty:run» que inicia un servidor de aplicaciones en local.
  • Además queremos abrir un navegador con la dirección http://localhost:8080/miapp/ automáticamente
  • Como premio, queremos que además el navegador tarde unos segundos en abrirse, pues queremos que le dé tiempo a la aplicación a levantarse.

Esto es lo que he añadido:

@echo off
echo ########################################################
echo .
echo . menu.bat Meny para ejecución sencilla de tareas
echo . (C) Cristobal Gonzalez Almiron 2014
echo .
echo ########################################################
echo .



rem ########################################################

rem #### Subcommands execution
IF NOT "%1"=="" GOTO subcomandos

rem ########################################################


:menu_start
rem Variables actuales
rem Aña
echo .
echo . -------------------------------------------
echo .    Menu JDYNAMICS
echo . -------------------------------------------
set OPTION=1
SET CHOICE=

:menu
set CHOICES=
rem only for debbuging
rem echo CHOICE: %CHOICE%
rem  OPTION: %OPTION%

rem ########################################################
rem Opciones de menú
rem ########################################################



set LABEL=compilarLimpio
set TEXT=Compilar proyecto
set KEY=0
if "%CHOICE%"=="" echo . %KEY%. %TEXT%  
if "%OPTION%"=="%CHOICE%" OPCION ELEGIDA:  %KEY%. %TEXT%  
if "%OPTION%"=="%CHOICE%" start %CD%\menu.bat %LABEL%
if "%OPTION%"=="%CHOICE%" goto menu_start
set CHOICES=%CHOICES%%KEY%
set /a "OPTION+=1"

set LABEL=ejecutar
set TEXT=Ejecutar proyecto
set KEY=r
if "%CHOICE%"=="" echo . %KEY%. %TEXT%  
if "%OPTION%"=="%CHOICE%" OPCION ELEGIDA:  %KEY%. %TEXT%  
if "%OPTION%"=="%CHOICE%" start %CD%\menu.bat %LABEL%
if "%OPTION%"=="%CHOICE%" goto menu_start
set CHOICES=%CHOICES%%KEY%
set /a "OPTION+=1"


rem ########################################################

echo .
choice /C %CHOICES%
set CHOICE=%errorlevel%
set OPTION=1
goto menu


rem ########################################################
rem 
rem Subcomandos externos: se ejecutan en procesos separados
rem 
rem ########################################################

:subcomandos
echo . -------------------------------------------
echo .    Menu jdynamics . Subcomando %1
echo . -------------------------------------------

rem Ejecución del subcomando
goto %1

echo .
echo ERROR. Subcomando no reconocido %1
echo . 
pause
goto end

rem ########################################################
ren Subcomandos
rem ########################################################


:explorer
timeout %3
start iexplore.exe %2
exit 0


:compilarLimpio
call mvn  clean install
goto end

:ejecutar
start menu.bat explorer http://localhost:8080/miapp/ 35
call mvn clean install jetty:run
goto end


rem ########################################################

:end
pause
exit

La ejecución del menú ahora muestra lo siguiente:

Hemos añadido tres cosas:

  • Una nueva opción dentro del menú principal. Simplemente hemos copiado y pegado una opción ya existente y hemos modificado las tres primeras líneas de la nueva opción.
  • Hemos añadido el subcomando «ejecutar»
  • También hemos añadido el subcoamndo «explorer», que será llamado desde el subcomando «ejecutar»

Y para los aventureros: ¿porqué abro el navegador antes de ejecutar el comando «mvn clean install jetty:run»?

5. Un menu.bat de producción

Os dejo un ejemplo real de un menu.bat un poco más largo. Si lo estudiáis veréis varias técnicas útiles para vuestros proyectos:

@echo off
echo ########################################################
echo .
echo . menu.bat Meny para ejecución sencilla de tareas
echo . (C) Cristobal Gonzalez Almiron 2014
echo .
echo ########################################################
echo .
rem obtener la unidad actual conservando la ruta actual
IF NOT DEFINED JDYNAMICS_PATH SET JDYNAMICS_PATH=%CD%
cd \
set ROOT_DRIVE=%CD%
cd /D %JDYNAMICS_PATH%

rem Varaiables de entorno por defecto

IF NOT DEFINED JAVA_HOME SET JAVA_HOME=C:\Program Files\Java\jdk1.6.0_25
IF NOT DEFINED MVN_PATH set PATH=%ROOT_DRIVE%apps\apache-maven-2.2.1\bin;%PATH%
IF NOT DEFINED MVN_PATH SET MVN_PATH=%ROOT_DRIVE%apps\apache-maven-2.2.1\bin
IF NOT DEFINED MYSQL_PATH SET MYSQL_PATH="c:\Program Files\MySQL\MySQL Server 5.1\bin"
IF NOT DEFINED TARGET SET TARGET=%JDYNAMICS_PATH%\target


rem Opciones de Maven
rem set MAVEN_OPTS="-Dfile.encoding=ISO-8859-1" 
IF NOT DEFINED MAVEN_SETTINGS set MAVEN_SETTINGS=-s%JDYNAMICS_PATH%\settings.xml
IF NOT DEFINED MAVEN_OFFLINE SET MAVEN_OFFLINE=-o
rem - Por defecto aumentamos la memoria para evitar problemas de PermGen
rem - Si es necesario aumentar o midificar estas opciones a medida que el 
rem   proyecto se complique
if not defined MAVEN_OPTS set MAVEN_OPTS="-XX:MaxPermSize=1024m"


rem ########################################################

rem #### Subcommands execution
IF NOT "%1"=="" GOTO subcomandos

rem ########################################################

echo Variables iniciales:
echo ROOT_DRIVE=%ROOT_DRIVE%
echo CD=%CD%
echo JAVA_HOME=%JAVA_HOME%
echo JDYNAMICS_PATH=%JDYNAMICS_PATH%
echo MAVEN_OPTS=%MAVEN_OPTS%
echo MAVEN_SETTINGS=%MAVEN_SETTINGS%
echo MAVEN_OFFLINE=%MAVEN_OFFLINE%
echo MYSQL_PATH=%MYSQL_PATH%

:menu_start
rem Variables actuales
rem Aña
echo .
echo . -------------------------------------------
echo .    Menu JDYNAMICS
echo . -------------------------------------------
set OPTION=1
SET CHOICE=

:menu
set CHOICES=
rem only for debbuging
rem echo CHOICE: %CHOICE%
rem  OPTION: %OPTION%

rem ########################################################
rem Opciones de menú
rem ########################################################



set LABEL=compilarLimpio
set TEXT=Compilar Jdynbamics completo limpiando .m2/repositories/es/com/jdynamics
set KEY=0
if "%CHOICE%"=="" echo . %KEY%. %TEXT%  
if "%OPTION%"=="%CHOICE%" OPCION ELEGIDA:  %KEY%. %TEXT%  
if "%OPTION%"=="%CHOICE%" start %CD%\menu.bat %LABEL%
if "%OPTION%"=="%CHOICE%" goto menu_start
set CHOICES=%CHOICES%%KEY%
set /a "OPTION+=1"

set LABEL=compilarcore
set TEXT=Compilar Jdynbamics Main y Core
set KEY=1
if "%CHOICE%"=="" echo . %KEY%. %TEXT%  
if "%OPTION%"=="%CHOICE%" echo OPCION ELEGIDA:  %KEY%. %TEXT%  
if "%OPTION%"=="%CHOICE%" start %CD%\menu.bat %LABEL%
if "%OPTION%"=="%CHOICE%" goto menu_start
set CHOICES=%CHOICES%%KEY%
set /a "OPTION+=1"


set LABEL=compilarcoremgr
set TEXT=Compilar Jdynbamics Core Manager
set KEY=2
if "%CHOICE%"=="" echo . %KEY%. %TEXT%  
if "%OPTION%"=="%CHOICE%" echo OPCION ELEGIDA:  %KEY%. %TEXT%  
if "%OPTION%"=="%CHOICE%" start %CD%\menu.bat %LABEL%
if "%OPTION%"=="%CHOICE%" goto menu_start
set CHOICES=%CHOICES%%KEY%
set /a "OPTION+=1"

echo .

set LABEL=testjdynamicsbuilder
set TEXT=Tests Unitarios Jdynbamics Builder
set KEY=t
if "%CHOICE%"=="" echo . %KEY%. %TEXT%  
if "%OPTION%"=="%CHOICE%" echo OPCION ELEGIDA:  %KEY%. %TEXT%  
if "%OPTION%"=="%CHOICE%" start %CD%\menu.bat %LABEL%
if "%OPTION%"=="%CHOICE%" goto menu_start
set CHOICES=%CHOICES%%KEY%
set /a "OPTION+=1"


echo .

set LABEL=compilarjdadmin
set TEXT=Compilar Jdynbamics JDAdmin para JSF2
set KEY=j
if "%CHOICE%"=="" echo . %KEY%. %TEXT%  
if "%OPTION%"=="%CHOICE%" echo OPCION ELEGIDA:  %KEY%. %TEXT%  
if "%OPTION%"=="%CHOICE%" start %CD%\menu.bat %LABEL%
if "%OPTION%"=="%CHOICE%" goto menu_start
set CHOICES=%CHOICES%%KEY%
set /a "OPTION+=1"

echo .

set LABEL=compilarwebcontrol2
set TEXT=Compilar Jdynbamics Webcontrol V2 para JSF2
set KEY=w
if "%CHOICE%"=="" echo . %KEY%. %TEXT%  
if "%OPTION%"=="%CHOICE%" echo OPCION ELEGIDA:  %KEY%. %TEXT%  
if "%OPTION%"=="%CHOICE%" start %CD%\menu.bat %LABEL%
if "%OPTION%"=="%CHOICE%" goto menu_start
set CHOICES=%CHOICES%%KEY%
set /a "OPTION+=1"

rem ########################################################

echo .
choice /C %CHOICES%
set CHOICE=%errorlevel%
set OPTION=1
goto menu


rem ########################################################
rem 
rem Subcomandos externos: se ejecutan en procesos separados
rem 
rem ########################################################

:subcomandos
echo . -------------------------------------------
echo .    Menu jdynamics . Subcomando %1
echo . -------------------------------------------
echo MAVEN_OPTS=%MAVEN_OPTS%

rem Ejecución del subcomando
goto %1

echo .
echo ERROR. Subcomando no reconocido %1
echo . 
pause
goto end

rem ########################################################
ren Subcomandos
rem ########################################################


:explorer
timeout %3
start iexplore.exe %2
exit 0

:compilarLimpio
rmdir /s /q %USERPROFILE%\.m2\repository\es\com\jdynamics
if "%errorlevel%"=="0" echo Repositorio maven local borrado
call mvn  clean install
goto end


:compilarcore
cd jdynamics-main
call mvn clean install
cd ..\jdynamics-core
call mvn clean install
goto end

:compilarcoremgr
cd jdynamics-coremgr
call mvn clean install
goto end


:compilarwebcontrol
start menu.bat explorer http://localhost:8080/webcontrol/ 35
cd webcontrol
call mvn clean install dependency:analyze jetty:run
goto end

:compilarwebcontrol2
start menu.bat explorer http://localhost:8080/jdynamics/webcontrol/main.xhtml 35
cd webcontrol2
call mvn clean install dependency:analyze jetty:run
goto end

:compilarjdadmin
start menu.bat explorer http://localhost:8080/jdynamics/jdadmin/main.xhtml 35
cd jdadmin
call mvn clean install dependency:analyze-report dependency:analyze jetty:run
goto end


:testjdynamicsbuilder
cd jdynamics-builder
call mvn clean test dependency:analyze -DskipTests=false -Dtest=PageBuilderTest#testPageBuilder_children
goto end



:end
pause
exit

Y el resultado en pantalla es:

Algunas cosas interesantes:

  • Suelo añadir una opción 0 al principio que limpia todo y recompila todo. Le solemos llamar el «cerapio», pues cuando tienes problemas de compilación, de bibliotecas, etc, basta darle al “cerapio” para que muchos de ellos desaparezcan. Sirve además como «prueba del algodón», es decir, actualizo desde control de versiones, le doy al cerapio y luego ejecuto lo que ha desarrollado otro.
  • Hay técnicas usadas en proyectos Maven multimódulo, por ejemplo con cambios de directorio, ejecución de pruebas unitarias, uso de perfiles específicos, etc.
  • Preparo variables de entorno previas a la ejecución de los subcomandos, incluyendo la ruta y unidad actual

6. Portarlo a Linux y Unix

No es nada difícil portar este tipo de menú a Shell script de Unix. Pero eso os lo dejo de ejercicio.

7. Conclusión

En este tutorial hemos aprendido a crear un menú para nuestros desarrollos sobre Windows, de forma muy sencilla y que documenta claramente las tareas de desarrollo habituales. De esta forma facilitamos el desarrollo a todos los miembros del proyecto.

A partir de ahora en nuestros proyecto probablemente siempre pongamos en el directorio raíz un «menu.bat»

Consultor de desarrollo de proyectos informáticos. Su experiencia profesional se ha desarrollado en empresas como Compaq, HP, Mapfre, Endesa, Repsol, Universidad Autónoma de Madrid, en las áreas de Desarrollo de Software (Orientado a Objetos), tecnologías de Internet, Técnica de Sistemas de alta disponibilidad y formación a usuarios.

2 COMENTARIOS

  1. Buenos dias Amigo. Saludos. Queria saber si Ud presta servicios de programacion de archivos por lotes con un Work Flow especifico. Digamos lo soguiente:

    1.- Desinstalar un Software via windows o via ejecucion de un software donde debemos pasar ciertos parametros.
    2.- Copiar una carpeta desde una ruta especifica en el perfil de windows a otra ruta en la misma pc
    3.- Instalar el mismo software que se desinstalo en el paso 1 donde se pasan ciertos parametros.

    Yo me encuentro en Ciudad de Mexico. Me comentas por favor. Muchas Gracias. !

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad