![]() |
||||||||||
Programación BATCH Avanzada.
Temario. 1.- Variables y Argumentos. 2.- Imprimir caracteres de comandos. 3.- Algunas otras variables de Entorno. 4.- IF 5.- FOR 6.- Funciones 7.- Includes 8.- Misc 9.- EOF Variables y Argumentos El manejo de variables en batch, es muy flexible., y este nos permite hacer desde operaciones matemáticas, hasta seleccionar ciertas partes de una variable, asi como reemplazar cadenas de texto, y obtener archivos.. y sus propiedades, la fecha, hora, generar numeros aleatorios, entre otros. Los argumentos que recibe un batch, son recibidos de la siguiente forma: batch argumento1 dos tres hara que: %0 = batch %1 = argumento1 %2 = dos %3 = tres en %0 se guardara, el nombre del archivo. Podemos borrar el contenido de un parametro con el comando shift: Código:
@echo off al llamar: Código:
C:Documents and SettingsAdministradortempcurso>astring 123 456 789 shift borro, el primer argumento. Tambien contamos con los siguientes modificadores para los archivos: Código:
%~f1 - regresa la ruta y el archivo de %1. por ejemplo: en un directorio donde tenemos: Código:
C:Documents and SettingsAdministradortempcurso>dir este batch: Código:
@echo off llamandolo analiza.bat, saca el siguiente resultado: Código:
C:Documents and SettingsAdministradortempcurso>analiza archivo.txt Tambien podemos usar varias propiedades, por ejemplo, este codigo: Código:
@echo off saca este resultado: Código:
C:Documents and SettingsAdministradortempcurso>analiza archivo.txt Si lo que recibimos no es un archivo, sino una cadena de texto, que contiene mas de una palabra, se debe poner entre comillas, algo asi: astring "parametro de varias letras" al obtenerlo, en %1, lo recibimos con comillas, pero si usamos: Código:
@echo off saca este resultado: Código:
C:Documents and SettingsAdministradortempcurso>astring "parametro de varias letras" Y por ejemplo, si queremos obtener todos los argumentos, se usa: %* es decir: Código:
@echo off al ejecutar: astring parametro de varias letras nos regresa: Código:
C:Documents and SettingsAdministradortempcurso>astring parametro de varias letras Para asignar a una variable, el valor de algo escrito por el usuario, puedes usar: set /P variable= por ejemplo: Código:
@echo off hara algo asi: Código:
C:Documents and SettingsAdministradortempcurso>astring Ahora, si por ejemplo, queremos, hacer algo como, obtener las ultimas 3 letras del nombre: Código:
@echo off Aqui lo que estamos haciendo en la ultima linea: %NOM:~-3% hara, obtener los ultimos 3 caracteres, como si se tratara de la funcion substring. por ejemplo, esto: %NOM:~1,3% obtendra del segundo al cuarto caracter. (empiezas desde 0, recuerda) Para reemplazar cadenas, dentro de otra variable, es la siguiente sintaxis: Código:
@echo off esto reemplazara las letras "e" por "XXX". Para hacer calculos matematicos, se usa el modificado /A, de esta forma: Código:
@echo off tenemos las siguientes operaciones disponibles: Código:
() - agrupar Con este podemos usar numeros hexadecimales de la siguiente forma: Código:
@echo off al colocar 0x estamos especificando, que a continuacion se pondra un valor hexadecimal. Imprimir caracteres sin usar comandos Ahora, se preguntaran, en las variabes, siempre usamos los signos % Como imprimes uno? veamos: Código:
@echo off En resumen, si quieren imprimir, el caracter %, deben colocarlo 2 veces. Para otros caracteres, que ejecutan alguna accion en batch como: & | < > debes colocar este caracter antes:^ por ejemplo: Código:
echo <html><h1>Hola</h1></html> >index.html no funcionara, pero: Código:
echo ^<html^>^<h1^>Hola^</h1^>^</html^> >index.html dara: Código:
C:Documents and SettingsAdministradortempcurso>type index.html Algunas otras variables de entorno Tenemos otras variables de entorno que podrian servir, ademas de las comunes de ALLUSERSPROFILE y HOMEPATH, por ejemplo: Código:
@echo off Código:
C:Documents and SettingsAdministradortempcurso>astring Otras instrucciones muy utiles, serian POPD y PUSHD, que sirven para guardar y regresar al directorio actual, por ejemplo: Código:
@echo off PUSHD funciona de la siguiente manera: Guarda el directorio actual., y va a la ruta especificada. POPD regresa al directorio guardado por PUSHD podemos usarlos uno dentro de otro, asi: Código:
@echo off IF If, reconoce varias situaciones: valores de error comparar cadenas existencia de archivos comparaciones matematicas como ya sabemos %ERRORLEVEL% almacena algunos valores de otras funciones. al hacer IF ERRORLEVEL 1 @echo ok ELSE @echo no estariamos preguntando si ERRORLEVEL es 1, si lo es imprime OK, si no, imprime NO. tambien podemos comparar cadenas, por ejemplo: Código:
@echo off usamos %~1 para que aunque el usuario ponga comillas, no salga error Código:
@echo off este codigo, solo responde si dices hola CON minusculas. /I es para hacer mas estricta la comparacion. ahora, podemos usar IF en varias lineas: Código:
@echo off con parentesis (). si vamos a usar comparaciones numericas, debemos usar los siguientes codigos de comparación: Código:
por ejemplo: Código:
@echo off que regresa: Código:
C:Documents and SettingsAdministradortempcurso>acon Tambien podemos saber si una variable ya fue definida: Código:
IF DEFINED var ( FOR FOR es una herramienta muy completa, nos permite analizar segmentos de la salida de comandos, funciones y el contenido de archivos. Tambien permite hacer bucles de la siguiente manera: Código:
FOR /L %%var IN (inicio,incremento,fin) DO (acciones) inicio, es el valor inicial, incremento es la cantidad a sumar, y fin es la cantidad a detenerse, por ejemplo: Código:
FOR /L %%i IN (0,1,10) DO (echo %%i) sinembargo, la forma mas sencilla de usar FOR, es para numerar archivos, y hacer algo con ellos.. por ejemplo: Código:
FOR %%x in (x*) DO echo %%x para SOLO mostrar directorios: Código:
FOR /D %%x in (m*) DO echo %%x El comando se puede hacer "recursivo", es decir, que se ejecute dentro de cada directorio, con el comando "/R", por ejemplo, en una estructura de directorios como la siguiente: Código:
├───adios al ejecutar el comando: Código:
FOR /R /D %%x in (a*) DO echo %%x sinembargo, al ejecutar el comando.. Código:
FOR /R %%x in (*x*) DO echo %%x nos mostrara todos los archivos que coinciden con la sequencia especificada, incluso podriamos hacer un buscador en batch, con el uso de FINDSTR y FOR. Tenemos otro modificador, /F que nos permite usar ciertas opciones para separar el resulado de las acciones.. comandos, cadenas, o archivos. Su sintaxis es la siguiente: Código:
FOR /F ["opciones"] %var IN (conjunto) DO (acciones) conjunto puede ser: conjunto de archivos -> sin comillas cadena de caracteres -> con comillas dobles (" ") comando -> con comilla simple (' ') las opciones son las siguientes: eol -> todo lo que este despues de este caracter sera ignorado (para cada linea) skip -> numero de lineas a saltarse al principio del archivo/comando. delims -> esto sirve para separar las strings.. si no se coloca esta opcion, se usaran como separadores "espacio" y "tab" tokens -> esto es para especificar cuales segementos, delimitados por "delims", seran pasados a las variables.. por ejemplo: 1,2,3 solo pasara los primeros 3 segmentos. 1,2* pasara 2 segmentos, el primero y todo lo que este despues (el * regresa todo el resto de la linea) 1,2-6,8,9* regresara 4 segmentos, el primero, desde el segundo hasta el sexto, el octavo y el resto de la linea, despues del noveno, el signo de menos (-) genera intervalos. por ultimo, esta la opcion: usebackq -> que cambia la forma de interpretar si es string o comando, de la siguiente manera: 'cadena' `comando` Nota: [`] es diferente al caracter de acento [´] por ejemplo, el siguiente comando: Código:
FOR /F "tokens=1,3-5,7-9,10* delims= " %%i IN ("George no es malvado, es bondadoso, siempre piensa en los demas.") DO echo %%i %%j %%k %%l tonto, %%m %%n %%o matar a %%p %%q dara de resultado: Código:
George es malvado, es tonto, siempre piensa en matar a los demas. Funciones El uso de argumentos, de etiquetas y de filtros nos ayuda mucho al momento de escribir un codigo. Muchos creen que las etiquetas solo sirven para los goto.. sinembargo una etiqueta puede servir de funcion y recibir parametros. miren, el siguiente programa: Código:
@echo off al ser llamado, por ejemplo en: Código:
C:>ejemplo en este otro ejemplo: Código:
C:>ejemplo HOLA MUNDO hasta ahora.. todo es igual a usar goto a excepcion del uso de argumentos, sinembargo.. si queremos hacer un.. "return", se hace usando: goto:EOF entonces, en situaciones como: Código:
@echo off&call:main&goto:EOF como podemos ver goto:EOF se usa para regresar al orden de comandos. el resultado es algo asi: Código:
C:>operaciones Includes Para hacer un "include" oincluir un archivo, solo debes llamarlo asi: archivo_a_incluir.bat funcion argumentos y en el archivo a incluir, debe de estar al principio: @echo off&call:%*&goto:EOF queda algo asi: Código:
@echo off&call:%*&goto:EOF por ejemplo: --inclu.bat-- Código:
@echo off&call:%*&goto:EOF --inicio.bat-- Código:
@echo off esto daria este resultado: Código:
C:>inicio Misc Algunos filtros y comandos interesantes:
Código:
Busca cadenas en los archivos.
"titulo ventana nueva" especifica el titulo de la ventana que se generará. las opciones entre otros contienen: /Druta - el programa inicia en el directorio.. /B - la aplicación se inicia sin ventana /I - se inicia la aplicacion con el entorno original, es decir las modificaciones al entrono hechas en esta sesion, no afectaran el nuevo programa /MIN - La nueva ventana se inicia minimisada /MAX - La nueva ventana se inicia maximisada /SEPARATE - El programa se inicia en una zona de memoria separada /SHARED - El programa se inicia en una zona de memoria compartida Iniciar en prioridades: /LOW - baja /NORMAL - normal /HIGH - alta /REALTIME - tiempo real /ABOVENORMAL - sobre lo normal /BELOWNORMAL - debajo de lo normal /WAIT - Inicia el programa, y espera hasta que termine de ejecutarse por ejemplo, si quieren abrir un programa sin generar una ventana, por ejemplo netcat, podrian hacer algo asi: start /B /SEPARATE /HIGH /I /D %WINDIR% nc -L -p 1337 |exit que lo inicia en una zona de memoria separada, con prioridad alta, en el contexto original, y en %windir% EOF EOF es una etiqueta que define el fin del archivo, sirve para terminar funciones, y en este caso, solo sirve para terminar el documento , espero les sirva. |
![]() |