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»
tengo una pregunta, como podría en un menú bach iniciar archivos anterior mente creados .bat
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. !