Programación avanzada de archivos en lotes .bat
Uso de etiquetas
Como bien sabemos la lectura de los códigos Batch se leen de una manera lineal, pero existe una forma para que el Batch se salte lineas, o vuelva a alguna anterior. Esto se logra con Etiquetas y la función GOTO.
Para crear una etiqueta solo debemos escribir:
Código :
:nombreEtiqueta
Dos punto (:) seguido del nombre que le daremos a la etiqueta. De esta manera el GOTO funciona escribiendo
GOTO seguido del nombre de la etiqueta, como vemos en el siguiente ejemplo.
Código :
@echo off
goto :mietiqueta
echo ¿Por que me saltan?
:MiEtiqueta
echo Hola, esta es la etiqueta y nos saltamos una parte del codigo.
pause>nul
exit
En Batch las Mayúsculas y Minúsculas no se diferencian.
Condicionales:
El primer condicional que veremos el más usado.
IF:
Se puede ocupar para comparar, cadenas, números o para saber si existen archivos.
Ejemplo de sintaxis, if %cadena1% == %cadena2% OrdenAEjecutar
Que se podría leer de la siguiente manera. Si cadena1 es igual a Cadena2 ejecutemos la Orden OrdenAEjecutar.
También existe el NOT para ver si no son iguales.
if not %cadena1%== %cadena2% ejecutarAccion
Para saber si un archivo existe, se usa:
if exist "NombreDelArchivo" AccionAEjecutar
o también para ver si NO existe:
if not exist "NombreDelArchivo" AccionAEjecutar
No solo se puede ocupar el signo == para hacer comparaciones.
EQU, que es el equivalente a ==
NEQ, Sirve para cuando queremos ver Desigualdad.
LSS, Para verificar si el numero es Menor
LEQ, Para verificar si es menor o igual.
GTR, Si es mayor
GEQ, Si es Mayor e igual.
Un ejemplo de esto seria:
Código :
if 5 GTR 4 echo Hola
FOR:
Nos sirve para repetir un comando varias veces, en distintas variables.
Un ejemplo, es este:
for /L %%i IN (0,1,21) DO (echo %%i)
En donde /L es para especificar que nuestro for se basara en un conteo de números.
Aquí se repetirá un Echo, que imprimirá números del 0 al 21.
%%i sera el nombre de la variable que almacenara datos
in (0,1,21) aquí especificamos que se repetirá del 0 al 1 y del 1 al 21.
do (echo %%i) Esto es la función que se ejecutara en cada repetición del comando, en este caso un echo que imprimirá la variable.
Batch en algunos casos SI reconoce entre mayúsculas y minúsculas, como en el caso de la variable %%i si esta se llamara %%I no seria reconocida como la misma.
Otro uso que puede ser aplicado en el FOR es el listado de carpetas o archivos, como veremos a continuación:
Listado de archivos:
Código :
@echo off
FOR %%x in (a*) DO echo %%x
pause
Este código, listaría todos los archivos que comienzan con A.
¿Por que? * (asterisco) es un signo comodín, por lo cual al poner a*, estamos diciendo cualquier archivo que tenga una A delante y luego cualquier cosa.
Otro ejemplo del uso de comodín, es listar archivos con extensión común como seria este:
Código :
@echo off
FOR %%x in (*.jpg) DO echo %%x
pause
Aqui nos estaria listando todos los archivos que tengan la extensión .jpg
Listado de Carpetas:
FOR /D %%x in (a*) DO echo %%x
Es casi lo mismo anterior, tan solo que al indicar /D solo se aplica a directorios.
Si quisiéramos que se listaran los directorios, juntos a los directorios que tienen estos dentro se ocupa /R
FOR /R /D %%x in (a*) DO echo %%x
y si quisiéramos listar todos los documentos que están dentro de una carpeta contando los que están dentro de carpetas se ocupa solamente /R (Sin /D)
FOR /R %%x in (a*) DO echo %%x
Con esto creo que tenemos lo básico, y más importante de los condicionales. Talvez otro claber se anime a profundizar más en el tema.
Creación de Menús:
Como ya vimos Condicionales y Etiquetas les enseñare una manera de hacer Menús.
Comenzaríamos indicando las instrucciones y las opciones, de esta manera:
Código :
@echo off
:Menu
cls
echo Seleccione su opcion tecleando el numero respectivo.
echo.
echo 1. Primera Opcion
echo 2. Segunda Opcion
echo 3. Salir
Luego para seguir ocuparíamos esto:
Código :
set /p var=
if %var%==1 goto :Primero
if %var%==2 goto :Segundo
if %var%==3 goto exit
if %var% GTR 3 echo Error
goto :Menu
Con esto damos una variable en la que se guardara el numero insertado para luego ser verificado por los condicionales, si el numero es mayor que 3 nos avisara que no existe esa opción. También al principio cree una etiqueta para que se pueda volver
al menú y un "cls" para limpiar la pantalla.
Para terminar creamos las respectivas etiquetas.
Código :
:Primero
cls
color a
Echo Esta es la Primera Opcion
Echo Precione una tecla para volver al menu
Pause>Nul
goto :Menu
:Segundo
cls
color 1a
Echo Esta es la Segunda Opcion
Echo Precione una tecla para volver al menu
Pause>Nul
goto :Menu
Quedando para terminar nuestro codigo así:
Código :
@echo off
:Menu
cls
echo Seleccione su opcion tecleando el numero respectivo.
echo.
echo 1. Primera Opcion
echo 2. Segunda Opcion
echo 3. Salir
set /p var=
if %var%==1 goto :Primero
if %var%==2 goto :Segundo
if %var%==3 goto exit
if %var% GTR 3 echo Error
goto :Menu
:Primero
cls
color a
Echo Esta es la Primera Opcion
Echo Precione una tecla para volver al menu
Pause>Nul
goto :Menu
:Segundo
cls
color 1a
Echo Esta es la Segunda Opcion
Echo Precione una tecla para volver al menu
Pause>Nul
goto :Menu
Bueno, con eso les basta para imaginarse como crear sus menús personales.
Como vieron puede cada sección tener su color, incluso puedes cambiar la barra de titulo.
Ve probando, no pierdes nada.
Apagado y Reiniciado de Pc:
Una cosa muy interesante que puedes hacer con Batch es Apagar y Reiniciar tu Pc, incluso programarlo para que apague a la hora que desees.
Es notablemente fácil.
se ocupa de la siguiente manera el apagado.
shutdown -s -t Tiempo -c "Comentario"
donde -s significa que lo apagaremos, -t debe ir seguido de los segundos que demorara apagar. En windos XP mostrara un contador, con el comentario que va luego de -c, pero en Windows Vista no abra ni un contador, solamente saldrá una alerta con el Comentario, que ni siquiera es obligatorio.
Bueno, de seguro quieres hacer la prueba. La puedes hacer pero antes de eso te recomiendo que leas lo siguiente.
Puedes cancelar el apagado (Antes de que el contador termine) solamente escribiendo shutdown -a ya sea en un archivo de texto con extensión bat, como en el mismo Shell.
Entonces, pues has la prueba
Código :
shutdown -s -t 999999 -c "Esto se esta apagando"
Tendrás suficiente tiempo para ejecutar el siguiente código. (11 días )
Código :
shutdown -a
Con esto ya probamos los dos y podemos ser felices.
Ok, si en vez de ocupar -s usas -r el PC se reiniciara.
También puedes forzar el cierre de los programas, para que no de tiempo de guardar nada. Tan solo ocupando -f
Un ejemplo de un Pc, que se Apaga Forzosamente y que puede dañar el pc y luego se reinicia es este:
Código :
shutdown -r -f -t 0 -c "Bye"
(No lo recomiendo probar en tu pc, Ya que apaga el pc en 0 segundos sin preguntar nada. )
Para programar un apagado lo veremos al final en los Datos Extras, ya que con la función AT puedes programar el apagado.
Leer archivos externos:
Para leer un archivo externo con Batch, como un archivo de texto por ejemplo. Se usa el siguiente código:
Código :
type "NombreDelArchivo.txt"
¿Simple no?
Insertar al Registro:
Insertar al registro tu Batch puede ser muy útil, la verdad yo no entiendo mucho del registro pero leí un poco y aquí tienen un ejemplo que se encuentra a ser sincero en muchas web. Donde aremos que nuestro batch se ejecute con el Sistema.
Código :
REG ADD HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run /v MIBATCH.bat /t REG_SZ /d
C:\MIBATCH.bat
Con la función REG ADD Agregamos algo al registro. Con otros comando podemos borrar.
Lo que sigue es la "Dirección" de donde insertaremos el registro que en este caso sera para que nuestro batch se ejecute al iniciar Sesión.
En medio de toda la dirección se puede leer MIBATCH.bat yo puse el nombre del Batch pero también se puede poner cualquier otra cosa. Más adelante donde dice C:\MIBATCH.bat, es la dirección completa de donde esta nuestro Batch.
Con solo esta linea estamos listos. Haz la prueba!
Otras cosas útiles:
Para terminar hablare de pequeñas funciones que pueden ser de utilidad.
Msg
Esta función tiene otras utilidades, pero les enseñare esta que no funciona en todos los PC.
Sirve para abrir una alerta con un mensaje su utilización es la siguiente:
Código :
msg * EsteEsMiMensaje
AT
Esta es una de las que más me gusta, es para programar alguna acción a cierta hora.
Ejemplo:
Código :
At 20:00 msg * Son Las 8 de la noche
Con esto a las 20:00 nos aparecerá un mensaje que nos dirá que son las 8 de la Noche.
También puedes programar un apagado o cualquier Cosa.
Si la hora que das ya paso, se tomara como para el día siguiente.
Visual Basic
Visual basic. Constituye un IDE (entorno de desarrollo integrado, o, en inglés, Integrated Development Enviroment) que ha sido empaquetado como un Programa de aplicación; es decir, consiste en un editor de código (programa donde se escribe el código fuente), un depurador (programa que corrige errores en el código fuente para que pueda ser bien compilado), un compilador (programa que traduce el código fuente a lenguaje de máquina), y un constructor de interfaz gráfica o GUI (es una forma de programar en la que no es necesario escribir el código para la parte gráfica del Programa, sino que se puede hacer de forma visual).
Con Visual Basic se pueden desarrollar aplicaciones para Windows más rápidamente. Los errores de Programación no se generan tan frecuentemente y, si lo hacen, son más sencillos de depurar. Además incluye dos conceptos importantes:
Los elementos que componen la pantalla de Visual Basic son:
Barra de menús. Visualiza las órdenes que se utilizan para desarrollar, probar y archivar una aplicación. Los menús que nos encontramos son:
Ventana o barra de herramientas. Facilita el uso a las órdenes más comunes. De izquierda a derecha los iconos que aparecen permiten:
Caja de herramientas . Provee de un conjunto de herramientas que permiten colocar los controles en el formulario durante el diseño del proyecto. Ventana de proyecto. En esta ventana están especificados los ficheros (formularios, módulos, etc.) que forman la aplicación y, dónde se seleccionarán para crearlos o modificarlos. Esto se debe a que hay ficheros que pueden utilizarse en más de una aplicación. Además contiene dos botones: Ver Formulario que visualiza el formulario seleccionado y; Ver Código que visualiza el código del fichero seleccionado.
Ventana del formulario . Es la ventana que da lugar a la interfaz de usuario. Es la ventana que se personalizará. Los puntos que aparecen sobre el formulario, forman una rejilla que ayuda a la hora de alinear los controles que se sitúan sobre el mismo. Esta rejilla desaparece en tiempo de ejecución. Para eliminarla en tiempo de diseño se accederá a la opción Herramientas/Opciones/Ficha Entorno/Mostrar Cuadrícula.
Ventana de propiedades. Especifica las propiedades de cada uno de los objetos. En cada momento mostrará las propiedades del objeto seleccionado en el formulario. Está formada por dos partes: la lista desplegable de objetos que visualiza el nombre del objeto seleccionado y, la lista de propiedades del objeto seleccionado.
Modo de diseño y ejecución
En el modo de diseño el usuario construye interactivamente la aplicación, colocando controles en el formulario, definiendo sus propiedades y desarrollando funciones para gestionar los eventos. La aplicacioón se ejecuta en modo de ejecución. En ese caso el usuario actúa sobre el programa (Introduce eventos) y prueba cómo responde el programa.
C++ es un lenguaje de programación orientado a objetos que toma la base del lenguaje C y le agrega la capacidad de abstraer tipos como en Smalltalk.
C++ es un lenguaje de programación diseñado a mediados de los años 80 por Bjarne Stroustrup. La intención de su creación fue el extender al exitoso lenguaje de programación C con mecanismos que permitieran la manipulación de objetos. En ese sentido, desde el punto de vista de los lenguajes orientados a objetos, el C++ es un lenguaje híbrido. Posteriormente se añadieron facilidades de programación genérica, que se sumó a los otros dos paradigmas que ya estaban admitidos (programación estructurada y la programación orientada a objetos). Por esto se suele decir que el C++ es un lenguaje de programación multiparadigma.
En la actualidad, el C++ es un lenguaje versátil, potente y general. Su éxito entre los programadores profesionales le ha llevado a ocupar el primer puesto como herramienta de desarrollo de aplicaciones. El C++ mantiene las ventajas del C en cuanto a riqueza de operadores y expresiones, flexibilidad, concisión y eficiencia. Además, ha eliminado algunas de las dificultades y limitaciones del C original. La evolución de C++ ha continuado con la aparición de Java, un lenguaje creado simplificando algunas cosas de C++ y añadiendo otras, que se utiliza para realizar aplicaciones en Internet.
Las principales herramientas necesarias para escribir un programa en C++ son las siguientes:
Si estas en windows puedes usar:
Etiquetas
Los programas C++ se ejecutan secuencialmente, es decir, las sentencias se ejecutan una a continuación de otra, en el mismo orden en que están escritas en el programa.
Sin embargo, esta secuencia puede ser interrumpida de varias maneras, mediante el uso de sentencias de salto.
Las etiquetas son la forma en que se indica al compilador en qué puntos será reanudada la ejecución de un programa cuando se produzca una ruptura del orden secuencial de ejecución.
Etiquetas de identificación
Corresponden con la siguiente sintaxis:
<identificador>: <sentencia>
Estas etiquetas sirven como puntos de entrada para la sentencia de salto goto, que veremos más abajo, y tienen el ámbito restringido a la función dentro de la cual están definidas. Veremos su uso con más detalle al analizar la sentencia goto.
Etiquetas case y default
Esta etiqueta se circunscribe al ámbito de la sentencia switch, y se verá su uso en el siguiente apartado. Sintaxis:
switch(<variable>)
{
case <expresión_constante>: [<sentencias>][break;]
. . .
[default: [<sentencias>]]
}
Selección
Las sentencias de selección permiten controlar el flujo del programa, seleccionando distintas sentencias en función de diferentes circunstancias.
Sentencia if...else
Permite la ejecución condicional de una sentencia. Sintaxis:
if (<condición>) <sentencia1>
[else <sentencia2>]
En C++ se pueden declarar variables dentro de la expresión de condición, que será, como en el caso de los bucles, una expresión booleana. Por ejemplo:
if(int val = func(arg))...
En este caso, la variable val sólo será accesible dentro del ámbito de la sentencia if y, si existe, del else.
Si la condición es verdadera se ejecutará la sentencia1, si es falsa, (y si existe la parte del else), se ejecutará la sentencia2.
La claúsula else es opcional, y si se usa, no pueden insertarse sentencias entre la sentencia1 y el else.
Sentencia switch
Esta sentencia es una generalización de las sentencias if...else. En el caso de las sentencias if, la expresión que se evalúa como condición es booleana, lo que quiere decir que sólo hay dos valores posibles, y por lo tanto, sólo se puede elegir entre dos sentencias a ejecutar.
En el caso de la sentencia switch, la expresión a evaluar será entera, por lo tanto, el número de opciones es mucho mayor, y en consecuencia, también es mayor el número de diferentes sentencias que se pueden ejecutar.
Sintaxis:
switch (<expresión entera>)
{
[case <expresión_constante1>: [<sentencias1>]]
[case <expresión_constante2>: [<sentencias2>]]
...
[case <expresión_constanten>: [<sentenciasn>]]
[default : [<sentencia>]]
}
Cuando se usa la sentencia switch el control se transfiere al punto etiquetado con el case cuya expresión constante coincida con el valor de la expresión entera evaluada dentro del switch. A partir de ese punto todas las sentencias serán ejecutadas hasta el final del switch, es decir hasta llegar al "}". Esto es así porque las etiquetas sólo marcan los puntos de entrada después de una ruptura de la secuencia de ejecución, pero no marcan los puntos de salida.
Esta estructura está diseñada para ejecutar cierta secuencia de instrucciones, empezando a partir de un punto diferente, en función de un valor entero y dejando sin ejecutar las anteriores a ese punto.
Veamos un ejemplo. Para hacer un pan hay que seguir (en una versión resumida), la siguiente secuencia:
A cada paso le hemos asignado un número entero. Si por ejemplo, tenemos que hacer un pan, pero ya hemos hecho los primeros siete pasos, es decir, disponemos de harina, la ejecución empezará en el paso ocho, y continuará hasta el trece. De forma análoga, si ya tenemos masa dejada a reposar, podremos entrar directamente en el nivel diez.
Esta característica también nos permite ejecutar las mismas sentencias para varias etiquetas distintas, y en el apartado siguiente veremos (aunque vamos a adelantarlo ahora) que se puede eludir la ejecución secuencial normal usando la sentencia de ruptura break para ejecutar sólo parte de las sentencias.
Si el valor de la expresión entera no satisface ningún case, es decir, si no existe un case con una expresión constante igual al valor de la expresión entera, el control parará a la sentencia etiquetada con la etiqueta default.
Todas las etiquetas son opcionales, tanto default como todos los case. Si no se satisface ningún case, ni aparece la etiqueta default, se abandonará la sentencia switch sin ejecutar ninguna sentencia.
Por ejemplo:
bool EsVocal;
char letra;
...
switch(letra)
{
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
EsVocal = true;
break;
default:
EsVocal = false;
}
En este ejemplo letra es una variable de tipo char y EsVocal de tipo bool. Si el valor de entrada en el switch corresponde a una vocal, EsVocal saldrá con un valor verdadero, en caso contrario, saldrá con un valor falso. El ejemplo ilustra el uso del break. Si por ejemplo, letra contiene el valor 'a', se cumple el primer case, y la ejecución continúa en la siguiente sentencia: EsVocal = true
, ignorando el resto de los case hasta el break, que nos hace abandonar la sentencia switch.
Otro ejemplo:
int Menor1, Menor2, Menor3, Mayor3;
Menor1 = Menor2 = Menor3 = Mayor3 = false;
switch(numero)
{
case 0:
Menor1 = true;
case 1:
Menor2 = true;
case 2:
Menor3 = true;
break;
default:
Mayor3 = true;
}
Veamos qué pasa en este ejemplo si numero vale 1. Directamente se reanuda la ejecución en case 1:
, con lo cual Menor2 tomará el valor true, lo mismo pasará con Menor3. Después aparece el break y se abandona la sentencia switch.
Recordemos que los tipos enumerados se consideran también como enteros, de modo que también es posible usarlos en sentencias switch, de hecho, su uso en estas sentencias es bastante frecuente.
enum estado {principio, primera, segunda, tercera, final};
estado x;
x = primera;
switch(x) {
case principio: IniciarProceso();
case primera: PrimeraFase();
case segunda: SegundaFase();
case tercera: TerceraFase();
case final: Terminar()
}
Comentarios de los usuarios (26)
Alejandro
2011-07-26 05:05:53
Hola!, este curso es Excelente. y tengo una pequeña duda:
Por qué antes de escribir la primera llave del bloque se escribe antes una pleca invertida, disculpen si estare molestando.
switch(letra)
\{
...
}
Salvador Pozo
2011-07-26 10:43:41
Se trata de un error en el código de la página. Lo he corregido para este capítulo, pero no descarto que el mismo error aparezca en otros.
Gracias por la información.
EJMM
2011-08-31 16:20:06
Será que me puedan ayudar a cerca de swith?????
y muchas grasias
Choco
2011-10-07 19:24:00
El código:
int Menor1, Menor2, Menor3, Mayor3;
Menor1 = Menor2 = Menor3 = Mayor3 = false;
switch(numero)
{
case 0:
Menor1 = true;
case 1:
Menor2 = true;
case 2:
Menor3 = true;
break;
default:
Mayor3 = true;
}
¿se puede omitir el case 2? En el caso de numero==2 entrará en default, afectando únicamente a Mayor3 (tal y como hacía el código anterior). Si es menor, igualmente afectará a Mayor3.
int Menor1, Menor2, Menor3, Mayor3;
Menor1 = Menor2 = Menor3 = Mayor3 = false;
switch(numero)
{
case 0:
Menor1 = true;
case 1:
Menor2 = true;
default:
Mayor3 = true;
}
Steven R. Davidson
2011-10-07 20:20:31
Hola Choco,
El cambio que introduces no producirá el mismo comportamiento que el código original. El problema es que no has leído correctamente le nombre de la variable para el caso 2, que es:
case 2:
Menor3 = true;
break;
Es decir, hacemos esto,
Menor3 = true;
y no esto,
Mayor3 = true;
que es lo que pensabas. Por esto, el caso 3 es diferente al caso 2.
Espero haber aclarado la duda.
Steven