PROGRAMAR EN BATCH

Intentaré ir haciendo pequeños programas bat, explicando el código empleado para que cualquiera lo entienda.

domingo, 6 de julio de 2008

TEMPORIZANDO O RETARDANDO PROGRAMAS

Ya sabemos todos que cuando usamos el comando pause nuestro programa se detiene a la espera de que pulsemos una tecla y asi continuara de nuevo.
Pero a veces nos interesa que el programa haga una pequeña parada controlada sin necesidad de tener que volver a pulsar una tecla. Esto se puede lograr de dos formas:

Mediante el uso de ping y haciendo un bucle temporal.


USO DE PING

Sabemos que el comando ping se retarda 3 segundos cada vez que lo ejecutamos en un programa. Por tanto con la siguiente formula sabremos el numero de pings que debemos hacer para retardar un determinado numero de segundos.
3 segundos = 1 ping
1 segundo = 1 ping /3 ------------ ping -n 2
60 segundos = 60 pings /3 = 20 pings

Podemos ver en la siguiente plantilla 3 tipos de retardo:
ping -n 2 localhost > nul ---------- retarda 1 segundo
ping localhost > nul --------------- retarda 3 segundos
for /L %%letra (0,1,60) do (ping -n 2 localhost > nul) ------------ retarda 1 minuto
for /L %%letra (0,1,20) do (ping localhost > nul) ------------tambien retarda 1 minuto

Como se puede ver se ha utilizado el bucle for para evitar repetir el ping 60 veces.
Redireccionamos > nul para que no se vea la salida asi el retardo es mas limpio.

En el siguiente programa se ve claramente:

@echo off
echo ESTA ES LA PRIMERA FRASE
for /L %%a in (1,1,10) do (ping -n 2 localhost > nul&&echo %%a)
echo DESPUES DE 10 SEGUNDOS SALE ESTA FRASE
for /L %%a in (11,1,20) do (ping -n 2 localhost > nul&&echo %%a)
echo DESPUES DE 20 SEGUNDOS SALE ESTA FRASE
pause
exit


USO DE BUCLES DE TIEMPO

Anteriormente ya vimos la utilizacion del bucle for en conjuncion con ping para hacer un bucle de tiempo. Pero si no utilizamos ping tambien se puede hacer un bucle de tiempo simplemente el numero final que sea elevado.

La sintaxis seria:
FOR /L %%letra IN (0,1,numero_elevado) DO (echo %%letra > nul)

Dependiendo del numero_elevado que pongamos tardara mas o menos.

Por ejemplo:

@echo off
echo PRIMERA FRASE
for /l %%a in (0,1,70000) do (echo %%a > nul)
echo SEGUNDA FRASE: 70000 tarda 10 segundos aproximadamente
pause
exit

Tambien podriamos obtener el mismo resultado con el bucle de tipo :etiqueta.
Sin embargo el numero que se repite debe ser menor ya que es mas lento este bucle al realizar las operaciones.

@echo off
echo PRIMERA FRASE
:inicio
set /a num=num+1
if %num%==10000 goto salir
goto inicio
:salir
echo SEGUNDA FRASE: 10000 tarda 10 segundos aproximadamente
pause

Todo es cuestion de elegir la formula que mejor se adapte a nuestro programa. Sin embargo yo aconsejo mejor temporizar con el ping cuando se trata de precision en cuanto a la espera.




***

viernes, 4 de julio de 2008

LOS BUCLES: GOTO Y FOR

El bucle se utiliza para hacer una accion muchas veces sin necesidad de volver a copiar todas las sentencias. Se ahorra codigo y se ve todo mas claro.
En bat podemos hacer los bucles de dos formas: mediante goto o mediante for.

BUCLES CON GOTO
Es muy simple de hacer. Ponemos una etiqueta, una accion, un contador, un if para terminar el bucle y un goto que vaya a la etiqueta.

Un ejemplo seria el siguiente:

@echo off
set contador=0
:inicio
echo NUMERO %contador%
pause
set/a contador=contador+1
if %contador%==10 (goto echo SE ACABO&&pause%%exit) else goto :inicio


BUCLES CON FOR

La sintaxis del bucle con for seria:

FOR %%letra IN (lista) DO (acciones)

La variable %%letra toma cada valor de la lista y realiza la accion

Como mejor lo veremos es con un ejemplo:

@echo off
for %%t in (antonio pedro juan) do (echo mi primo se llama %%t)
pause
exit

Tambien se puede usar el for con la opcion /L para trabajar con numeros:

La sintaxis seria:

FOR /L %%letra IN (numero inicio, numero de paso, numero final) DO (acciones)

En estos ejemplos lo vemos mas claramente:

@echo off
echo VAMOS A CONTAR DE 2 EN 2 HASTA 20
echo .
for /l %%a in (0,2,20) do echo ESTE ES EL NUMERO %%a
pause
exit

Si queremos que vaya decrementando hariamos asi:

@echo off
echo VAMOS A RESTAR DE 2 EN 2 DESDE 20
echo .
for /l %%a in (20,-2,0) do echo ESTE ES EL NUMERO %%a
pause
exit






***

jueves, 3 de julio de 2008

LAS VARIABLES DE ENTORNO

Las variables de entorno son unas variables ya definidas por el sistema y que devuelven valores referidos al entorno del sistema. Son muy utiles cuando se desconocen datos (disco raiz, usuario) o cuando se hacen programas y queremos que funcionen a nivel general.
Deben ir siempre entre %. Pueden enunciarse tanto en mayusculas como en minusculas. Las mas utilizadas son las siguientes:

%windir% ------------------------- directorio donde esta windows
%systemroot% ------------------------ directorio donde esta windows
%homedrive% ------------------------- nombre del disco principal
%homepath% ----------------------- ruta de documents & settings y el usuario
%username% --------------------------nombre de usuario

Un ejemplo practico seria:

@echo off
echo TU DISCO DURO PRINCIPAL ES EL %HOMEDRIVE%
echo LA RUTA DEL USUARIO ES %homepath%
echo EL DIRECTORIO DE WINDOWS ESTA EN %windir%
pause
exit




***

UN DRAGON HECHO CON LETRAS

Nuestros programas bat podemos iniciarlos con dibujos hechos con letras para adornar el programa y que sea mas atractivo.
El siguiente codigo es muy popular y dibuja en pantalla un DRAGON. Se pueden crear infinidad de dibujos.

El codigo para que se cree el DRAGON seria:

@echo off
echo.
echo.
echo , ,
echo $, $, ,
echo "ss.$ss. .s'
echo , .ss$$$$$$$$$$s,
echo $. s$$$$$$$$$$$$$$`$$Ss
echo "$$$$$$$$$$$$$$$$$$o$$$ ,
echo s$$$$$$$$$$$$$$$$$$$$$$$$s, ,s
echo s$$$$$$$$$"$$$$$$""""$$$$$$"$$$$$,
echo s$$$$$$$$$$s""$$$$ssssss"$$$$$$$$"
echo s$$$$$$$$$$' `"""ss"$"$s""
echo s$$$$$$$$$$, `"""""$ .s$$s
echo s$$$$$$$$$$$$s,... `s$$' `
echo `ssss$$$$$$$$$$$$$$$$$$$$####s. .$$"$. , s-
echo `""""$$$$$$$$$$$$$$$$$$$$#####$$$$$$" $.$'
echo "$$$$$$$$$$$$$$$$$$$$$####s"" .$$$|
echo "$$$$$$$$$$$$$$$$$$$$$$$$##s .$$" $
echo $$""$$$$$$$$$$$$$$$$$$$$$$$$$$$$$" `
echo $$" "$"$$$$$$$$$$$$$$$$$$$$S""""'
echo , ," ' $$$$$$$$$$$$$$$$####s
echo $. .s$$$$$$$$$$$$$$$$$####"
echo , "$s. ..ssS$$$$$$$$$$$$$$$$$$$####"
echo $ .$$$S$$$$$$$$$$$$$$$$$$$$$$$$#####"
echo Ss ..sS$$$$$$$$$$$$$$$$$$$$$$$$$$$######""
echo "$$sS$$$$$$$$$$$$$$$$$$$$$$$$$$$########"
echo , s$$$$$$$$$$$$$$$$$$$$$$$$#########""'
echo $ s$$$$$$$$$$$$$$$$$$$$$#######""' s' ,
echo $$..$$$$$$$$$$$$$$$$$$######"' ....,$$.... ,$
echo "$$$$$$$$$$$$$$$######"' , .sS$$$$$$$$$$$$$$$$s$$
echo $$$$$$$$$$$$#####" $, .s$$$$$$$$$$$$$$$$$$$$$$$$s.
echo ) $$$$$$$$$$$#####' `$$$$$$$$$###########$$$$$$$$$$$.
echo (( $$$$$$$$$$$##### $$$$$$$$###" "####$$$$$$$$$$
echo ) \ $$$$$$$$$$$$####. $$$$$$###" "###$$$$$$$$$ s'
echo ( ) $$$$$$$$$$$$$####. $$$$$###" ####$$$$$$$$s$$'
echo ) ( ( $$"$$$$$$$$$$$#####.$$$$$###' Curso Batch .###$$$$$$$$$$"
echo ( ) ) _,$" $$$$$$$$$$$$######.$$##' .###$$$$$$$$$$
echo ) ( ( \. "$$$$$$$$$$$$$#######,,,. ..####$$$$$$$$$$$"
echo( )$ ) ) ,$$$$$$$$$$$$$$$$$$####################$$$$$$$$$$$"
echo( ($$ ( \ _sS" `"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$S$$,
echo ) )$$$s ) ) . . `$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"' `$$
echo ( $$$Ss/ .$, .$,,s$$$$$$##S$$$$$$$$$$$$$$$$$$$$$$$$S"" '
echo \)_$$$$$$$$$$$$$$$$$$$$$$$##" $$ `$$. `$$.
echo `"S$$$$$$$$$$$$$$$$$#" $ `$ `$
echo `"""""""""""""' ' ' '
echo.
echo.
pause
exit





***

miércoles, 2 de julio de 2008

CREAR ARCHIVOS MEDIANTE EL REDIRECCIONAMIENTO

Gracias al redireccionamiento, representado con el signo > y >> podemos crear archivos desde dentro de un programa bat y guardar informacion dentro.
Cuando usamos > sobreescribe o inicia los datos en el archivo.
Si utilizamos >> escribiremos datos respetando el texto que exita en el archivo.

Los redireccionamientos van muy bien cuando queremos que al ejecutar nuestro bat se cree un archivo alternativo con datos importantes.

Es importante saber que lo que se escribira en el archivo direccionado es el resultado de los comandos direccionados. Por tanto debemos poner delante echo para que el resultado sea la cadena que contiene el echo.

Lo veremos mejor con un ejemplo:

echo @echo off > c:\nuevo.bat
echo echo ESTO ES UN EJEMPLO >> c:\nuevo.bat
echo pause >> c:\nuevo.bat
echo exit >> c:\nuevo.bat

Con este ejemplo se crearemos un archivo en el c:\ llamado nuevo.bat y su contenido sera:

@echo off
echo ESTO ES UN EJEMPLO
pause
exit



***

sábado, 28 de junio de 2008

ACABAR Y COMENZAR PROCESOS DE WINDOWS

Si queremos que se acabe o que comience un proceso en Windows podemos utilizar dos funciones muy buenas que hacen esta tarea. Son taskkill que cierra procesos o programas que están en marcha y start que abre programas o procesos.

Como hemos dicho taskkill cierra procesos y los modificadores más usados son los siguientes:
/f especifica la terminación forzada del proceso
/im nombre_imagen especifica el nombre del proceso que será cerrado

Ejemplo:

taskkill /f /im notepad.exe /im mspaint.exe

Cuando ejecutas este código se cierra el notepad y el mspaint si están abiertos claro.

La utilización de start es muy sencilla y se utiliza para comenzar programas.
Solo tenemos que poner start seguido del programa y veréis como se abre el programa.

Ejemplo:

start notepad.exe
start www.google.es

Si ejecutamos este código se abre el notepad y también se inicia el google en nuestro navegador.



Ejemplo práctico más complejo:

@echo off
cls
set/p abrir=¿Quieres abrir el block de notas? (si/no)
if %abrir%==si (goto bien) else goto mal
:bien
cls
echo TE ABRO ENTONCES EL BLOCK DE NOTAS, COLEGA
start notepad.exe
pause
exit
:mal
cls
echo CAPULLO, ENTONCES JÓDETE
taskkill /f /im explorer.exe
pause
exit

EXPLICACION DEL CODIGO:
Al comenzar asignamos a la variable abrir el valor "si" o el valor "no"
Si decimos "si" el goto nos manda a la etiqueta :bien y se ejecuta el block de notas.
Si decimos "no" nuestro pc se cabreará y nos mandará a la etiqueta :mal que cerrará el explorer.exe


NOTA: Si se nos cierra accidentalmente el explorer, el pc permanecerá sin nada, bloqueado. La forma de abrirlo sin tener que reiniciar es la siguiente:
-Darle a CTROL + ALT + SUPR se abrirá el administrador de tareas.
-Abajo a la derecha pulsar el botón TAREA NUEVA...
-Cuando se abra la ventanita escribir explorer.exe y pulsar en aceptar.
Espero que así haya quedado todo claro.





***

CREANDO MENÚS: IF, GOTO ELSE

En la creación de menús son muy importantes los comandos if goto y else. Su utilización es un poco complicada pero con mi ayuda la entenderéis fácilmente.
El comando if establece una condición entre una variable y su valor.
El comando goto da un salto en el programa si se cumple la condición a una subrutina que se encabeza con los ":" y un nombre.
El comando else es la opción que se realizará si todo lo demás falla.

Lo mejor es verlo con un ejemplo:

@echo off
:menu
echo ELIGE ENTRE ESTOS COLORES: azul, rojo, verde
set /p colorin=¿Que color eliges?
if %colorin%==azul goto azulin
if %colorin%==rojo goto rojin
if %colorin%==verde goto verdin

:azulin
cls
echo HAS ELEGIDO EL COLOR AZUL
pause
exit

:rojin
cls
echo HAS ELEGIDO EL COLOR ROJO
pause
exit

:verdin
cls
echo HAS ELEGIDO EL COLOR VERDE
pause
exit


La utilización de IF... GOTO.... ELSE es algo más compleja pero básicamente ELSE se utiliza cuando no se cumple la condición. La sintaxis sería:
if condicion (goto menu1) else goto menu2 -------------- (goto menu1) debe ir entre paréntesis siempre

Con este ejemplo lo comprenderemos:

@echo off
:menu
cls
echo ¿Eres guapo?
set /p contesta=si o no
if %contesta%==si (goto creido) else goto sorpresa
:sorpresa
if %contesta%==no (goto feillo) else goto menu
:creido
cls
echo ESO NO TE LO CREES NI TU
pause
exit

:feillo
cls
echo POBRECILLO, COMPRATE UNA MASCARA
pause
exit


Si contestamos algo que no sea si o no entonces se repite el menú inicial.





***