En este artículo NO pretendo enseñar todo lo que se puede realizar con un archivo bat. Lo que voy a hacer es plantear una situación y la voy a resolver utilizando un archivo bat, enseñando una serie de trucos en el camino.
El problema a resolver
Constantemente desarrollo varias aplicaciones web. Todas las aplicaciones que realizo comienzan con la misma estructura básica (carpetas, archivos, etc). El problema está en que no me acuerdo de memoria todos los componentes de esta estructura y tengo que perder tiempo mirando otros proyectos para acordarme. En realidad pierdo como unos 30 minutos antes de comenzar cada proyecto y me gustaría hacer un pequeño programa que hiciera esto por mí.
La estructura a crear
Vamos a suponer que la estructura que quiero crear es bastante básica y es la siguiente:
- nomproyecto
- inc
- estilos
- reset.css
- main.css
- imagenes
- scripts
- jquery.js
- estilos
- index.html
- inc
La carpeta nomproyecto es una carpeta que identifica a mi proyecto. Como todos mis proyectos son distintos, el nombre de esta carpeta va a cambiar así que voy a necesitar que mi programa pida este nombre.
La carpeta inc contiene a todas las carpetas con los archivos que debe incluir mi proyecto como hojas de estilos, imágenes y scripts. Además cuento con los archivos reset.css y main.css. El reset.css lo utilizo para reiniciar todos los estilos de la página (para no tener problemas en distintos navegadores). El main.css es el que contendrá los estilos para esta aplicación. El archivo jquery.js es la librería jQuery de javascript que utilizo en muchos de mis proyectos.
El archivo index.html contendrá el HTML de la página de inicio.
Esta estructura no es muy completa ni tampoco es la que uso en mis aplicaciones pero sirve para mostrar todos los trucos de archivos bat que quiero mostrar.
Mi primer archivo bat
Lo primero que tenemos que hacer es crear un archivo bat y probar que funciona. Para esto voy a crear un bat para el popular programa Hola Mundo:
- Crea un nuevo archivo y llámalo crear_proyecto.bat
- Abre el archivo con un editor de texto (clic derecho -> Abrir con –> Tu editor de texto)
- Colócale el siguiente contenido:
REM Deshabilitando echo @ECHO OFF CLS REM Imprimiendo hola mundo ECHO Hola Mundo PAUSE
- Guarda el archivo con encoding ANSI. (Si usas un editor de texto decente debes tener esta opción, notepad usa esta opción por defecto).
- Dale doble clic al archivo crear_proyecto.bat
Como puedes ver ha aparecido una ventana de línea de comandos con el texto ‘Hola Mundo’. Si presionas una tecla el programa se cerrará.
En este pequeño código hay 5 nuevos comandos:
- El comando REM se utiliza para comentarios. Todo lo que siga despues de este comando se considera un comentario.
- El comando @ECHO OFF deshabilita la impresión de los comandos. Esta opción no es indispensable pero si la quitas verás que no solo se muestra el resultado del comando sino que también se muestra el comando ingresado. Quita esta línea y mira la diferencia.
- El comando CLS limpia la pantalla borrando todo lo escrito hasta el momento.
- El comando ECHO se utiliza para mostrar texto. Todo lo que venga después de este comando se mostrará en pantalla.
- El comando PAUSE se utiliza para hacer una pausa en algún momento de la ejecución. Este comando muestra el texto "Presione una tecla para continuar…" y se detiene hasta que se presione una tecla.
Algoritmo básico
Antes de comenzar voy a definir el algoritmo básico que utilizaré en mi archivo bat. Con este algoritmo puedes darte cuenta de los trucos que vas a aprender.
Mostrar Bienvenida Inicializar constantes y variables Pedir nombre del proyecto Si existe un proyecto con ese nombre Mostrar mensaje de error Terminar el programa en caso contrario Crear carpetas del proyecto Copiar los archivos reset.css y jquery.js desde mi repositorio Crear los archivos main.css e index.html con el contenido por defecto
Lo que te recomiendo que hagas es copiar el algoritmo en tu archivo bat y a medida que vamos avanzando puedes ir reemplazando el algoritmo con código.
Mostrar Bienvenida
La bienvenida, es simplemente un mensaje que vamos a mostrar para que quede claro que es lo que hace este archivo bat.
@ECHO OFF REM Mostrar Bienvenida ECHO ****************************************************** ECHO * CREAR ESTRUCTURA DE APLICACION WEB * ECHO * * ECHO * Este programa crea la estructura basica para un * ECHO * proyecto web. Crea una serie de carpetas y copia * ECHO * archivos desde el repositorio. * ECHO ****************************************************** ECHO. ECHO. ECHO Si no quieres continuar cierra la ventana. ECHO. ECHO. PAUSE
En la primera línea desactivo el ECHO, luego imprimo una serie de mensajes y termino con PAUSE para detener temporalmente la aplicación.
Nota que algunas líneas tienen el comando ECHO seguido imediatamente por un punto. Estas líneas representan líneas en blanco. Si el punto NO está pegado al comando ECHO entonces se mostrará una línea con un punto en ella.
Inicializar constantes y variables
En realidad, solo definiré variables pero como no las voy a modificar en el camino en realidad las considero como constantes.
Una variable se define utilizando el comando SET y tiene la siguiente sintaxis SET <nombre> = <valor>. Luego puedo utilizar la variable en cualquier lado del código encerrándola entre signos de porcentaje como por ejemplo %nombre%.
REM Inicializar constantes y variables CLS SET RUTA_REPOSITORIO=C:\Copstone\Repositorio SET RUTA_RAIZ=C:\Apache2.2\htdocs
En este caso estoy declarando dos variables. La primera llamada RUTA_REPOSITORIO que indica la ruta en donde se encuentra mi repositorio de archivos. De este repositorio obtendré el archivo reset.css, jquery.js y las imagenes. La segunda se llama RUTA_RAIZ y representa la ruta donde está ubicada la raiz de mi servidor web (Si trabajas con IIS será C:\Inetpub\wwwroot).
La idea de definir variables es para no repetir código en el resto de mi archivo bat y que sea más fácil el mantenimiento del mismo.
Pedir nombre del proyecto
Ahora necesitamos que se solicite el nombre del proyecto para saber como se llamará la carpeta del proyecto.
REM Pedir nombre del proyecto SET /P NOMBRE_PROYECTO=Ingrese el nombre del proyecto:
Si te das cuenta, esta instrucción es la misma a la inicializar variables, con la única diferencia que al comando SET se le está agregando el parámetro /P que indica que se debe solicitar un dato al usuario. Al estar presente este parámetro, el texto "Ingrese el nombre del proyecto:" no se asignará a la variable NOMBRE_PROYECTO sino que solamente se imprimirá. El valor que ingreses cuando salga esta pregunta es el que se almacenará en la variable NOMBRE_PROYECTO.
Validar que no exista el proyecto
Ahora debemos validar que no exista un proyecto con este nombre. Si existiera mostraremos un mensaje de error y saldremos del programa. En caso contrario continuaremos con el resto del algoritmo.
REM Si NO existe un proyecto con ese nombre IF NOT EXIST %RUTA_RAIZ%\%NOMBRE_PROYECTO% GOTO :CONTINUAR ECHO. ECHO Error! Ya existe un proyecto con el nombre %NOMBRE_PROYECTO% ECHO en la ruta %RUTA_RAIZ% ECHO. ECHO. PAUSE EXIT :CONTINUAR REM A partir de aqui continua el programa
En la segunda línea estamos preguntando si NO existe un proyecto en la raiz de mi servidor web con este nombre. Si no existiera se invoca al comando GOTO que produce un salto a la línea 12. El comando GOTO permite saltar hacia arriba o hacia abajo del programa. Todos los saltos de GOTO deben especificar a la etiqueta a la que saltarán y todas las etiquetas deben comenzar con dos puntos (:) tal y como se ve en la etiqueta :CONTINUAR.
Al producirse el salto se está obviando el código de las líneas 3 hasta la 11 por lo que no se mostrará el mensaje de error.
Si existiera un proyecto con este nombre, no se invocaría al GOTO por lo que se continuaría de forma regular mostrando el mensaje de error y se haría una pausa en el programa. Una vez pasada la pausa se encuentra el comando EXIT que termina de forma abrupta el programa y no deja que se continue con el código que sigue.
Una buena alternativa que no he colocado es la de reemplazar el comando EXIT por un GOTO a la sección que pide el nombre del proyecto. Si quieres agrega un label en la sección anterior y realiza este cambio.
Todo el código que sigue deberá estar despues de la etiqueta :CONTINUAR.
Crear carpetas del proyecto
Ya estamos listos para crear las carpetas del proyecto. En este caso no estoy validando si se crearon satisfactoriamente porque voy a asumir de que el usuario del archivo bat eres tú, que sabes hacer bien las cosas y no vas a poner un nombre de proyecto con espacios en blanco o caracteres especiales.
REM Crear carpetas del proyecto MKDIR %RUTA_RAIZ%\%NOMBRE_PROYECTO% MKDIR %RUTA_RAIZ%\%NOMBRE_PROYECTO%\inc MKDIR %RUTA_RAIZ%\%NOMBRE_PROYECTO%\inc\estilos MKDIR %RUTA_RAIZ%\%NOMBRE_PROYECTO%\inc\scripts MKDIR %RUTA_RAIZ%\%NOMBRE_PROYECTO%\inc\imagenes
En este caso hemos introducido el comando MKDIR que permite crear un directorio. Ahora vamos creando los directorios uno por uno en orden para asegurarnos que primero exista la carpeta antes que las subcarpetas del mismo.
Copiar los archivos desde mi repositorio
Ahora toca copiar los archivos reset.css y jquery.js que se encuentran en mi repositorio a las carpetas de mi proyecto. Para hacer la copia se utiliza el comando XCOPY que recibe como primer parámetro el archivo de origen y el segundo parámetro el archivo de destino. Este comando es muy potente y permite copiar carpetas, archivos por tipo, subdirectorios, etc. Para más información puedes abrir una línea de comandos y escribir XCOPY /?.
REM Copiar los archivos desde mi repositorio XCOPY %RUTA_REPOSITORIO%\reset.css %RUTA_RAIZ%\%NOMBRE_PROYECTO%\inc\estilos XCOPY %RUTA_REPOSITORIO%\jquery.js %RUTA_RAIZ%\%NOMBRE_PROYECTO%\inc\scripts
Crear los archivos con contenido por defecto
Ahora solo faltan los archivos main.css e index.html. Estos archivos deberían tener algo de código dentro así que vamos a crearlos con el siguiente contenido:
main.css
index.html
@CHARSET "UTF-8";
body {
font-size:12px;
background-color:#fff;
}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <title>Ejemplo Pagina web</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <link href="/inc/estilos/reset.css" rel="stylesheet" type="text/css" /> <link href="/inc/estilos/main.css" rel="stylesheet" type="text/css" /> <script language="javascript" src="/inc/scripts/jquery.js" type="text/javascript"></script> </head> <body> Pagina de inicio </body> </html>
Para escribir en un archivo o simplemente crear un archivo podemos utilizar el comando ECHO. Si al final del comando ECHO escribimos el comando >> seguido por el nombre del archivo de destino, el comando en lugar de mostrar el texto en pantalla agregará lo escrito al final del archivo.
Por ejemplo si escribimos ECHO Hola mundo >> prueba.txt . Si el archivo prueba.txt no existe entonces se creará con el texto Hola mundo. Si el archivo si existe entonces se agregará una nueva línea con el texto Hola mundo.
Surge un pequeño problema cuando queremos escribir algún caracter especial como por ejemplo <, >, ?, etc. Para sobrepasar este problema podemos anteponer el símbolo ^ antes de estos caracteres de tal forma que se procesen de manera correcta. Por ejemplo para escribir el texto <html>hola?</html> en el archivo prueba.txt tenemos que usar el comando ECHO ^<html^>hola^?^</html^> >> prueba.txt. Como puedes notar hemos colocado el símbolo ^ antes de cada caracter especial.
REM Crear los archivos con contenido por defecto
SET ARCH=%RUTA_RAIZ%\%NOMBRE_PROYECTO%\inc\estilos\main.css
ECHO @CHARSET "UTF-8"; >> %ARCH%
ECHO. >> %ARCH%
ECHO body { >> %ARCH%
ECHO font-size:12px; >> %ARCH%
ECHO background-color:#fff; >> %ARCH%
ECHO } >> %ARCH%
SET ARCH=%RUTA_RAIZ%\%NOMBRE_PROYECTO%\index.html
ECHO ^<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"^> >> %ARCH%
ECHO ^<html^> >> %ARCH%
ECHO ^<head^> >> %ARCH%
ECHO ^<title^>Ejemplo Pagina web^</title^> >> %ARCH%
ECHO ^<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /^> >> %ARCH%
ECHO ^<link href="/inc/estilos/reset.css" rel="stylesheet" type="text/css" /^> >> %ARCH%
ECHO ^<link href="/inc/estilos/main.css" rel="stylesheet" type="text/css" /^> >> %ARCH%
ECHO ^<script language="javascript" src="/inc/scripts/jquery.js" type="text/javascript"^>^</script^> >> %ARCH%
ECHO ^</head^> >> %ARCH%
ECHO ^<body^> >> %ARCH%
ECHO Pagina de inicio >> %ARCH%
ECHO ^</body^> >> %ARCH%
ECHO ^</html^> >> %ARCH%
ECHO.
ECHO.
ECHO Proceso terminado
PAUSE
Como puedes apreciar, antes de crear el contenido de cada archivo, primero declaro una variable llamada ARCH y le asigno la ruta del archivo a crear. Hago esto solo para no tener que escribir la ruta completa en cada línea del ECHO. También puedes notar que al final de cada línea coloco la variable ARCH.
Al final se muestra un mensaje indicando que el proceso ha terminado y se hace una pausa al sistema.
En resumen
Un archivo BAT te puede ahorrar mucho tiempo y te puede ser bastante útil. En verdad este artículo trata a los archivos BAT de manera muy superficial pero existen infinidad de posibilidades y muchos comandos más.
Te invito a que investigues un poco más acerca de los archivos BAT ya que se pueden realizar scripts realmente impresionantes. Un buen comienzo es The Command Line in Windows.

Hola, es posible realizar un .bat que realice la revision de un archivo y si existe mande un correo automatico a una determinada direccion?
Claro que es posible, solo que es bastante trabajo y dificil y lamentablemente es muy específico como para hacer un post solo de eso.
bastante bien explicado! igual me quedan ciertas dudas, pero dado que el tema es viejo si contestas por aca cuando reviva te hago la pregunta!