Tutorial de Batch

Aqui la descripción desde la Wiki: http://es.wikipedia.org/wiki/Batch

Se dice que un fichero es de tipo bat (BATCH) o de tratamiento por lotes cuando está formado por un grupo o lista de órdenes MS-DOS que se ejecutan una tras otra.
En determinados casos, este tipo de ficheros nos permite ahorrar tiempo, ya que, una vez grabado en disco, con sólo teclear su nombre se ejecutan las órdenes que forman la lista.
Para crear un fichero BAT, se utiliza el editor de MS-DOS, tan fácil de abrir como ir a simbolo de sistema y poner edit ( pero ojo , es peligroso trabajar con ficheros bat desde máquinas reales, bueno con este tutorial aprendereis a no poner en peligro vuestro pc).
Otra opción para crear ficheros bat, es abrir el bloc de notas, cuando lo guardemos, darle extensión bat en vez de txt
Un ejemplo de fichero Bat podría ser, ejemplo.bat compuesto por las órdenes: date,cls,dir,ver.... Para ejecutarlo c:\>ejemplo asi sería desde simbolo de sistema y la opción del bloc de notas sería hacer doble click en el archivo, y entonces se ejecutarían las ordenes que explicare mas adelante.

Algunas de las características de este tipo de ficheros, son las siguientes:
-Todos llevan extensión BAT
-Cada orden ocupa una línea de la lista.
-Pueden incluir órdenes internas y externas del sistema operativo, comandos especiales de los ficheros BAT, incluso pueden llamar a otros ficheros ejecutables, que pueden ser otros BAT.
-No se puede asignar como nombre de un fichero BAT el de una orden externa o interna, ya que entonces solo se ejecutará ésta y no el fichero.
-Podemos interrumpir la ejecución de un fichero BAT pulsando simultáneamente Control+C, Control+BREAK
-Una vez grabado en disco, sólo es preciso teclear su nombre, sin indicar extensión, para que se ejecute.

Si en un directorio concreto existe un fichero llamado program.exe y otro llamado program.bat, siempre se ejecutará primero el de extensión BAT. Es decir, si queremos ejecutar cualquiera de ellos, tendremos que especificar además su extensión

Comandos especiales de ficheros BATCH

Comando: ECHO
Este comando puede ser utilizado para varios propósitos:
-Activar o desactivar la visualización de los comandos en la pantalla.
-Mostrar un mensaje por pantalla
Sintaxis: ECHO [ON | OFF] [MENSAJE]

ECHO ,escrito asi solo mostraría en pantalla si el eco está activado o desactivado.
ECHO. ,introduce una línea en blanco
ECHO MENSAJE , mostraría la palabra mensaje por pantalla, es decir, podemos mostrar un mensaje por pantalla.
ECHO ON ,activa el eco y se ven en pantalla todos los mensajes
ECHO OFF ,desactiva el eco y no se ven pantalla los mensajes hasta que se vuelva activar pero no desactiva las órdenes
@ECHO OFF ,desactiva todos los ecos del programa ademas de las ordenes

Normalmente, los comandos incluidos dentro de un fichero BATCH se visualizan en la pantalla a medida que se van ejecutando; esto es, tienen un eco. Si esto ocurre, el ECHO estará en ON.
Si queremos que los comandos no aparezcan en pantalla, podemos desactivar el ECHO con la opción OFF.
Normalmente, se pone la primera línea de programa la orden ECHO OFF si no queremos ver ningún mensaje de llamada. Lo que sí aparecerá será la ejecución de la propia orden, ya que para sí misma aun sigue activa.
Si queremos que no se vea ni siquiera la propia orden de desactivar el eco, colocaremos el carácter @ delante de ECHO OFF. De esta forma no veremos nada.

Comando: REM
Este comando es utilizado para:
Permite incluir comentarios explicativos en un archivo de proceso por lotes. Este mensaje será visualizado sólo en el caso de que esté activado el comando de procesamiento por lotes ECHO.

Sintaxis: REM [Comentario]

Podemos usar REM sin comentarios para añadir espacios que faciliten la lectura.
Esta orden no ejecuta nada, simplemente introduce el comentario que, posteriormente, puede ser visualizado o no.Es recomendable incluir comentarios en los ficheros de procesos por lotes, con el fin de clarificar qué es lo que hacemos con cada orden o conjunto de órdenes.

Comando: PAUSE
Este comando es utilizado para:
Suspende temporalmente la ejecución de un archivo de procesamiento por lotes.

Sintaxis: PAUSE [Comentario]

Cuando se está ejecutando un archivo de procesamiento por lotes, puede ser necesario cambiar de disco o realizar alguna acción. Este comando suspende la ejecución del archivo hasta que se presione cualquier otra tecla, a menos que se presione Control+BREAK o Control+C, en cuyo caso se suspenderá la ejecución del comando.
Este párametro es útil cuando se desea mostrar un mensaje especial

Ficheros BATCH con parámetros

Pueden darse ocasiones en las que se quiera crear un programa y ejecutarlo con diferentes conjuntos de datos. Estos datos pueden estar almacenados en varios archivos MS-DOS. Estos parámetros se introducen desde el símbolo del sistema, tras el nombre del fichero de procesamiento por lotes.
Dentro de un fichero BATCH es posible emplear hasta nueve parámetros, los cuales son identificados por los caracteres %n, donde n es un numero comprendido entre 1 y 9. Es decir, dentro de un fichero BATCH podemos emplear los siguientes parámetros: %1, %2.......%9.
Si nuestro fichero BATCH incluye un parámetro, este sera sustituido por el nombre introducido tras el nombre del fichero por lotes.

EJEMPLO
Supongamos que queremos realizar un programa en BATCH que visualice,imprima y copie un fichero concreto al directorio raíz de la unidad A:, Mediante el editor de textos, crearíamos un programa ejemplo.bat con el siguiente contenido:

@ECHO OFF
TYPE %1
PRINT %1
COPY %1 a:\


Una vez creado el programa si lo ejecutamos de la siguiente forma:
c:\>ejemplo
Lo único que se producirá sería un error. El siguiente:
Falta un parámetro requerido.
La ejecución correcta sería la siguiente:
c:\>ejemplo fichero.txt
Es evidente que fichero.txt es el parámetro que estamos pasando al programa por lotes

Cada parámetro es posicional respecto de lo que introducimos tras el nombre del fichero de proceso por lotes. Si introducimos dos parámetros, %1 y %2, el fichero BATCH esperará a que se le introduzcan dos parámetros tras el nombre del fichero. Cada parámetro se introduce separado por un espacio en blanco. El primer parámetro se sustituirá por %1; el segundo, por %2, y así sucesivamente, pero de forma fija en todo el proceso.

EJEMPLO
Supongamos que creamos el fichero ejemplo.bat que visualice el primer fichero que introduzcamos,imprima el segundo y copie el tercero:

@ECHO OFF
TYPE %1
PRINT %2
COPY %3 a:\

Una vez creado el programa lo ejecutariamos de la siguiente forma:
c:\>ejemplo texto1.txt fich2.txt program.exe
De esta forma, texto1.txt se visualiza, fich2.txt se imprime y en el directorio raíz de la unidad A: copiamos el fichero program.exe.
Si en este ejemplo introducimos más de tres parámetros, los restantes serán ignorados. Si introducimos menos, se producirá un error indicando que falta algún parámetro.
La ventaja de tgrabajar con parámetros reemplazables es que un mismo fichero BATCH puede ser utilizado para cualquier fichero de nuestro ordenador, siendo el nombre del fichero el parámetro pasado al fichero de proceso por lotes. Si no existiesen los parámetros, tendríamos que repetir el fichero BATCH para cada archivo que lo utilizase.

Instrucciones BATCH para control del proceso de ejecución

Comando: IF
Con esta orden se desvía el proceso de ejecución de un fichero por lotes según sea verdadera o falsa la condición que se evalúa tras IF. Si la condición se cumple o es verdadera, se ejecuta la orden especificada detrás de la condición. Después, se continúa en la línea siguiente a la orden IF.
Si la condición es falsa, la ejecución del proceso por lotes continúa en la siguiente línea sin ejecutarse la línea específicada tras IF.

Sintaxis: IF [NOT] ERRORLEVELn COMANDO
IF [NOT] cadena1 == cadena2 COMANDO
IF [NOT] EXIST fichero COMANDO

NOT
Indica que se ejecute el comando especificado cuando no se cumpla la condición

ERRORLEVELn
Ejecutará el comando cuando el programa ejecutado antes de esta orden devuleva un valor igual al indicado en el número n. Por lo general, el valor devuelto será 0 cuando no haya existido error.
Cada vez que en MS-DOS se ejecuta una orden, el sistema operativo, aunque nosotros no lo veamos, devuelve un número. Este número será un o, si la orden se ha ejecutado correctamente, y cualquier otro si ha sido incorrecta.
Con ERRORLEVEL se puede comprobar que el resultado de la ejecución de una orden ha sido correcto o incorrecto.
Solamente las siguientes órdenes de MS-DOS devuelven un valor después de ser ejecutadas.

CHOICE DISKCOMP DISKCOPY DEFRAG DELTREE FIND FORMAT KEYB MOVE REPLACE RESTORE SETVER XCOPY

EJEMPLO
Supongamos que queremos realizar un programa en BATCH llamado formateo.bat que permita dar formato a disquetes que tengan un tamaño de 720 o de 1440 Bytes. Si el formato es correcto indicaremos por pantalla tal acción o, en caso contrario,que no ha sido correcta. Para ello, vamos a introducir dos parámetros; unidad lógica del disquete(A: o B: ) y tamaño del disquete:

@echo off
rem Programa para formatear disquetes
format%1 /f:%2
IF ERRORLEVEL 0 ECHO Formato realizado con éxito
IF NOT ERRORLEVEL 0 ECHO Formato NO realizado

En este caso, al ejecutar el programa tendríamos que proceder de la siguiente forma:
Formateo A: 1.44
%1 toma como valor A:, y %2 toma como valor 1.44 .Si todo es correcto, se muestra el mensaje adecuado


Cadena1 == Cadena2
Ejecutará el comando cuando cadena1 y cadena2 sean idénticas. Las cadenas no pueden contener separadores tales como comas, punto y coma, signo igual o espacio en blanco.
La utilización de este parámetro es menos práctica, ya que solamente compara dos cadenas de caracteres. Se diferencian mayúsculas y minúsculas. Se suele utilizar para saber si, en procesos por lotes que tengan parámetros, se han introducido parámetros o no.
En nuestro ejemplo anterior, el usuario puede olvidar introducir el parámetro primero. Sin él, el proceso BATCH se ejecutará provocando errores y resultados inesperados o indeseados.
Si previamente analizamos si se han introducido loe parámetros, la ejecución del proceso será más limpia.


EJEMPLO
Supongamos que queremos saber si se ha introducido el nombre de la unidad que vamos a formatear. La orden sería la siguiente:
IF %1== ""
Si no se ha introducido el parámetro, su valor se sustituye por espacios en blanco. Como lo que se compara es lap rimera cadena (que son espacios en blanco) con la segunda cadena (que también son espacios en blanco, ya que no hemos puesto nada), la condición sería correcta.
En este caso, enviaríamos el correspondiente mensaje de error e interrupiríamos la ejecución del proceso BATCH.

EXIST Fichero
Ejecutará el comando cuando exista el fichero específicado. Este parámetro indica el nombre de un fichero en una trayectoria concreta. Si no se especifica trayectoria, se asume la unidad activa y el directorio activo. No funciona con directorios directamente, pero se puede buscar el nombre de un directorio si tras él especificamos el nombre del dispositivo NUL, que si será considerado como fichero


EJEMPLO
Supongamos que queremos saber si se ha introducido el nombre de la unidad que vamos a formatear. La orden sería la siguiente:
IF %1== ""
Si no se ha introducido el parámetro, su valor se sustituye por espacios en blanco. Como lo que se compara es lap rimera cadena (que son espacios en blanco) con la segunda cadena (que también son espacios en blanco, ya que no hemos puesto nada), la condición sería correcta.
En este caso, enviaríamos el correspondiente mensaje de error e interrupiríamos la ejecución del proceso BATCH.

EXIST Fichero
Ejecutará el comando cuando exista el fichero específicado. Este parámetro indica el nombre de un fichero en una trayectoria concreta. Si no se especifica trayectoria, se asume la unidad activa y el directorio activo. No funciona con directorios directamente, pero se puede buscar el nombre de un directorio si tras él especificamos el nombre del dispositivo NUL, que si será considerado como fichero


EJEMPLO
Supongamos que queremos saber si se ha introducido el nombre de la unidad que vamos a formatear. La orden sería la siguiente:
IF %1== ""
Si no se ha introducido el parámetro, su valor se sustituye por espacios en blanco. Como lo que se compara es lap rimera cadena (que son espacios en blanco) con la segunda cadena (que también son espacios en blanco, ya que no hemos puesto nada), la condición sería correcta.
En este caso, enviaríamos el correspondiente mensaje de error e interrupiríamos la ejecución del proceso BATCH.

EXIST Fichero
Ejecutará el comando cuando exista el fichero específicado. Este parámetro indica el nombre de un fichero en una trayectoria concreta. Si no se especifica trayectoria, se asume la unidad activa y el directorio activo. No funciona con directorios directamente, pero se puede buscar el nombre de un directorio si tras él especificamos el nombre del dispositivo NUL, que si será considerado como fichero

EJEMPLO
Supongamos que queremos saber si existe un fichero llamado fichero.txt en el directorio raíz de la unidad A:. Pondremos lo siguiente:

IF EXIST a:\fichero.txt ECHO
El fichero si existe

Si queremos saber si existe, por ejemplo, el directorio datos como directorio hijo del directorio raíz de la unidad A:, tendriamos que poner lo siguiente:

IF EXIST a:\datos\nul ECHO
El fichero si existe

En este caso compureba la existencia del dispositivo NUL dentro del directorio datos. Como este fichero (dispositivo) siempre existe, no se produce error. Si existe realmente el directorio datos ,aunque no tenga ningún fichero o no tenga el que nosotros deseamos, sabremos si existe o no.

Cuando veamos la orden GOTO, haremos bifurcaciones condicionales a otras partes de un proceso BATCH y aprenderemos a continuar en cualquier parte del proceso deseado teniendo en cuenta que se cumpla o no una deerminada condición

GOTO
Desvía la ejecución del proceso a un bloque o conjunto de líneas especificadas en el mismo fichero.

Sintaxis: GOTO [:] ETIQUETA

GOTO permite transferir el control a la línea siguiente a la de etiqueta, donde etiqueta se define como los caracteres que siguen al comando GOTO. Esta etiqueta pueda incluir espacios, pero no otros separadores tales como punto y coma o el signo igual. Si el archivo procesamiento por lotes no contiene una etiqueta especificada, dejara de ejecutarse.
Cualquier linea en un archivo de procesamiento por lotes que comience con dos puntos se ignora durante el procesamiento, ya que se considera como etiqueta.

EJEMPLO

Supongamos a continuacion el proceso formateo.bat Vamos a modificar algunas condiciones de tal forma que si el formato es correcto se visualice el mensaje de que ha sido correcto y ademas vamos a copiar el archivo datos.dat del directorio raiz en la unidad c: en el directorio raiz de la unidad recien formateada con el nombre nuevo.dat. En caso de error no haremos nada.
El programa formateo.bat sería el siguiente:

@echo off
REM Programa para formatear disquetes
FORMAT %1 /f:%2
IF NOT ERRORLEVEL 0 GOTO :INCORRECTO
IF ERRORLEVEL 0 GOTO :CORRECTO
:CORRECTO
ECHO El disco se ha formateado con exito
COPY C:\datos.dar a:|nuevo.dat
GOTO :FIN
:INCORRECTO
ECHO El disco no se ha formateado
:FIN

CHOICE
Esta orden cumple una triple función en los ficheros BATCH:

-Muestra un mensaje en pantalla y detiene la ejecución del proceso por lotes.
-Espera a que el usuario pulse una tecla previamente prediseñada
-Activa un código de salida ERRORLEVEL según la tecla pulsada

Se utiliza principalmente para permitir al usuario introducir parámetros en tiempo de ejecución del proceso BATCH.

Sintaxis: CHOICE TEXTO][/c[:TECLAS]

[/n][/s][/t][:]TECLA,SEGUNDOS]

TEXTO es lo que queremos que se visualice cuando se ejecute la orden CHOICE.

/c:teclas. Se utiliza para definir las teclas que el usuario puede pulsar cuando se ejecuta la orden. Si deseamos que este orden reconozca como teclas, validas las teclas correspondientes a los caracteres S y N, especificaremos: CHOICE /c:SN

Cuando el usuario pulsa una de ellas, se activa el código de salida de ERRORLEVEL, correspondiente a la posición de la tecla en el parámetro /C. El carácter S devolvería una salida para ERRORLEVEL de 1.El carácter N devolvería2.
Da igual que sean mayúsculas o minúsculas

/n visualiza primero en pantalla la cadena de caracteres del parámetro TEXTO, y luego el mensaje de teclas

/t se utiliza para introducir que tecla se asumirá por defecto poner como directorio activo si el usuario no pulsa ninguna pasado un determinado tiempo que se especifica en segundos

EJEMPLO
Supongamos que queremos realizar un fichero BAT que nos ponga como directorio activo uno u otro en una unidad concreta , dependiendo de la tecla que pulsemos. El fichero se llamara directo.bat y nos pondra como directorio y unidad activa el directorio raíz de A: si pulsamos la tecla A, en el raiz de C: si pulsamos C y en c:\dos si pulsamos B. No hay tecla por defecto

@ECHO OFF
CLS
REM Proceso para situarse en un directorio
ECHO.
ECHO A. Para poner directorio activo a:\
ECHO B. Para poner directorio activo c:\dos
ECHO C. Para poner directorio activo c:\
ECHO.
CHOICE "Pulse una tecla " /c:ABC
ECHO.
IF ERRORLEVEL 3 GOTO :RAIZC
IF ERRORLEVEL 2 GOTO OSC
IF ERRORLEVEL 1 GOTO :RAIZA
IF ERRORLEVEL 0 GOTO :FIN
:RAIZA
CD A:\
GOTO :FIN
OSC
CD C:\
:FIN


FOR
Con esta orden se puede repetir un proceso un número determinado de veces. Se utiliza para aplicar un mismo proceso a un conjunto de elementos. El mismo proceso se realiza sobre diferentes elementos hasta completar el conjunto

Sintaxis: FOR %%VARIABLE IN CONJUNTO DO COMANDO

Para evitar confusión con los parámetros %1, %2....%9 utilizados en los archivos de procesamiento por lotes, el nombre de la variable puede ser cualquier carácter excepto 1,2....9

Este comando asigna secuencialmente la variable a cada elemento del conjunto y utiliza esta variable para evaluar el comando. Si un elemento del conjunto es una expresión que contiene un comodín, entonces la variable asigna a cada elemento que cumpla la condición.

EJEMPLO

Supongamos que queremos realizar un programa BAT, llamado imprimir.bat que visualice tres archivos, denominados doc1.txt, doc2.txt y doc3.txt. Para ello introduciremos dentro del fichero imprimir.bat lo siguiente:


FOR %%v IN (doc1.txt doc2.txt doc3.txt)
DO TYPE %%v

Este mismo ejemplo se podría haber realizado con archivos que no sean específicados. Es decir, los nombres de archivo especificados dentro del conjunto pueden ser aquellos que cumplan una determinada plantilla (por ejemplo, *.txt), o parametros determinados capaces de sustituir a un archivo introducido por teclado antes de ejecutar el programa
Este mismo ejemplo lo podemos hacer de la siguiente forma:

FOR %%V IN (*.TXT) DO TYPE %%V

También podemos realizar un proceso con parámetros, que posteriormente introduciremos desde teclado. La orden que sería la siguiente:

FOR %%V IN (%1 %2 %3) DO TYPE %%V

La única diferencia se da a la hora de ejecutar el programa ya que en los dos casos anteriores pondríamos solamente


C:\>imprimir

En el último caso tendremos que poner:

C:\>imprimir doc1.txt doc2.txt doc3.txt

Si el número de parámetros es mayor o menor a los específicados en el conjunto, ocurrirá lo mismo que en cualquier otro proceso que utilice parámetros


CALL
Esta orden sirve para llamar a procesos BATCH dentro de otros que ya se están ejecutando. De esta forma, el proceso que llama se interrumpe temporalmente para ceder el control de la ejecución al proceso que ha sido llamado. Cuando finalice el proceso al que se llamó, el control vuelve al proceso principal

Sintaxis: CALL FICHERO [PARÁMETROS]

FICHERO especifica el fichero al que se está llamando.
Este nombre de fichero puede incluir, si es necesario, una ruta o trayectoria, pero en el nombre de fichero no se pondrá la extensión BAT

EJEMPLO
Supongamos que realizamos un programa o fichero principal.bat, que ejecutará dos procesos: procesoa.bat y procesob.bat. El contenido de principal.bat es el siguiente:

@ECHO OFF
CLS
CALL PROCESOA
CALL PROCESOB
PAUSE
CLS

El contenido de procesoa.bat es el siguiente:

@ECHO OFF
CLS
DIR c:\*.*

El contenido de procesob.bat es el siguiente:

@ECHO OFF
CLS
DATE
TIME