Vous êtes sur la page 1sur 97

Archivos por lotes (batch) Los tipos de fichero que puede ejecutar MS-DOS desde lnea de comandos deben

tener la extensin .exe, .com o .bat. Los dos primeros son archivos en lenguaje mquina (compilados), el tercero es un fichero ASCII, cuyas lneas son comandos MS-DOS que sern interpretados por la shell. Para llamarlos basta con escribir su nombre en la lnea de comandos, no es necesario especificar la extensin, pero deben estar accesibles: bien en el directorio actual ( . ), o bien en alguno de los directorios especificados en la variable PATH. Qu sucede si dos archivos ejecutables se denominan igual?, los ficheros bat son los que tienen menor prioridad de ejecucin: 1) macros 2) comandos internos 3) .exe 4) .com 5) .bat Ejemplo. El siguiente archivo bat crea una unidad virtual Z: para el directorio en que nos encontramos: uvz.bat subst Z: . C:\Documents and Settings\Administrador>copy con uvz.bat subst Z: . ^Z 1 archivos copiados. C:\Documents and Settings\Administradoruebas>uvz ejecuto el archivo bat C:\Documents and Settings\Administrador>subst Z: . ejecutar C:\Documents and Settings\Administradorebas>z: Z:\>subst Z:\: => C:\Documents and Settings\Administrador Puede contener mltiples lneas: uvz.bat subst /d Z: subst Z: . subst comentarios me muestra el comando que va a

En un archivo por lotes podemos incluir lneas de comentario con la palabra REM (remark): REM comentario Comando ECHO Nos permite visualizar mensajes en pantalla. ECHO [mensaje | ON | OFF] Muestra mensajes o activa y desactiva el eco del comando. Escriba ECHO sin parmetros para mostrar la configuracin actual del eco. echo. inserta una lnea en blanco El siguiente bat muestra un listado simple de directorio, separando archivos de directorios: REM list.bat echo --- ARCHIVOS --dir /a-d /b /on echo --- DIRECTORIOS --dir /ad /b /on Eco de los comandos Cada comando de un archivo por lotes es visualizado en pantalla antes de ser ejecutado. Esto puede estar bien para depuracin, pero a veces es un poco molesto: La ejecucin del fichero bat anterior (list.bat) sera: C:\Documents and Settings\Administrador>list C:\Documents and Settings\Administrador>REM list.bat <---o C:\Documents and Settings\Administrador>echo --- ARCHIVOS --- <---o --- ARCHIVOS --C:\Documents and Settings\Administrador>dir /a-d /b /on <---o ntuser.bak ntuser.dat NtUser.dat.LOG ntuser.ini C:\Documents and Settings\Administrador>echo --- DIRECTORIOS --- <---o --- DIRECTORIOS --C:\Documents and Settings\Administrador>dir /ad /b /on <---o Escritorio Favoritos Men Inicio Mis documentos Si queremos anular este comportamiento, y que un comando se ejecute de manera silenciosa, precedemos al comando del carcter arroba: @dir /a-d /b /on

Pero si deseamos anular el eco para todos los comandos, la primera lnea ser el comando ECHO OFF: @echo off REM list.bat echo --- ARCHIVOS --dir /a-d /b /on echo --- DIRECTORIOS --dir /ad /b /on Ahora la ejecucin del fichero bat es la siguiente: C:\Documents and Settings\Administrador>list --- ARCHIVOS --ntuser.bak ntuser.dat NtUser.dat.LOG ntuser.ini --- DIRECTORIOS --Escritorio Favoritos Men Inicio Mis documentos Estructura de bifurcacin GOTO En un archivo bat la ejecucin de los comandos no es necesariamente secuencial, la intruccin GOTO nos permite continuar la ejecucin del archivo BAT en otro punto del mismo: GOTO etiqueta -comandos:etiqueta -comandosEl siguiente archivo zzz.bat muestra de manera indefinida los segundos pasar: @echo off set cont=0 :bucle cls echo Mira pasar el tiempo ... %cont% ping -n 1 -w 800 0.0.0.1 > NUL set /a cont=cont+1 goto bucle Para la mayora de los comandos, cuando no pueden ejecutarse por algn motivo, se muestra el mensaje de error correspondiente y contina la ejecucin con el siguiente de la lista. En el caso del GOTO (y unos pocos ms), si no existiera la etiqueta 'bucle' finalizara el programa con un error.

Su uso principal es en las estructuras if. Pausar el programa A veces interesar suspender temporalmente la ejecucin de un archivo bat para que el usuario lleve a cabo alguna accin: encender la impresora, insertar cierto disquete, interrumpir el proceso, ... PAUSE Suspende el proceso de un programa por lotes y por muestra el mensaje Presione una tecla para continuar... Ejemplos: @ECHO OFF CLS ECHO Inserte el diskette de nminas en la unidad A: PAUSE ... @ECHO Se van a borrar todos los archivos de la unidad Z: @ECHO Ctrl + C para interrumpir @PAUSE ... Carcter de escape en MS-DOS Cuando deseamos permutar el significado de alguno de los caracteres con significado especial (pipe, operadoress de redireccin, ...) le precederemos del smbolo ^ (ALT + 94). El siguiente programa BAT no funcionara como se espera, pues interpreta el pipe como "redireccin a entrada estndar del comando /?": ayuda.bat @echo off echo Sintaxis: echo reboot [ hh:mm | /? ] X:\>ayuda Sintaxis: "/?" no se reconoce como un comando interno o externo, programa o archivo por lotes ejecutable. La solucin sera: echo reboot [ hh:mm ^| /? ] Tambin sera til en un caso como el siguiente: echo ^<html^> > pagweb.html

para evitar que la shell interprete cierto smbolos mayor/menor como operadores de redireccionamiento. Paso de parmetros a un archivo bat Hay dos mtodos para pasar informacin: 1) lnea de comandos 2) entrada estndar 1- Paso de parmetros a un archivo bat desde entrada estndar SET /P variable=[mensaje] El modificador /P permite establecer el valor de una variable para una lnea de entrada escrita por el usuario. Muestra el mensaje antes de leer la lnea de entrada. NOTA: Funciona a partir de W2000, y deben estar habilitadas las extensiones de comando. grosero.bat @echo off set /p nombre=Cmo te llamas? echo. echo nunca me gust el nombre de %nombrex% Por recibir el argumento desde entrada estndar, podemos introducir la informacin a travs de de un pipe, o redirigida desde un archivo o dispositivo: X:\pruebas>grosero.bat Cmo te llamas? Paco Pico nunca me gust el nombre de Paco Pico X:\pruebas>echo Ferreolo Anastasio | grosero.bat Cmo te llamas? nunca me gust el nombre de Ferreolo Anastasio X:\pruebas>grosero.bat < grosero.bat Cmo te llamas? nunca me gust el nombre de @echo off
NOTA:

Podemos usar comillas en el mensaje que no sern visualizadas: set /p nombre="Cmo te llamas? " 2- Paso de parmetros a un archivo bat desde lnea de comandos Podemos introducir datos al fichero .bat desde lnea de comandos, que sern almacenados en las denominadas variables posicionales: %0, %1, %2, ..., %9 En %0 se almacena el nombre del comando En %1 se guarda el valor del primer argumento

En %2 se guarda el valor del segundo argumento, y as sucesivamente. El parmetro %* contiene la lista con todos los argumentos introducidos desde lnea de comandos. El siguiente programa repite lo que introducimos desde lnea de comandos (excepto el nombre del comando): repite.bat @echo %* Y sin mucho esfuerzo podemos dar la vuelta a una frase de hasta 9 palabras: reverse.bat @echo %9 %8 %7 %6 %5 %4 %3 %2 %1 X:\>repite lo que yo te diga lo que yo te diga X:\>reverse lo que yo te diga diga te yo que lo SHIFT En el ejemplo anterior, vemos que si la frase tiene ms de 9 palabras, reverse no las visualiza: X:\>reverse En un lugar de la mancha cuyo nombre no quiero acordarme nombre cuyo de Mancha la de lugar En Cuando los argumentos desde lnea de comandos son ms de 9, es necesario irlos desplazando si queremos leer todos. El comando SHIFT desplaza el valor de todos los argumentos posicionales un lugar hacia la izquierda:

modifiquemos un poco el fichero reverse.bat para ver el funcionamiento de shift: reverse.bat @echo off

echo %9 %8 %7 %6 %5 %4 %3 %2 %1 shift echo %9 %8 %7 %6 %5 %4 %3 %2 %1 shift echo %9 %8 %7 %6 %5 %4 %3 %2 %1 X:\> en un lugar de la mancha cuyo nombre no quiero acordarme nombre cuyo de Mancha la de lugar un En no no nombre cuyo de Mancha la de lugar un quiero quiero no nombre cuyo de Mancha la de lugar Si las extensiones de comando estn habilitadas, podemos comenzar los deplazamientos en un determinado parmetro. Por ejemplo: SHIFT /2 Realiza el desplazamiento a partir del argumento %2, dejando fijos los parmetros %0 y %1 Estructura de control: IF Mediante la estructura IF podemos realizar un procesamiento condicional en programas por lotes. IF [NOT] {cadena1==cadena2 | EXIST archivo | ERRORLEVEL nmero} comando cadena1==cadena2 - La condicin es verdadera si las cadenas de texto son exactamente iguales (comparacin de cadenas case sensitive). EXIST archivo - Es verdadero si existe el archivo especificado. ERRORLEVEL nmero - La condicin es verdadera si la ejecucin del ltimo comando devolvi un cdigo de salida igual o mayor (>=) que el nmero especificado. comando - es el comando que se ejecutar si se cumple la condicin. NOT - Niega la condicin: el comando se ejecutar si la condicin es falsa. Cuando no estemos muy seguros de que los operandos del IF vayan a contener algn valor, conviene aadir algn delimitador con el fin de evitar comparaciones con un "vaco". Las siguientes lneas provocarn un error cuando el usuario no introduzca ningn valor en la variable posicional %1: IF %1==TE goto TERUEL IF NOT EXIST %1 echo NO ENCUENTRO EL ARCHIVO pues la comparacin a realizar sera: IF ==TE goto TERUEL <-- ERROR de SINTAXIS !!! IF NOT EXIST echo NO ENCUENTRO EL ARCHIVO <-- ERROR de SINTAXIS !!! Para la primera existen infinitas soluciones, la segunda deberemos encerrarla entre comillas: IF '%1'=='TE' goto TERUEL

IF IF IF IF

"%1"=="TE" goto TERUEL {%1}=={TE} goto TERUEL .%1==.TE goto TERUEL gamusino%1verde==gamusinoTEverde goto TERUEL

IF NOT EXIST "%1" echo NO ENCUENTRO EL ARCHIVO OR No existe el operador OR, la alternativa es ejecutar varias IF una a continuacin de otra: if "%1"=="/?" goto AYUDA if "%1"=="--help" goto AYUDA if "%1"=="" goto AYUDA AND Para el operador AND debemos anidar IF: IF EXIST "%1" IF EXIST "%2" COMP %1 %2 EJEMPLOS En el siguiente ejemplo se ha aadido una ayuda al comando repite.bat: @echo off if "%1"=="/?" goto AYUDA if "%1"=="" goto FIN echo %* goto FIN :AYUDA echo. echo Este comando repite la frase que usted escriba echo - Sintaxis: echo repite [ /? ^| frase] echo. :FIN El siguiente programa aade la hora actual al archivo introducido desde lnea de comandos, si no existe nos informa del fallo: @echo off if NOT EXIST "%1" goto ERROR echo %TIME% >> %1 goto FIN :ERROR echo No se encontr el fichero %1 :FIN

Qu sucede si %1 es un directorio? ERRORLEVEL Casi todos los comandos, tras su ejecucin, devuelven un cdigo de estado, que es un nmero indicativo de cmo ha finalizado la ejecucin del programa. Este cdigo suele ser 0 cuando la ejecucin finaliz con xito, y otro valor si hubo algn tipo de anomala. Cuando el comando IF compara el errorlevel, nos devolver 'true' cuando este sea superior o igual al nmero especificado. Es decir: IF ERRORLEVEL 3 comando equivaldra a: IF NOT ERRORLEVEL 3 comando equivaldra a: Los siguientes fragmentos de cdigo tienen el mismo efecto: 1) IF ERRORLEVEL 1 goto ALGUN_ERROR - comandos cuando errorlevel<1 :ALGUN_ERROR - comandos cuando errorlevel>=1 2) IF NOT ERRORLEVEL 1 goto CORRECTO - comandos cuando errorlevel>=1 :CORRECTO - comandos cuando errorlevel<1 El siguiente cdigo utiliza el errorlevel para comprobar si el disquete est introducido en la disquetera: @echo off :LEER vol A:\ >NUL 2>NUL if errorlevel 1 goto NO-DISCO REM aqu iran las operaciones a realizar sobre el diskete goto FIN :NO-DISCO echo Introduzca un disquete en la unidad A: pause goto LEER :FIN NOTA: Podramos haber utilizado DIR, aunque si el directorio raz est vaco tambin devuelve un errorlevel igual a 1. ejercicios. 1. El siguiente programa en ensamblador lee una pulsacin de teclado y almacena su cdigo ASCII en la variable ERRORLEVEL: si (errorlevel >= 3) comando si (errorlevel < 3) comando

Z:\>debug getch.com No se encuentra el archivo -a 1517:0100 mov ah, 08 - funcin que captura la pulsacin de una tecla sin eco, 1517:0102 int 21 almacena el resultado en AL 1517:0104 mov ah, 4C - funcin que retorna al programa llamante, con cdigo de 15A6:0106 int 21 retorno el almacenado en AL 15A6:0108 -r cx CX 0008 :8 -w Escribiendo 00008 bytes -q Z:\>getch - aqu pulso la X mayscula Z:\>echo %errorlevel% 88 Completar el siguiente archivo BAT que muestra un men con varias opciones: @echo off :MENU cls echo elija opcin echo A-Archivo de clientes echo B-Archivo de proveedores echo C-Finalizar getch if errorlevel ..?.. goto CLIENTES, PROVEEDORES o FIN ..?.. if errorlevel ..?.. goto CLIENTES, PROVEEDORES o FIN ..?.. if errorlevel ..?.. ... ..?.. goto MENU :CLIENTES ... :PROVEEDORES ... :FIN Cdigos ASCII: A (65), B (66), C (67), a (97), b (98), c (99) 2. Escribir un programa ping2.bat que nos permite hacer un ping a mltiples hosts de una misma red. Nos mostrar un mensaje diciendo si el host est o no conectado:

C:\>ping2 13 2 5 55 99 128 129 130 131 132 133 200 201 222 192.168.1.13 - conectado 192.168.1.2 - conectado 192.168.1.5 - NO EST CONECTADO 192.168.1.55 - conectado ... Cuando se hace ping a una IP, el errorlevel devuelto siempre es 0, independientemente de que nos respondan con un pong. Para discernir entre un host conectado y uno inalcanzable, debemos generar un errorlevel, por ejemplo buscando con FIND alguna palabra en la informacin mostrada por el PING, que ser distinta en cada caso. 2. Mejorar el programa anterior, de manera que el primer argumento sea la red: C:\>ping3 10.0.0 13 2 5 55 99 128 129 130 131 132 133 200 201 222 10.0.0.13 - conectado 10.0.0.2 - conectado 10.0.0.5 - NO EST CONECTADO 10.0.0.55 - conectado ...
INDICACIN:

MEJORAS en el IF Cuando las extensiones de comando estn habilitadas, IF tiene mayor funcionalidad: a) Podemos preguntar por la existencia de variables: IF DEFINED variable comando C:\sirio>set x=25 C:\sirio>if defined x echo Ya existe la variable x, su valor es %x% Ya existe la variable x, su valor es 25 b) Y realizar comparaciones lgicas, diferentes a la igualdad: IF [/I] cadena1 op-log cadena2 comando Los operadores lgicos admitidos son: EQU - igual NEQ - no igual LSS - menor que LEQ - menor que o igual GTR - mayor que GEQ - mayor que o igual /I indica que la comparacin se har case insensitive (ignora la diferencia entre MAYs y mins) c) Ahora el IF admite ms de un comando, el grupo de comandos debemos encerrarlo entre parntesis. Tambin admite la clusula (opcional) ELSE: IF expr-lgica ( - sentenciaS TRUE ) ELSE (

<-- separa ELSE de los parntesis por algn espacio

- sentenciaS FALSE ) C:\>set a=Andorra C:\>set b=Barcelona C:\>IF a LSS b (echo %a% %b%) ELSE (echo %b% %a%) Andorra Barcelona Expansin retardada de variables Las variables comprendidas entre los parntesis las expande en el momento de la llegada al IF: antes de ejecutar ninguna de las instrucciones interiores. En el siguiente programa: @echo off set VAR=basura echo antes del IF: %VAR% IF DEFINED VAR ( set VAR=CHATARRA echo en el IF: %VAR% ) echo despus del IF: %VAR% su ejecucin nos dara un resultado un tanto sorprendente: C:\prueba>prog antes del IF: basura en el IF: basura Pero si ya he cambiado el valor de la variable !! despus del IF: CHATARRA La solucin a este problema es utilizar lo que en palabras de soft se conoce como "expansin de variables retardada" (ver cmd /? y set /?): 1. Debemos habilitarla (por defecto vienen deshabilitadas), para ello necesitamos abrir una subshell: cmd /v:on o bien introducir como primera instruccin del bat: SETLOCAL ENABLEDELAYEDEXPANSION 2. Las variables que deseemos que se expandan en el momento preciso de su utilizacin las rodearemos con admiraciones (!). El siguiente programa funcionara correctamente: @echo off set VAR=basura echo antes del IF: %VAR% IF DEFINED VAR ( set VAR=CHATARRA echo en el IF (1): %VAR%

echo en el IF (2): !VAR! ) echo despus del IF: %VAR% C:\Documents and Settings\sirio\prueba>cmd /v:on Microsoft Windows 2000 [Versin 5.00.2195] (C) Copyright 1985-2000 Microsoft Corp. C:\Documents and Settings\sirio\prueba>vprog antes del IF: basura en el IF (1): basura <-- Aqu he utilizado %VAR% en el IF (2): CHATARRA <-- y aqu !VAR! despus del IF: CHATARRA NOTA: Este mismo problema se presenta en el FOR, la solucin es la misma: expandir las variables en el momento de su utilizacin, no al iniciar la ejecucin de la estructura for Bucles FOR Ejecuta el comando para cada uno de los elementos especificados en la lista: FOR %NombreVariable IN (lista) DO comando FOR %%NombreVariable IN (lista) DO comando <-- desde lnea de comandos <-- dentro de archivos BAT

NombreVariable Un nombre de variable de un nico carcter, que se utilizar para recorrer los elementos o archivos de la lista. OjO: La variable diferencia si es MAYSCULA o minscula. (lista) Especifica un conjunto de elementos o archivos separados por coma, punto y coma o espacio en blanco. Si en la lista aparecen comodines ( ? o * ) el comando se ejecutar para cada uno de los archivos que cumplan la expresin regular. comando Comando MS-DOS a ejecutar con cada elemento de la lista. ejemplo 1 -- for desde lnea de comandos: W:\>for %x in (uno dos tres cuatro) do @echo %x uno dos tres cuatro -- y desde un archivo bat: W:\>more > repite.bat @echo off for %%X in (%*) do echo %%X ^Z W:\>repite ms-dos es "bueno, bonito y barato" ms-dos es "bueno, bonito y barato"

NOTA: Si las extensiones de comandos estn habilitadas, podemos suprimir las comillas de una variable con el smbolo ~ : for %%X in (%*) do echo %%~X (ms informacin: for /?) ejemplo 2 Cuando aparece un * en la lista, lo interpreta como un comodn, y antes de aplicar el comando se crear una lista de archivos que cumpla con la expresin regular. En la elaboracin de la lista slo utiliza archivos, NO directorios. C:\pruebas>FOR %f IN (*) DO @echo %f <-- visualizamos los archivos del directorio actual punto.NET.txt Frases.odt net.jpg ejerci1.gif ... C:\pruebas>for %f in (*.png, *.jpg, *.gif) do move %f C:\Recycled En el ltimo ejemplo hemos movido las imgenes con formatos grficos de internet a la papelera del disco C:. - Echar un vistazo a la papelera desde Windows se ven? Y desde MS-DOS? - Vaciar la papelera desde Windows. Se han borrado? - Volver al da siguiente y comprobar que las imgenes siguen ah: aunque tiremos de la cadena 1000 veces, los documentos nunca desaparecern. Una curiosa forma de esconder documentos y que nadie los borre: en la basura. ejemplo 3 El siguiente archivo BAT nos lista todos los archivos ejecutables (.exe, .com, .bat) del directorio pasado desde lnea de comandos. (Si no pasamos argumento, muestra los del raz) @echo off FOR %%X IN (%1\*.exe %1\*.com %1\*.bat) DO echo %%X

MEJORAS en el FOR Cuando las extensiones de comandos estn habilitadas (por defecto lo estn, ms informacin: CMD /? ), el comando FOR admite una serie de parmetros que amplan su funcionalidad: FOR /R [ruta] %V IN (lista) DO comando <-- Recursividad FOR /D %V IN (lista) DO comando <-- Directorios FOR /L %V IN (inicio, incremento, fin) DO comando <-- Lista con contador FOR /F ["tokens=... delims=..."] %V IN (archivo | 'comando' | "cadena") DO comando <-- Recorrido de tokens en lneas de texto 1 - Con el parmetro /R ejecuta el comando recursivamente: C:\>for /R %x in (*) do @echo %x

C:\bat2exe.com C:\editpad.zip C:\LANGUAGE.txt ... C:\WINNT\discover.exe C:\WINNT\explorer.scf C:\WINNT\winhlp32.exe ... C:\WINNT\system32\mscoree.dll C:\WINNT\system32\msorcl32.dll C:\WINNT\system32\aaaamon.dll ... Ejemplo 2: Visualizamos todas las dll y exe a partir de C:\WINNT: C:\>for /R C:\winnt %x in (*.dll *.exe) do @echo %x C:\winnt\twain.dll C:\winnt\twain_32.dll C:\winnt\vmmreg32.dll C:\winnt\system32\mscoree.dll C:\winnt\system32\msorcl32.dll C:\winnt\system32\mmc.exe C:\winnt\system32\wscript.exe C:\winnt\system32\javaws.exe ... 2 - Con el parmetro /D recorre los directorios, en lugar de los ficheros: C:\>for /D %x in (*) do @echo %x WINNT Documents and Settings Archivos de programa prog ... 3 - Con el parmetro /L podemos crear el tpico bucle por contador: FOR /L %NombreVariable IN (inicio salto final) DO comando podemos separar "inicio", "salto" y "final" por comas ( , ) o punto y coma ( ; ). Con el siguiente archivo bat creamos archivos txt vacos, cuyo nombre y cantidad especificamos desde lnea de comandos: C:\pruebas>copy con crea.bat @ECHO OFF FOR /L %%A IN (1 1 %1) DO ECHO 2> %2%%A.txt >NUL ^Z 1 archivos copiados. C:\pruebas>crea 5 churro

C:\pruebas>DIR CH* /B churro1.txt churro2.txt churro3.txt churro4.txt churro5.txt El siguiente archivo BAT, hace un ping a broadcast, mostrando slo la direcciones de aquellos que contestan: C:\pruebas>more > pingred.bat @ECHO OFF SET RED=192.168.1. FOR /L %%H IN (1, 1, 255) DO ping -n 1 %RED%%%H | FIND "TTL=" ^Z C:\pruebas>pingred Respuesta desde 192.168.1.1: bytes=32 tiempo=1ms TTL=128 Respuesta desde 192.168.1.13: bytes=32 tiempo<10ms TTL=64 Respuesta desde 192.168.1.22: bytes=32 tiempo<10ms TTL=64 Respuesta desde 192.168.1.25: bytes=32 tiempo<10ms TTL=64 4 - Con el parmetro /F podemos recorrer: a- un archivo b- el resultado de la ejecucin de un comando c- una cadena A) ARCHIVO X:\>type fich.txt El corazn y el cerebro, las dos grandes vsceras que se llevan la primaca de los sentimientos y de la razn, son las que presiden el arranque de las coplas de Jorge Manrique a la muerte de su padre. X:\>for /F %x in (fich.txt) do @echo %x El que la coplas El for va recorriendo todas las lneas, y cada lnea se ha dividido en "tokens" (por defecto: token=palabra). La variable del for almacena el primer token de cada lnea. tokens Podemos seleccionar varios tokens mediante la clusula tokens=, Los distintos tokens se irn guardando en nombres de variable alfabticamente consecutivas a partir de la variable utilizada en el for: En el siguiente ejemplo nos quedamos con los tokens (palabras) 1, 3 y 5 de cada lnea:

X:\>for /F "tokens=1,3,5" %i in (fich.txt) do @echo %i - %j - %k El - y - cerebro, que - llevan - primaca la - son - que coplas - Jorge - a Podemos escoger rangos, en el siguiente ejemplo nos quedamos con las 3 primeras palabras y la 5: X:\>for /F "tokens=1-3,5" %a in (fich.txt) do @echo %a %b %c - %d El corazn y - cerebro, que se llevan - primaca la razn, son - que coplas de Jorge - a Y si deseamos la lnea completa a partir de la 7 palabra: X:\>for /F "tokens=7*" %A in (fich.txt) do @echo %A %B dos grandes vsceras los sentimientos y de el arranque de las muerte de su padre. Y si queremos toda la lnea, seleccionaremos todos los tokens de cada lnea: X:\>for /F "tokens=*" %m in (fich.txt) do @echo [ %m ] [ El corazn y el cerebro, las dos grandes vsceras ] [ que se llevan la primaca de los sentimientos y de ] [ la razn, son las que presiden el arranque de las ] [ coplas de Jorge Manrique a la muerte de su padre. ] delimitadores En los ejemplos anteriores los "tokens" coincidan con las palabras, pues para separarlos se han utilizado el espacio en blanco y la tabulacin. Podemos modificar los delimitadores con la clusula delims= En el siguiente ejemplo anulamos los delimitadores y obtenemos lo mismo de antes: X:\>for /F "delims=" %K in (fich.txt) do @echo [ %K ] [ El corazn y el cerebro, las dos grandes vsceras ] [ que se llevan la primaca de los sentimientos y de ] [ la razn, son las que presiden el arranque de las ] [ coplas de Jorge Manrique a la muerte de su padre. ] Utilizamos como delimitadores los signos de puntuacin (punto, coma, punto y coma, y dos puntos) - no debe haber espacios entre ellos- y nos quedamos con el primer token: X:\>for /F "delims=.,;:" %m in (fich.txt) do @echo %m El corazn y el cerebro que se llevan la primaca de los sentimientos y de la razn

coplas de Jorge Manrique a la muerte de su padre Podemos combinar delimitadores y tokens: for /F "tokens=1,2,3 delims=.,;:" %M in (fich.txt) do @echo %M %N %O Y utilizar otras clusulas, como skip=n, que se saltara las n primeras lneas del archivo, empezando a procesar en la n+1, o eol=carcter, que interpreta las lneas que comienzan por ese carcter como lneas de comentario y no sern procesadas, o useback que cambia la semntica de la lista: (`comando`) , ('cadena') , (archivo) ("archivo1 archivo2 archivo3") B) COMANDO El funcionamiento es similar al de los ficheros, nicamente que tendremos que encerrar el comando con comillas simples: X:\>for /F "tokens=15 delims=: " %x in ('ipconfig ^| find "IP"') do set myIP=%x x:\>set myIP myIP=192.168.1.33 Observar el carcter de escape ^ necesario para que el pipe lo interprete dentro del comando en lugar de ser interpretado para el FOR. C) CADENA Con el siguiente comando aadimos la fecha a un nombre de archivo: X:\>type rdate.bat for /f "tokens=2-4 delims=/ " %%W in ("%date%") do ren %1 %%Y%%X%%W-%1 X:\>rdate backup.bat Ejecuta: ren backup.bat 20060219-backup.bat FORMATOS DE SALIDA Podemos especificar un formato para la variable del for. Por ejemplo: C:\Documents and Settings\sirio>for %x in (*) do @echo %~fsx C:\DOCUME~1\sirio\mueve.bat C:\DOCUME~1\sirio\TEMPFI~1.DIF f: ruta completa s: short name C:\DOCUME~1\sirio\EXCURS~1.TXT C:\DOCUME~1\sirio\EXCURS~2.TXT C:\DOCUME~1\sirio\EXCURS~3.TXT C:\DOCUME~1\sirio\ABC~1.TXT C:\DOCUME~1\sirio\DIAD~1.TXT C:\DOCUME~1\sirio\HID~1 C:\DOCUME~1\sirio\FONTS~1.CAC C:\Documents and Settings\sirio>for %x in (*) do @echo %x mueve.bat tempfile.diff

Excursiones.txt Excursiones del ao 2004.txt Excursiones del ao 2005.txt A B C.txt dia D.txt .hid .fonts.cache-1 O simplemente %~X, que elimina las comillas (si las tuviera) como vimos arriba. Podemos consultarlos todos ejecutando for /? Acortar direcciones: Cuando usamos un for para recorrer los archivos nos devuelve la direccin entera del archivo. Esto es molesto, cuando lo que queremos es solo su nombre, o saber su ubicacin. Ahora les voy a ensear una tcnica para acortar esas direcciones. En el caso por ejemplo de que la variable X tenga la direccin de un archivo y solo quisiramos saber su extensin, usaramos: %~Xx y si quisiramos saber en que unidad se encuentra: %~dX Para entender un poco mejor esto, miremos esto como una sintaxis. Siempre se usara %~ seguido de una letra que representa lo que queremos obtener (el nombre, la extensin, etc) y por ultimo el nombre de la variable. Las letras que podemos usar son:

f Ruta y Nombre d Nombre Unidad donde se encuentra p Solo ruta n Solo nombre x Extensin s Ruta abreviada a Atributos t Fecha y hora de creacin z Tamao del archivo

Por ejemplo, este programa nos mostrara algunos datos de los archivos que existan en la misma carpeta y directorios superiores. @echo off FOR /R %%X in (*) DO ( echo Nombre: %%~nX echo Extension: %%~xX echo Tamao: %%~zX echo. )

Expansin de variables retardada Cuando aparecen variables de entorno en las estructuras IF y FOR, su valor es calculado al inicio de stos, y ya no se modifica hasta que finaliza el bucle for o la agrupacin de sentencias. El siguiente programa debera contar el nmero de veces que aparece la palabra %2 en el fichero %1: @echo off set cont=0 for /f "tokens=*" %%L in (%1) do ( for %%P in (%%L) do ( if /I "%%P"=="%2" set /A cont=%cont%+1 ) ) echo En %1 aparece %cont% veces la palabra %2 Pero la ejecucin siempre nos da el mismo resultado: Z:\pruebas>cuenta Quijote.txt sancho En Quijote.txt aparece 0 veces la palabra sancho Pues la variable cont se sustituye por su valor (0) al entrar en el bucle y siempre estoy ejecutando la instruccin: if /I "%%P"=="%2" set /A cont=0+1 Por lo que el resultado final del programa ser 0 1 (depende de si el ltimo IF de todos es cierto o no) La solucin es utilizar una shell con "sustitucin de variables retardada", donde las variables que deseemos que se sustituyan en el mismo instante de su utilizacin las encerraremos con admiraciones. Deberemos cambiar la lnea anterior por: if /I "%%P"=="%2" set /A cont=!cont!+1 Y ejecutar el programa en una shell con susitucin retardada: cmd /v:on Aunque si deseamos que el programa bat se ejecute por defecto, con sustitucin de variables retardada, podemos aadir como primera lnea: SETLOCAL ENABLEDELAYEDEXPANSION Subrutinas: Llamar a un fichero BAT desde otro fichero BAT Desde un fichero BAT podemos invocar la ejecucin de otro fichero BAT (subrutina) de varias formas:

1: Llamada sin retorno: Escribiendo el nombre de otro archivo bat En este caso el control se transfiere de un programa bat a otro, por finalizada la ejecucin del programa bat que realiz la llamada (es como un GOTO sin retorno). Por ejemplo, con los siguientes archivos bat: --- principal.bat @echo off echo INICIO PRINCIPAL set x=PRINCIPAL rutina echo VARIABLE X: %x% echo FIN PRINCIPAL El resultado de la ejecucin sera: Z:\pruebas>principal INICIO PRINCIPAL ejecutando el subprograma ... variable x: PRINCIPAL variable x: SUBPROGRAMA finalizando el subprograma Z:\pruebas>set x x=SUBPROGRAMA --- rutina.bat @echo off echo ejecutando el subprograma ... echo variable x: %x% set x=SUBPROGRAMA echo variable x: %x% echo finalizando el subprograma

( se han ejecutado en la misma shell )

2: Ejecucin en subshell: se abre una subshell donde se ejecutar el subprograma: cmd /c progbat2 Al abrirse una nueva subshell, todas las variables de entorno que defina en la subrutina se pierden al volver a la shell principal. Cuando finaliza la subrutina, se contina con la ejecucin del programa principal. En el programa "principal.bat", cambiamos la lnea de llamada por: El resultado de la ejecucin es: Z:\pruebas>principal INICIO PRINCIPAL ejecutando el subprograma ... variable x: PRINCIPAL variable x: SUBPROGRAMA finalizando el subprograma VARIABLE X: PRINCIPAL FIN PRINCIPAL cmd /c rutina

<-- la subshell hereda las variables de entorno ...

<-- las variables de la shell principal NO se ven afectadas por lo que hagamos en la subshell

3: Ejecucin en la misma shell: Se utiliza el comando CALL progbat

Ejecuta la subrutina y el programa principal en la misma shell, por tanto las modificaciones hechas en el entorno desde el subprograma, afectan al programa principal. cuando finaliza la subrutina, contina la ejecucin en el progama principal. Si en el programa principal anterior sustituimos la llamada por CALL rutina obtenemos: Z:\pruebas>principal INICIO PRINCIPAL ejecutando el subprograma ... variable x: PRINCIPAL variable x: SUBPROGRAMA finalizando el subprograma VARIABLE X: SUBPROGRAMA entorno FIN PRINCIPAL

<-- se han visto afectadas las variables de del programa principal

PASO DE ARGUMENTOS AL SUBPROGRAMA En cualquiera de los tres casos anteriores estamos ejecutando un programa bat, y por tanto podemos pasarle parmetro posicionales. Por ejemplo, la sintaxis general de la llamada con CALL sera de la forma: CALL [pathTo]subprograma [arg1 arg2 ...] Y aunque se ejecuten en la misma shell, los parmetros del subprograma (%1, %2, ...) son independientes.

MEJORAS en el CALL Llamar a una subrutina dentro del mismo archivo Con CALL tambin podemos llamar a una etiqueta como si se tratara de una funcin o subrutina: CALL :nombre_subprograma [ arg1 arg2 ... ] ... :nombre_subprograma ... goto :eof REM - por aqu puede haber ms cdigo que no pertenece al subprograma (e.g. otros subprogramas) Todo se ejecuta en la misma shell, aunque los argumentos recibidos en los parmetros posicionales %1, %2, no son compartidos entre la parte principal y la subrutina. Las sentencias del subprograma se ejecutan secuencialmente hasta llegar al final del archivo, por lo que puede hacerse necesaria la instruccin goto :eof , que contina la ejecucin al final del archivo (end of file). Podramos poner tambin la la tpica goto:FIN,

siendo la etiqueta :FIN la ltima lnea del programa. O incluso EXIT /B n , si necesitamos devolver un cdigo de retorno (errorlevel). En la subrutina slo ser necesaria si hubiera cdigo debajo de sta. El siguiente ejemplo es una demostracin de cmo podra convertirse a maysculas : Z:\pruebas>type mayuscular.bat @echo off set /P x="Dime algo: " call :toUpperCase %x% echo [ %x% ] exit /b :toUpperCase set x=%* set x=%x:a=A% set x=%x:b=B% set x=%x:c=C% set x=%x:d=D% set x=%x:e=E% set x=%x:f=F% set x=%x:g=G% set x=%x:h=H% set x=%x:i=I% set x=%x:j=J% set x=%x:k=K% set x=%x:l=L% set x=%x:m=M% set x=%x:n=N% set x=%x:=% set x=%x:o=O% set x=%x:p=P% set x=%x:q=Q% set x=%x:r=R% set x=%x:s=S% set x=%x:t=T% set x=%x:u=U% set x=%x:v=V% set x=%x:w=W% set x=%x:x=X% set x=%x:y=Y% set x=%x:z=Z% set x=%x:=% set x=%x:=% set x=%x:=% set x=%x:=% set x=%x:=%

<-- sustituimos todas las 'a' minscula por 'A' mayscula <-- ...

Z:\pruebas>mayuscular Dime algo: Convierte esto a maysculas, listaaaa [ CONVIERTE ESTO A MAYSCULAS, LISTAAAA ]

2.Variables Para ver todas las variables usamos el comando set. Si escribimos set y luego enter veremos todas las variables. Estas son las variables mas usadas: Citar %ALLUSERSPROFILE% C:\Documents and Settings\All Users configuracin para todos los usuarios) (Ruta de la carpeta con la (Ruta de la

%APPDATA% C:\Documents and Settings\{usuario}\Datos de Programa carpeta con datos de programa) %COMPUTERNAME% %COMSPEC% Nombre del equipo (Nombre del equipo)

C:\Windows\System32\cmd.exe

( Ruta al intrprete de comandos) (Unidad en la que se

%HOMEDRIVE% Unidad donde estan los datos del usuario (C:) encuentra los datos de usuario) %HOMEPATH% actual) %USERPROFILE% %PATH% ejecutables)

\Documents and Settings\{usuario} (Ruta a la carpeta del usuario C:\Documents and Settings\{usuario} (incluye unidad)

C:\Windows\System32\;C:\Windows\ (Rutas en la que se buscan

%PATHEXT% .COM; .EXE; .BAT; .CMD; .VBS; .VBE; .JS ; .WSF; .WSH. (Extensiones de archivo ejecutables) %PROGRAMFILES% programa) %PROMPT% C:\Archivos de programa (Ruta de la carpeta archivos de

$P$G (Formato del intrprete de comandos) C: (Unidad en la que se ha instalado Windows) (Contiene la carpeta de Windows)

%SYSTEMDRIVE%

%SYSTEMROOT% y %WINDIR% C:\Windows %TEMP% y %TMP% Temp) %USERNAME% %DATE% %TIME% %CD%

C:\DOCUME~1\{usuario}\LOCALS~1\Temp (Ruta de la carpeta Ej.:Computer (Nombre de usuario actual)

31/12/2009 (Fecha actual) 00:00:00,00 (Hora actual) C:\ (Carpeta actual con su ruta completa) 0 o 1 (Cdigo de salida del comando anterior) 32767 (Nmero aleatorio de 0 a 32767)

%ERRORLEVEL% %RANDOM%

Las variables nos sirven para indicar un valor que puede ser un numero una ruta o lo que queramos, en donde escribimos la variable estamos escribiendo en realidad el valor de la variable. A las variable se las seala con %% ejemplo para indicar la variable homepath escribiremos %homepath%. Por ejemplo podemos listar el contenido del escritorio sin estar en el, usando: dir /a "%homedrive%%homepath%\Escritorio", por las dudas siempre que nos referimos a una ruta usaremos comillas dobles "". Para establecer una variable hacemos Set variable=valor

En variable el nombre de nuestra variable y en valor lo que queremos que valga la variable En el bat para que la variable la defina el usuario hacemos. Citar Set /p variable= No hay valor porque el valor lo define el usuario, el que abra el .bat Para definir variables como el resultado de sumas restas multiplicaciones divisiones. Citar Set /a variable=numero+numero Set /a variable=numero-numero

Tambien si una variable es un valor numero podemos operar con ella por ejemplo Cdigo: DOS Set /a variable=%random%*%random% En este lenguaje Batch no tenemos soporte para comas, asi que si hacemos 3/2 no nos dara 1.5 sino 1 (redondea hacia abajo) Para mas informacin sobre variables set/? 2.1.Recortar una variable Podemos tomar un trozo de una variable por ejemplo: Hay una variante llamada original y su valor es abcdefghijk Si queremos solo tener las letras fghi, tenemos que ver cuantas letras hay detras de la f en este caso serian 5 (abcde) y cuantos caracteres ocupa lo que queremos ver en este caso serian 4 (fghi). Citar %nombrevariante:~numerosdecaracteresanteriores,numerosdecaracteresqueabarca% En el ejemplo anterior seria (nos mostraria solo fghi) Ahora queremos mostrar a partir de la c incluida Ahora queremos mostrar los ultimos 3 caracteres Ahora queremos mostrar todo menos los ultimos tres caracteres %original=~5,4% %original:~2% %original:~-3% %original:~0,-3%

Para hacer el signo ~ lo hacemos con alt+126

@ echo . @ echo Este archivo BAT sobreescribe los apk originales dentro de esta carpeta. @ echo . @ echo Haz copia de los mismos antes de ejecutarlo. @ echo . @ echo Copia los apk deoxdexados en este directorio antes de empezar. @ echo. @ echo Si deseas historial redirecciona la salida a un archivo @ echo . @ echo pulsa "ctrl+c" si deseas terminar la ejecucion @ echo . @ pause rem eliminamos forzando borrado del 1firmado*.* /F /Q del 0alineado*.* /F /Q rem Ahora firmamos con signapk FOR %%f IN (*.apk) DO java -jar signapk.jar testkey.x509.pem testkey.pk8 %%f 1firmado_%%f rem Ahora alineamos con zipaling FOR %%h IN (1firmado*.apk) DO zipalign -v 4 %%h 0alineado_%%h rem paso parametros a la etiqueta label @ FOR /R %%X in (0alineado*.apk) DO call:label %%~nX rem fin de bucle FOR goto:fin :label set uno=%1 set dos=%uno% rem renombro con copy forzando sobreescribir. Elimino la premisa (0alineado_1firmado_) copy %uno%.apk %dos:~19%.apk /Y rem informo fin de etiqueta para retorno a comando FOR goto:eof :fin del 1firmado*.* del 0alineado*.* echo programa terminado rem Ejemplo de recortar cadenas de caracteres en variables. @ set mia=1234567890 rem @ echo El numero central es %mia:~4,-5% rem @ echo Los cuatro ultimos numeros son %mia:~6% rem @ echo Los tres primeros numeros son %mia:~,-7%

pause ------------------------------------------------------------------------------for /F %%M in ('dir *.apk /B /S') DO call:label %%M %%~dM %%~pM %%~nM %%~xM rem fin de bucle FOR goto:fin :label set uno=%1 set unidad=%2 set ruta=%3 set nombre=%4 set nombre_recortado=%nombre:~4% set extension=%5 rem copio archivo modificado el nombre copy %uno% %unidad%%ruta%%nombre_recortado%%extension% /Y rem borro archivo original del %uno% /F /Q rem informo fin de etiqueta para retorno a comando FOR goto:eof :fin @ echo FIN DEL PROGRAMA --------------------------------------------------------------------------------:: CarlitoS.dll :: Bat que borra 4 ultimos caracteres de los nombres de varios archivos aceptando archivos incluyan nombres con espacios. :: Ubicar este bat en la misma carpeta de los archivos a renombrar. @echo off set ext=xls rem ext es la extension de los archivos sin anteponer punto. set sacar=4 rem sacar es la cantidad de letras al final del nombre que quieres sacar. for /f "tokens=*" %%f in ('dir /b /a *.%ext%') do call :lab %%f exit :lab set original= set original=%* set newname= call set newname=%%original:.%ext%=%% call set newname=%%newname:~0,-%sacar%%%.%ext% if "%newname%"==".%ext%" (goto :eof) ren "%original%" "%newname%" goto :eof Hoy les traigo un tutorial sobre el comando set con algunos descubrimientos. Luego publicar algunas cosillas ms. Espero que les guste!

que

Autor: Tempestinfinit Fecha: 13/10/2009 Tema: Comando Set Separador de expresiones mediante el comando set (set /a): Se puede utilizar el separador de expresiones o la (,) como se encuentra explicado en la ayuda del comando Set, para declarar varias variables (siempre que sean numricas), utilizando el comando set y el modificador /a (set /a) una sola vez y en una sola lnea. () - agrupar !~- operadores unarios */% - operadores aritmticos +- operadores aritmticos << >> - desplazamiento lgico & - bit a bit y ^ - bit a bit exclusivo o | - bit a bit = *= /= %= += -= - asignacin &= ^= |= <<= >>= , - separador de expresiones Cualquier cadena de la expresin que no sea numrica, se tratar como variable de entorno cuyo valor se convertir a tipo numrico antes de usarse. Si se especifica una variable que no est definida en el entorno actual, se usar el valor cero. Ejemplos: 1) Declarar a=1, b=1, c=1, d=1 a) set /a a=1,b=1,c=1,d=1 (esto generalmente se usa cuando tenemos varios valores, pero tambin sirve) b) set /a a=b=c=d=1 c) set/aa=b=c=d=1 (tambin funciona de esta manera para los que quieran ahorrarse 2 bytes) 2) Declarar a=1, b=2, c=3, d=4 a) set /a a=1,b=2,c=3,d=4 3) Tambin podemos incluir variables no declaradas anteriormente (siempre y cuando las variables sean declaradas mientras se realiza la operacin con ellas sino se tomarn como 0). a) set /a a=1,b=a+1,c=b+1,d=c+1 4) Declarar a=(b=2 y c=4) y luego a=(b+c). Nota: a, b y c no fueron declaradas antes. a) set /a a=(b=2)+(c=4) 5) Declarar b=2*a , c=2*b , d=2*c (No conocemos a pero suponemos que est declarada, adems queremos que b sea 2 veces a y as. Esto generalmente lo vamos a usar en un fichero BAT).

a) set /a b=2*a,c=2*b,d=2*c 6) Podemos utilizar variables declaradas anteriormente para asignarlas a otras variables. Declaramos a=1, b=2 y c=3. a) set /a abc=(%a%%b%%c%) ,(recuerden que a, b y c tienen que estar declaradas). 7) Declaramos a=1, b=2, c=3 y asignamos a, b y c a abc. Esto es puramente matemtico y no hay otra manera al menos de declarar 3 variables y luego asignar a una cuarta (al menos no en una lnea). Esto conlleva a la complicacin de que, si no sabemos cuantas cifras tiene el nmero en la variable que queremos asignar, no se puede hacer (al menos no sin obtener un error). a) set /a abc=(a=1,b=2,c=3,a*100+b*10+c) b) set /a a=1,b=2,c=3,abc=a*100+b*10+c Subcadenas: Declaramos ABC=abcdefghijklmnopqrstuvwxyz %ABC:~desplazamiento,longitud% %ABC:~6,5% (desplaza 6 caracteres y muestra 5 a partir del 6to) ghijk %ABC:~10% (desplaza 10 y sino se especifica la longitud utiliza el resto de la cadena como longitud) klmnopqrstuvwxyz Si algn nmero (desplazamiento o longitud) es negativo, entonces el nmero usado es la longitud del valor de la variable de entorno agregado al desplazamiento o longitud especificados. %ABC:~-10% (extrae los 10 ltimos) qrstuvwxyz %ABC:~0,-10% (extrae los 10 primeros, o sea, se ubica al principio de la cadena y muestra 10) abcdefghij %ABC:~0,-2% (muestra todos menos los ltimos 2) abcdefghijklmnopqrstuvwx %ABC:~-2% (desplaza 0 muestra los ltimos 2) yz Anteriormente si queramos obtener la fecha o la hora en 3 variables utilizando una sola lnea debamos hacer esto: set dia=%date:~0,2% & set mes=%date:~3,-5% & set ao=%date:~-4% Ahora: 8 ) Obtener la fecha en 3 variables utilizando un solo set /a. a) set /a dia=%date:~0,2%,mes=%date:~3,-5%,ao=%date:~-4% 9) Obtener la hora en 3 variables utilizando un solo set /a (se complica un poco ms).

a) set /a hora=%time:~0,2%,min=%time:~3,-6%,a=%time:~6%,b=%time:~-2%,seg=a*100+b 10) Incluso si queremos combinar la 8 y la 9 para ahorrarnos un set /a podemos. a) set /a dia=%date:~0,2%,mes=%date:~3,-5%,ao=%date:~-4%, hora=%time:~0,2%,min=%time:~3,-6%,a=%time:~6%,b=%time:~-2%,seg=a*100+b Sustitucin de variables: Con el comando set y el modificador /a (set /a) podemos realizar sustituciones simples y compuestas(con algunas excepciones) de subcadenas y recuerden que siempre con el modificador /a hablamos de nmeros. Algunos ejemplos: a) Declaramos a=123456789 set /a a=%a:123=999% (Sustitumos la subcadena numrica 123 por 999) 999456789 b) set /a a=(%a:123=456%),(%a:456=789%),(%a:789=8910%) (Sustitumos 123 por 456, 456 por 789 y 789 por 8910) 4564568910 Sumando variables con espacios o guiones: Si queremos sumar variables con espacios o con guiones no se podra. Ejemplo: set /a trata de aprender+=1 (esto da error) set /a trata-de-aprender+=1 (esto da error) Entonces se me ocurri utilizar los caracteres (representa al guin) y ( representa al espacio en blanco) para sustituirlas por el espacio en blanco tradicional y el guin, de manera de poder sumar una variable que contengan espacios en blanco y guiones. Ejemplos: Declarando variables... 1) set "tempest=" 2) set "varnula=^" Resultado: 1) a a (se encuentra en medio de las dos a) 2) aa (variable nula, no existe? :XD se supone que esta en el medio de las dos a) Ahora viene lo interesante! Declaramos las siguientes variables: 1) set /a "+=1" 2) set /a "+=1" 3) set /a "HolaatodossoyTempestBP+=1" Resultado: 1) 1

2) 1 3) 1 Conclusin: Obviamente el espacio en blanco no existe, ya que no tiene sentido pensar en nada, en fin, los dos caracteres que utilic al mostrarse con el comando echo representan el espacio y el guin, de manera que pueden utilizarse para trabajar en memoria. Sin embargo al redireccionarlos a un archivo de texto, los muestra como y , realmente como lo que son. Incluyendo comandos entre las sustituciones.... Ejemplos: Declaramos a=123456789 a) set /a a=(%a:123=456%)&echo 1-OK,(%a:456=789%)2-OK,(%a:789=7890%)3-OK 1-OK,(123789789)2-OK,(123456789)3-ok b) set /a a=(%a:123=456%)&pause,(%a:456=789%)&pause,(%a:789=7890%)&pause (Incluimos una pausa entre cada sustitucin) c)set /a a=(%a:123=456%)&set b=,(%a:456=789%),(%a:789=7890%) (Tambin podemos incluir el comando set) Llamadas a etiquetas: Esta tcnica nos permite hacer una llamada a una etiqueta y luego al finalizar continuar declarando el resto de las variables. Ejemplo: @echo off set a=123456789 set /a a=(%a:123=456%)&call:C1,(%a:456=789%)&call:C2,(%a:789=0%)&call:C3 :C1 echo Trata de goto :eof :C2 echo aprender todo goto :eof :C3 echo lo que puedas Trata de aprender todo lo que puedas Errores: Se produce un error con algunos nmeros que creo empiezan con 0, la ayuda del DOS nos dice: Los valores numricos son nmeros decimales, a no ser que lleven el prefijo 0x delante para los nmeros hexadecimales, y 0 para los nmeros octales. De esta manera 0x12 es lo mismo que 18, y lo mismo que 022.

Nota: la notacin octal puede ser confusa: 08 y 09 no son nmeros vlidos porque 8 y 9 no son dgitos octales vlidos. Sustituir dentro de una cadena, un literal por otro: %var:str1=str2% Este comando buscar todas las ocurrencias de la subcadena str1 dentro de var cambindolas por str2. Por ejemplo: set var=hola cmo ests Ejecutad para verlo: echo %var:cmo=que tal% Igualmente podramos asignrselo de nuevo a var o bien a otra nueva variable de entorno. Por ejemplo: set var=%var:cmo=que tal% con lo cual el contenido habra quedado modificado. NOTA1: puede omitirse str2. En ese caso la cadena str1 dentro de la variable var quedar eliminado. Por ejemplo: set var=12345xx6 set var=%var:xx=% echo %var% NOTA2: se cambiarn todas las ocurrencias de str1. Si str1 figura varias veces se cambiar todas las veces en la cadena de caracteres. LENGUAJE DE COMANDOS SCRIPTS .CMD .BAT Qu es un script en lenguaje de comandos? No es nada ms que un fichero de texto, que puede generarse con el simple cuaderno de notas, y cuya extensin es .bat o .cmd. Su contenido son los comandos que ejecutaramos en una consola de comandos (cmd) y cuyo fin es evitar las tareas repetitivas que podramos realizar en una consola de comandos. Aunque esta es la definicin clsica, no debemos perder de vista que desde una consola de comandos podemos realizar, mediante comandos, prcticamente todo lo que la imaginacin nos permita. Todo lo que se configura, o las tareas de mantenimiento que realizamos en Windows se pueden hacer desde una consola de comandos. Igualmente existen muchos comandos que son slo de consola. Revisemos un poco la tipologa de los comandos: un comando es algo que o bien entiende directamente el shell (el intrprete de comandos, en este caso el cmd.exe) o bien es un programa con extensin .com o .exe -o incluso un visual basic- que no use la interfaz grfica y que por tanto est orientado a la consola. Un ejemplo clsico es el programa ipconfig. Este programa (de consola) nos da la configuracin TCP/IP de la mquina. O bien el programa ping. ENTORNO DE UN PROGRAMA Todos los sistemas operativos, y Windows no es una excepcin, tienen un rea de datos llamada entorno. No es nada ms que un rea donde se guardan ciertas variables con su contenido. Es importante entender que cada programa de Windows tiene su entorno (igual o diferente a otro programa). Los entornos se heredan. Cada programa (y el propio intrprete de comandos, cmd.exe, es un programa ms) cuando se lanza, hereda dicho entorno. Por heredar, no quiere decir que use el mismo que el programa padre, sino que al lanzarse, el loader -cargador- del sistema operativo realiza una copia del entorno padre en una nueva rea de datos y al lanzar el programa le da como

direccin del rea de entorno esa nueva copia del entorno del padre. En otras palabras, cualquier modificacin en las variables de entorno dentro de un programa no afecta al sistema ni al resto de programas, ya que lo que hara es modificar su propio entorno: la copia del entorno original del programa padre. El sistema operativo al cargarse predefine ya una serie de variables de entorno. Podemos verlas, bien con botn derecho en Mi PC / propiedades / pestaa de opciones avanzadas / botn de variables de entorno, o bien de una manera ms simple, lanzando el intrprete de comandos (cmd.exe) y tecleando el comando set (sin comillas). NOTA: Realmente, aunque lo veamos en conjunto, existen dos entornos: uno del sistema y uno de usuario, pero la visin de ambos es el conjunto de los dos. Acabamos de ver nuestro primer comando: set. Este comando nos permite no slo ver todas las variables, sino tambin definir, cambiar, borrar su contenido y algunas opciones ms. Si lo ejecutamos por consola, nos dar algo similar a: ALLUSERSPROFILE=C:\Documents and Settings\All Users APPDATA=C:\Documents and Settings\mi usuario\Datos de programa CommonProgramFiles=C:\Archivos de programa\Archivos comunes COMPUTERNAME=MIMQUINA ComSpec=C:\WINDOWS\system32\cmd.exe FP_NO_HOST_CHECK=NO HOMEDRIVE=C: HOMEPATH=\Documents and Settings\mi usuario NUMBER_OF_PROCESSORS=1 OS=Windows_NT Path=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;..etc PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH PROCESSOR_ARCHITECTURE=x86 PROCESSOR_IDENTIFIER=x86 Family 6 Model 7 Stepping 3, GenuineIntel PROCESSOR_LEVEL=6 PROCESSOR_REVISION=0703 ProgramFiles=C:\Archivos de programa etc Fijmonos que la estructura es: nombre de variable=contenido de la variable Las variables, dentro de una consola de comandos o bien dentro de un script se referencian para poder ver su contenido encerradas entre smbolos de %. Por ejemplo, en el caso anterior, para ver el contenido de la variable COMPUTERNAME, simplemente podemos ejecutar: echo %COMPUTERNAME% Esto nos dar como resultado: MIMQUINA Igualmente podramos cambiarlo con el comando set citado anteriormente: set COMPUTERNAME=nuevoNOMBRE Pero * Esto realmente tiene el efecto de cambiar el nombre del ordenador? por supuesto que no. Esto slo cambia el contenido de dicha variable. Dnde lo cambia? pues tal y como hemos comentado anteriormente, lo cambia en el entorno del programa, es decir, en la copia del entorno original heredado por el programa. En nuestro caso, al ejecutarlo desde un cmd.exe, implica que cambia el entorno del cmd.exe (y slo de l, es decir, si tuvisemos lanzadas dos consolas de comandos, cada

una de ellas con cmd.exe, slo se cambiara en el cmd.exe que hayamos ejecutado ese comando set). Y para que puede servir? simple, si recordamos que un programa hereda una copia del entorno del programa que lo lance, esto implicar que todo lo que lancemos desde esa consola de comandos, tendr el contenido de esa variable modificado. * Cmo podemos crear una nueva variable de entorno? tan simple como darle un nombre y asignarle su contenido. Por ejemplo: set nuevo=prueba Esto crear si no existe, o modificar el contenido si existiese, de una variable de entorno llamada nuevo, y le asignar el contenido de prueba. * Podemos asignar a una variable el contenido de otra?: s, por supuesto. Simplemente recordando que el contenido de una variable es precisamente el nombre de la variable encerrada entre smbolos %. set otra=%nuevo% Esto crear la variable otra con el contenido de la variable nuevo, el cual era el texto prueba. Si despus de ejecutar el comando anterior realizamos: echo %otra% su resultado ser: prueba * Cmo podemos borrar -eliminar- una variable? simplemente no asignando nada. set otra= En este caso borrar la variable. Si ahora damos el comando set que nos muestra todas las variables, la variable otra ya no aparecer. * Puedo concatenar textos con variables en una asignacin?: S, por supuesto. Por ejemplo: set otra_de_nuevo=Esto es una %nuevo% de concatenacin El resultado de lo anterior ser que la variable otra_de_nuevo contendr el valor Esto es una prueba de concatenacin. * Podemos tener contenidos numricos y no slo alfabticos, y por tanto realizar operaciones matemticas con el comando set? s, se puede. La manera es con el modificador /a. Pongamos un ejemplo: set n=234 (asignar 234 a la variable n) set /a i=%n%/4 Veremos que esto nos devuelve por pantalla el valor 58 (es decir la divisin de 234/4) y adems se lo asigna a la variable i. Es necesario el modificador /a, ya que si no lo hubisemos puesto, la expresin: set i=%n%/4 no hubiese realizado la operacin matemtica y se hubiese quedado con el contenido (como literal) de: 234/4 es decir, una cadena de caracteres con ese contenido y no con el resultado matemtico de la divisin. Fijmonos, por curiosidad en este ltimo caso y se puede ir realizando una prueba en una consola de comandos. Realicemos: set n=234

set i=%n%/4 echo %i% veremos entonces: 234/4 Si ahora realizamos: set /a j=%i% Que contendr? Contendr el literal de texto 234/4? O slo 234 ya que el carcter / no es numrico? O contendr 58? Realizadlo como prueba La asignacin a una variable numrica, puede ser decimal, hexadecimal u octal. Podemos hacer: set /a i=14 set /a i=0x0E en ambos casos contendr el decimal 14 (recordemos que el hexadecimal 0E equivale al decimal 14). O bien, si queremos introducir un numero en octal, simplemente lo empezamos por cero. set /a i=021 hay que tener cuidado con esto, ya que el octal 021 es el decimal 17. Podis comprobarlo en pantalla simplemente tecleando la lnea anterior y viendo el resultado. Siempre los resultados nos los expresar en decimal. Esto puede ser til para convertir directamente de hexadecimal o bien de octal a decimal de una manera rpida. * Ya que hemos empezado con el comando set vamos a finalizar todo lo que dicho comando puede hacer. Adems de lo anterior: set p nos mostrar en pantalla todas las variables de entorno que empiecen por p. Y para finalizar el modificador /p. Es decir, una sintaxis del estilo: set /p variable=[literal] lo que hace es muestra el literal en pantalla y el cursor se queda a continuacin esperando que metamos un dato. Cuando lo metemos y tecleamos intro, lo que hayamos tecleado se asignar a la variable de entorno definida en el set. Por ejemplo: set /p dato=Introduce datos: Nos mostrar por pantalla: Introduce datos:_ y cuando introduzcamos los datos los asignar a la variable dato. Esto es vlido realizarlo en un script. En ese momento se detendr la ejecucin del script y nos pedir datos por pantalla. Al pulsar la tecla intro, se los asignar a dicha variable y continuar la ejecucin del script. CARACTERES ESPECIALES Hay ciertos caracteres especiales que hay que usar con extremada precaucin: por ejemplo, evitar usar, a no ser que lo necesitemos explcitamente, caracteres reservados como &, >, <, |, %, =, ^. Pongamos un ejemplo. El carcter & (and en ingls, es decir y en castellano) se interpreta como un y, por tanto, ejecuta lo que hay antes del & y adems a continuacin, ejecuta lo que hay despus del &. Es decir, si ejecutsemos: set var=a&a

nos dar un error que veremos por pantalla: a no se reconoce como un comando interno o externo, programa o archivo por lotes ejecutable * Qu ha hecho el sistema? Ha ejecutado el comando que hay antes del &, es decir: set var=a Por tanto le ha asignado a la variable de entorno var el contenido a. A continuacin, el intrprete de comandos intenta ejecutar lo que hay despus del &, es decir intenta interpretar el comando a. Como a no es un comando reconocido, ni un .exe, ni un .com, ni el nombre de otro script nos dar el error mostrado anteriormente. Curiosamente: set var=a&cmd qu hace? Ejecutadlo y ved el resultado. Pero y si realmente queremos asignar el contenido del literal a&a a la variable var, cmo lo hacemos? Simplemente anteponiendo el carcter ^ a cualquiera de los caracteres especiales. En nuestro caso deberamos haber hecho: set var=a^&a Si posteriormente ejecutamos un: echo %var% nos seguir mostrando un error, ya que aunque realmente tiene el contenido a&a, nos mostrar a e intentar ejecutar lo que va a continuacin: intentar la ejecucin de un comando llamado a. Para ver que realmente tiene el contenido solicitado, podemos hacer dos cosas: set v el nos mostrar el contenido de todas las variables que empiezan por v y podremos comprobar que la variable var contiene lo que realmente desebamos. O bien, redirigir la salida a un archivo (los smbolos de redireccin y su significado los veremos ms adelante). NOTA: Un error bastante corriente cuando se usan caracteres de asignacin y concatenacin (&) en la misma lnea puede ser: set var=prueba & set var1=otra_prueba Cul es, o puede ser, el error cometido? puesrecordemos que todo lo anterior al & se ejecuta como un comando. Es decir: qu hemos asignado a la variable var? podemos suponer que prueba. Pero no es as, hemos asignado todo lo anterior al &, es decir prueba , con un espacio en blanco al final. Esto nos puede causar problemas posteriores si lo que queramos hacer era asignar slo prueba. Podemos verificarlo tecleando entre algn delimitador, por ejemplo un *: echo *%var%* Lo cual nos mostrar un *, el contenido de var y otro *. Obtendramos: *prueba * con el fatdico (en este caso) carcter en blanco al final. OPERACIONES CON VARIABLES DE ENTORNO Hemos visto hasta el momento que las variables de entorno no son nada ms que cadenas de caracteres, las cuales mediante algn modificador especial en el comando set (/a) pueden tratarse como numricas para realizar algunas pequeas operaciones matemticas. Vamos a ver primero las funciones que podemos aplicar a las variables de caracteres y en segundo lugar las operaciones matemticas que podemos hacer as como su precisin cuando el contenido es numrico. Igualmente veremos las llamadas variables dinmicas de entorno: variables que aunque no veamos mediante el comando set pueden usarse en instrucciones de comandos. Tengamos siempre presente que los caracteres especiales deben llevar el smbolo ^ precedindolos. Por ejemplo, un error que viene en la propia ayuda de Windows del comando set, es que la propia ayuda nos dice: El comando SET no permitir que un signo de igual sea parte de una variable. Esto no es del todo verdad. Si hacemos: set var=a^=b la variable var quedar con el contenido a=b. Se puede comprobar si a continuacin de lo anterior ejecutamos: set v 1) FUNCIONES SOBRE VARIABLES DE CARACTERES * Extraer una subcadena: %var:~n,m% Esto nos extrae de la variable var, la subcadena desde la posicin n con longitud m. n es el desplazamiento empezando a contar desde 0, por tanto, la primera posicin es la 0, la segunda

la 1, etc. Pongamos un ejemplo: set var=123456789 echo %var:~1,4% nos mostrar la subcadena de var que va desde la posicin 2 (recordemos: con desplazamiento +1 ya que empieza por 0) y con longitud 4. Es decir, veremos: 2345. Tanto n como m, son opcionales. Es decir, por ejemplo: %var:~1% nos mostrar desde la posicin 2 (offset de 1), hasta el *final* de la variable (ya que no se ha especificado longitud). Por tanto, mostrar en el ejemplo anterior: 23456789. Igualmente: %var:~,5% al no especificarse posicin se asume desde el principio de la cadena y por tanto nos mostrar 5 caracteres iniciales. En nuestro caso 12345. NOTA: si n es un nmero negativo, se refiere a la longitud de toda la cadena menos ese nmero. Por ejemplo: set var=123456789 echo %var:~-2% nos mostrar los dos ltimos caracteres de la cadena, es decir 89. Igualmente, si m es negativo, se refiere a *toda* la cadena menos m caracteres. set var=123456789 echo %var:~,-2% nos mostrar todo menos los dos ltimos caracteres de la cadena, es decir 1234567. * Sustituir dentro de una cadena, un literal por otro: %var:str1=str2% Este comando buscar todas las ocurrencias de la subcadena str1 dentro de var cambindolas por str2. Por ejemplo: set var=hola cmo ests Ejecutad para verlo: echo %var:cmo=que tal% Igualmente podramos asignrselo de nuevo a var o bien a otra nueva variable de entorno. Por ejemplo: set var=%var:cmo=que tal% con lo cual el contenido habra quedado modificado. NOTA1: puede omitirse str2. En ese caso la cadena str1 dentro de la variable var quedar eliminado. Por ejemplo: set var=12345xx6 set var=%var:xx=% echo %var% NOTA2: se cambiarn todas las ocurrencias de str1. Si str1 figura varias veces se cambiar todas las veces en la cadena de caracteres. 2) FUNCIONES MATEMTICAS SOBRE VARIABLES DE ENTORNO Con el modificador /a en el comando set podemos realizar operaciones matemticas *simples* sobre variables. Debemos primero hablar de la precisin: slo se opera con nmeros enteros. Por tanto la divisin de 5/2 nos dar como contenido un 2. Igualmente la mxima precisin es 2^32. En general la sintaxis es: set /a var=expresin matemtica. Por expresin matemtica puede entenderse cualquiera de las siguientes y en orden de precedencia de mayor a menor (extrado de la propia ayuda del comando set): () agrupar ! ~ - operadores unarios * / % operadores aritmticos

+ - operadores aritmticos << >> desplazamiento lgico (bit a bit) & bit a bit y ^ bit a bit exclusivo o | bit a bit = *= /= %= += -= asignacin &= ^= |= <<= >>= , separador de expresin Si usamos una variable de entorno dentro de una expresin matemtica y dicha variable no existe, ser asumido que contiene un cero. Veamos los matices de lo anterior, ya que si no tenemos en cuenta algunas matizaciones ya comentadas en este documento habr expresiones que nos darn error. IMPORTANTE: Volvamos a recordar que hay smbolos especiales que no pueden escribirse directamente, por ejemplo: &, <, >, |, o incluso ^. Cada uno de ellos debe ir precedido por un ^. Es decir, el bit a bit exclusivo ^, debe escribirse como ^^ ya que si no el intrprete de comandos lo interpretar errneamente. Veamos ejemplos de asignaciones. set /a x=x+1 podemos sustituirlo (abreviarlo) por una notacin similar al C o C++, es decir: set /a x+=1 (a la variable x sumarle 1 y asignrselo a x) Lo mismo: set /a x=x-1 es equivalente a: set /a x-=1 set /a x=x*23 es equivalente a: set /a x*=23 etc para el resto de operaciones matemticas de asignacin citadas anteriormente. Veamos el siguiente problema: qu solucin tiene? set /a x=8, y=2, z=16 set /a z-=(x-y)/2+5^<^<2 Quiz no sea tan trivial el ver que el resultado de lo anterior es -16. Intentad razonarlo. TIP: Aunque no lo he encontrado documentado, pueden hacerse operaciones del tipo: set /a x=(y=3+4)*(z=2+1) x vale 21, y vale 7, z vale 3 3) VARIABLES DINMICAS DE ENTORNO Son variables que aunque no veamos mediante el comando set tienen contenido que va variando o puede variar dinmicamente. Un ejemplo de esto es la variable %TIME%. Cada vez que ejecutemos: echo %TIME% nos dar dinmicamente la hora del sistema. Estas variables son (auto-explicativas desde la ayuda del comando set): %CD% se expande a la cadena del directorio actual. %DATE% se expande a la fecha actual usando el mismo formato que el comando DATE. %TIME% se expande a la hora actual usando el mismo formato que el comando TIME. %RANDOM% se expande a un nmero decimal aleatorio entre 0 y 32767. %ERRORLEVEL% se expande al valor de NIVEL DE ERROR actual %CMDEXTVERSION% se expande al nmero actual de versin de las extensiones del comando del procesador (lo veremos posteriormente) %CMDCMDLINE% se expande a la lnea de comando original que invoc el Procesador de comandos. PRECAUCIONES EN LA EXPANSIN DE VARIABLES DE ENTORNO Aunque lo veremos en detalle posteriormente, vamos a introducir el por qu algunas veces

aparecen las variables de entorno en un script encerradas entre smbolos ! en vez de los clsicos % y cundo debemos usar el smbolo !. ATENCIN: El intrprete de comandos lee una lnea de ejecucin completa y lo primero que hace es sustituir las variables de entorno antes de procesarla. Esta mxima debemos tenerla presente siempre. Veamos un ejemplo que, aunque aparentemente est bien escrito, nos producir siempre resultados anmalos o no esperados: set var=antes if %var%==antes (set var=despues&if %var%==despues echo Cambiado a despues) Hemos introducido el comando if. Realmente un if no es nada ms que un si condicional en castellano. Es decir: si se cumple una expresin, entonces se ejecuta lo que va a continuacin. Si adems ponemos la palabra reservada else, esto se ejecutar en caso contrario. Recordemos igualmente que los parntesis tienen precedencia. Veamos entonces el conjunto de las instrucciones anteriores: asignamos antes a la variable var. En la segunda lnea preguntamos: Si la variable var contiene antes -que s que es verdad-, ejecutaremos: asignar a la variable var la palabra despues y adems a continuacin comprobar que si tiene el contenido de despues -lo cual parece que es evidente puesto que acabamos de hacerlo- sacaremos por pantalla el texto Cambiado a despues. Nos parece por tanto obvio que lo que vamos a ver despus de ejecutar los comandos anteriores es Cambiado a despues. Pues bien, si lo hacemossorprendentemente veremos que no sale nada. No lo cambia? Realmente lo cambia, porque si a continuacin de lo anterior ejecutamos: echo %var% veremos que contiene despues. Entonces por qu no ha ejecutado correctamente lo que tenemos despus del & en la lnea anterior? Volvamos a leer ahora despacio el prrafo que he comenzado anteriormente por ATENCIN. Repasemos lo que hace por defecto el intrprete de comandos: lee la lnea *entera* y en ese momento el contenido de las variables de entorno queda sustituido por el contenido real. A continuacin, ejecuta la lnea entera. Es decir lo primero que hace el intrprete de comandos es la expansin de la lnea, y por tanto, antes de ejecutarla, quedara: if antes==antes (set var=despues&if antes==despues echo Cambiado a despues) es evidenteque el segundo IF no lo ejecutar nunca. Este es el funcionamiento por defecto del intrprete de comandos. Si queremos que no funcione as, y que haga dinmicamente la expansin de las variables (y no antes de ejecutar la lnea de comando) hay que ejecutar dos cosas: 1) Arrancar el intrprete de comandos con el parmetro /V:ON para indicarle que debe expandir las variables. (Si estamos en un script, colocar como primera lnea del script: setlocal ENABLEDELAYEDEXPANSION. Lo veremos ms en detalle posteriormente) 2) Referenciar las variables que deben ser expandidas en ese momento, y no en el momento de leer la lnea por primera vez mediante los smbolos de ! en vez de %. En nuestro caso, y para verlo ms claro: 1) En inicio-ejecutar arrancamos el intrprete de comandos como: cmd /V:ON 2) Ejecutamos: set var=antes if %var%==antes (set var=despues&if !var!==despues echo Cambiado a despues) Ntese el cambio de % por ! en el segundo IF. En este caso podemos comprobar que la ejecucin es lo que desebamos. Volveremos con estos temas ms adelante. ENTENDIENDO LA ENTRADA/SALIDA BSICA DE COMANDOS Cuando ejecutamos un comando en una consola puede ser de dos tipos: o bien un comando

interno de la shell de comandos (cmd.exe) o bien un programa externo (.com, .exe, .bat, etc.). Lo primero que verifica el intrprete de comandos es si es un comando interno (por ejemplo copy). Si lo es, lo ejecuta directamente. Si no pertenece a su tabla interna de comandos, empieza su bsqueda: * Dnde y cmo lo busca? 1) Si se ha tecleado extensin del comando, por ejemplo: ping.exe se buscar slo con dicha extensin. Si no se ha tecleado extensin, es decir, simplemente es ping, lo primero que hace el sistema es localizar la variable de entorno %PATHEXT% para ver las posibles extensiones y su orden de bsqueda. En un entorno NT (y XP lo es), si ejecutamos: echo %PATHEXT% veremos su contenido: PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH Es decir, primero intentar localizar un ping.com, si lo encuentra lo ejecuta, si no lo encuentra buscar un ping.exe, si lo encuentra lo ejecuta, etc 2) Hemos hablado de que intentar localizar los anteriores. Pero dnde? 2.1) En primer lugar en el directorio en curso. 2.2) Si no lo localiza, buscar en la variable de entorno %PATH% e ir recorriendo carpeta por carpeta y dentro de cada una de ellas, si no se ha tecleado extensin, en el orden predeterminado de extensiones de la variable %PATHEXT% 2.3) Si al final de esta bsqueda lo encuentra, lo ejecutar. En otro caso nos enviar un mensaje de error como por ejemplo: C:\>micomando micomando no se reconoce como un comando interno o externo, programa o archivo por lotes ejecutable. *** Debemos fijarnos en que bsicamente un comando es algo que puede solicitar datos de entrada, posteriormente hace algo y por ltimo nos da datos de salida. Por ejemplo: copy c:\carpeta\archivo.dat d:\backup El comando (interno) copy, recibe datos, en este caso de la propia lnea de comandos (y en la consola). Esos datos son dos: c:\carpeta\archivo.dat y d:\backup. A continuacin ejecuta la copia. Y por ltimo nos informa de cmo ha ido esa copia. Nos puede dar dos tipos de mensajes: a) O bien nos informa de copia correcta: 1 archivos copiados. b) o puede informarnos de una situacin de error, por ejemplo: El sistema no puede hallar el archivo especificado., o bien: Acceso denegado. 0 archivos copiados. En general los programas o comandos tienen una entrada de datos estndar (STDIN), y una salida de datos cuando ocurre un funcionamiento correcto (STDOUT) y cuando ocurre algn tipo de error (STDERR). Fijmonos que las tres, en los casos de comando de consola, en general, estn redirigidas a la propia consola. Tanto la entrada de datos como los mensajes, sean o no de error, entran y salen por pantalla. Pero el comando o programa, internamente los redirige a salidas o entradas que pueden fsicamente estar redirigidas, o ser redirigidas desde dispositivos que no sean la consola. Tcnicamente, esto se hace a nivel del handle (manejador) del fichero. Algunas veces en la literatura hispana esto se ha mal traducido por controlador. Bsicamente un handle es un simple nmero que referencia internamente en un programa a un fichero. Fijmonos que realmente la entrada de datos es como si estamos leyendo de un fichero y la salida es como si se escribe en un fichero, aunque en el ejemplo que acabamos de ver, estos ficheros son redirigidos a la propia consola.

Existen tres nmeros, o handles, que histricamente en informtica han representado siempre lo mismo: el 0 (STDIN), el 1 (STDOUT) y el 2 (STDERR). El resto son libres, a voluntad del programador. Por tanto, y de cara interna a un programa, los datos que recibe de entrada se leen por STDIN, los mensajes de salida se escriben en STDOUT, y los mensajes de error en STDERR y adems se activa un cdigo de error (aunque algunas veces es costoso de distinguir, ya que slo est en la cabeza del programador que lo haya realizado, qu es lo que l considera mensaje informativo y lo que considera mensaje de error pero esto es otra cuestin). Debido a la estandarizacin del STDIN, STDOUT y STDERR (handles 0, 1 y 2) lo que normalmente hace un sistema operativo es redirigir estos a la consola. Este es el comportamiento estndar del sistema, pero nosotros podemos igualmente hacer que sean redirigidos a donde queramos, tal y como veremos posteriormente. Por ejemplo, en el caso del ejemplo anterior del comando copy, podemos hacer: copy c:\carpeta\archivo.dat d:\backup > c:\log.txt El smbolo > est indicando que todo lo que vaya a salir por el STDOUT se escribir, en vez de en la consola, en un archivo de texto c:\log.txt. Repito, porque es importante el matiz: STDOUT a fichero de texto. Es decir, si el comando copy no puede copiar, recordemos que el mensaje de error lo saca en STDERR, por tanto en el fichero de texto no se escribira nada, ya que en el ejemplo anterior, con el smbolo >, slo se ha redirigido el STDOUT. El STDERR queda con los valores predeterminados por el sistema operativo: es decir, se escribe el mensaje de error en consola. *** Hemos comentado que a voluntad del programador de un comando o programa, este puede terminar correctamente o bien establecer un cdigo de error al finalizar (escriba o no adems un mensaje explicativo). El sistema operativo es el encargado de capturar esos cdigos de error y los deja a nuestra disposicin en una variable de entorno llamada %ERRORLEVEL% Podemos, por ejemplo, verificar cual es el comportamiento del comando copy. Para ello vamos a realizar el siguiente ejemplo crendonos una carpeta de trabajo llamada c:\tmp c: cd \ md tmp echo texto de un fichero > c:\tmp\fichero.txt Con esto nos hemos posicionado en c: (por si no lo estuvisemos), hemos ido a su carpeta raz (cd \), y hemos creado una carpeta llamada tmp en donde estuvisemos posicionados en ese momento (md tmp) -md es abreviatura de makedir: crear directorio-. La ltima lnea (echo) nos mostrara por pantalla texto de un fichero, es decir nos lo mostrara en el STDOUT. Pero con el smbolo > lo que hacemos es redirigir el STDOUT (la consola en este caso) a un fichero que en nuestro caso es: c:\tmp\fichero.txt. Si lo abrimos con el cuaderno de notas, veremos realmente el texto anterior. Vamos a copiarlo en otro. Ejecutamos por ejemplo: copy c:\tmp\fichero.txt c:\tmp\copia.txt Si a continuacin de este comando ejecutamos: echo %ERRORLEVEL% veremos que el comando anterior nos informa que ha terminado con 0 (se considera normalmente 0 una finalizacin correcta). Vamos a provocar que el copy termine con error para ver cual es su comportamiento en este caso. Un mtodo muy sencillo seria proteger contra escritura el fichero de salida y luego intentar escribir en l. Es decir: attrib c:\tmp\copia.txt +r (+r es read only -slo lectura-) copy c:\tmp\fichero.txt c:\tmp\copia.txt Vemos que ahora en pantalla nos informa que Acceso denegado. Si a continuacin ejecutamos: echo %ERRORLEVEL% veremos que el cdigo de retorno es 1. NOTA: en general los mensajes de error deben buscarse en la documentacin del programa o

comando ya que son a voluntad del programador. El sistema operativo lo nico que hace es situarnos el cdigo de retorno en %ERRORLEVEL% y nosotros podremos tomar acciones en un script de comandos analizando dicha variable de entorno cuando nos interese controlar los cdigos de terminacin. Bien, lo anterior no ha sido ms que un ejemplo para intentar introducir los redirectores del sistema operativo. OPERADORES DE REDIRECCIN > Escribe la salida del comando (normalmente STDOUT) en un fichero o un dispositivo (puede por tanto redirigirse a otro dispositivo, no slo a archivo), en lugar de en la ventana del Smbolo del sistema. < Lee la entrada (STDIN) del comando desde un archivo, en lugar de leerla desde la consola. >> Aade la salida del comando al final de un archivo sin eliminar la informacin que ya est en l. >& Escribe la salida de un controlador en la entrada de otro controlador (lo vemos posteriormente en detalle) <& Lee la entrada desde un controlador y la escribe en la salida de otro controlador. | Lee la salida de un comando y la escribe en la entrada de otro comando. Mal traducido por canalizacin o filtro (pipe) Hemos visto que con >& se escribe la salida de un controlador (handle) en otro. Vayamos a un ejemplo prctico. En los ejemplos anteriores hemos visto que la salida de un comando como el copy podemos escribirlo en un fichero con el smbolo >. Pero tambin hemos comentado que slo redirige en STDOUT, por tanto, si el copy enviase un mensaje de error (STDERR) esto no se vera en el fichero. Esto es un problema si lo que queremos es crear un log de ejecucin de un script para poder ver posteriormente la ejecucin: los mensajes de error precisamente los habramos perdido. Pero recordemos que > escribe el STDOUT. Si fusemos capaces de redirigir el STDERR al STDOUT, entonces el > nos escribira todos los mensajes, de funcionamiento correcto o errneo en el fichero. Es decir, si hacemos: copy c:\tmp\fichero.txt c:\tmp\copia.txt >c:\log.txt slo los mensajes de funcionamiento correcto quedaran en c:\log.txt. Pero en cambio si redirigimos la salida de errores: STDERR (handle numero 2) al STDOUT (handle numero 1) y luego escribimos, en ese caso todo quedara reflejado en el archivo log. Por tanto: copy c:\tmp\fichero.txt c:\tmp\copia.txt 2>&1 >c:\log.txt *** Operador de canalizacin (|) o pipe. Este es de los ms interesantes ya que permite pasar toda una salida de datos a un programa que espera toda una entrada de datos en flujo. No todos los programas estn preparados para admitir este tipo de redireccin y debe leerse la documentacin de cada uno de ellos al respecto. Tenemos tres programas del sistema operativo more (ms), find (buscar) y sort (ordenar) que admiten pipes y que nos pueden servir de ejemplo. Veamos. Un dir /s nos muestra todos los archivos desde donde estemos posicionados incluyendo todos los archivos en subcarpetas. Si ejecutamos: dir c:\ /s veremos que empiezan a pasar pantallas de datos que no somos capaces de leer. Podemos redirigir la salida de este comando al more. Realmente el more no es nada ms que un programa que admite como entrada toda la salida de otro comando y que lleva un contador de lneas para irnos mostrando en pantalla 24 lneas y luego esperar a que pulsemos una tecla. Ejecutemos por ejemplo: dir c:\ /s | more (cualquiera de los comandos anteriores puede abortarse con CTRL-C). Un ejemplo de canalizacin y redireccin: imaginemos que queremos en nuestro disco todos los

archivos con extensin .log y dejar la informacin en un fichero de salida. dir c:\ /b /s | find /I .log > c:\ficheros_log.txt Los parmetros que he puesto, tanto en el comando dir, como en el comando find, siempre podemos verlos ejecutando dir /? y find /? para buscar los que mejor se adapten a lo que queremos. Otro ejemplo: ver en orden inverso los ficheros de un directorio: dir /b | sort /REVERSE Los filtros (pipes) no slo admiten canalizacin. Tambin pueden usarse, como cualquier programa, con comandos de redireccin para leer entradas y escribir salidas en archivos. Por ejemplo, imaginemos que tenemos un fichero con nombres y queremos ordenarlo alfabticamente. Simplemente: sort < lista.txt > listaalf.txt Esto indicara que la entrada al comando sort viene redirigida desde el fichero lista.txt y que la salida, en vez de dejarla en pantalla, nos la escriba en listaalf.txt. *** Los smbolos de redireccin y canalizacin son potentsimos y a veces, incluso a un programador avezado le pueden causar ms de un problema o costarle su correcta interpretacin. En ejemplos que iremos viendo a lo largo de estos captulos quedar ms claro el concepto. OPERADORES CONDICIONALES Son los operadores && y el operador || Lo que exista despus del operador && se ejecutar slo si la instruccin previa a l -en la misma lnea- ha terminado correctamente (cdigo 0). Por contra, si usamos || slo se ejecutar si la terminacin de la instruccin previa termina incorrectamente (cdigo distinto de cero) Por ejemplo: md kkk && echo finalizado correcta la creacin Slo veremos el mensaje de aviso si la creacin de la carpeta kkk ha sido posible. CONFIGURACIN CMODA DEL INTRPRETE DE COMANDOS Aunque esto no tiene nada que ver con los scripts, podemos fijarnos en que al abrir un intrprete de comandos (cmd.exe) no se pueden realizar funciones de copiar y pegar, lo cual puede sernos incmodo en Windows. La manera de configurar el intrprete de comandos es pinchando con el ratn en la esquina superior izquierda del intrprete de comandos, propiedades, marcamos el casillero de modalidad de edicin rpida. De esta manera, con el botn izquierdo del ratn ya podremos marcar textos. Una vez marcado, pinchamos botn derecho del ratn y esto nos lo enva al portapapeles (es decir, esta es la accin copiar a la que estamos acostumbrados. La accin pegar, es simplemente botn derecho (sin haber marcado nada previamente). Lo que tengamos en el portapapeles (lo hayamos llevado mediante la accin anterior, o bien lo hayamos copiado desde cualquier otra ventana Windows) lo pegar en donde est el cursor. CONCEPTOS EN UN SCRIPT CONTROL DE FLUJOS Acabamos de ver unos conceptos sobre entorno, comandos, variables, etc., que son bsicos para poder realizar un script, pero hasta el momento no hemos visto ninguna instruccin excepto las puestas en los ejemplos previos, ni tampoco hemos visto cmo el shell ejecuta el script y cmo se puede tener control sobre la ejecucin. Bsicamente un script de comandos, tal y como hemos comentado, no es nada ms que escribir en un archivo de texto con extensin .bat o .cmd todas las instrucciones que iramos haciendo manualmente. Adems, dentro del propio script, en funcin de resultados que vayamos obteniendo se pueden tomar acciones. Recordemos algunas de las instrucciones vistas hasta el momento:

Instruccin: ECHO, su objetivo es mostrar por el STDOUT (normalmente la consola) el literal que exista a continuacin. Recordemos que lo primero que hace el intrprete de comandos es expandir las instrucciones, es decir, si existe una variable de entorno (delimitada por smbolos %), lo primero que hace es sustituir dicha variable por su contenido. Es decir, si escribimos en un script: echo esto es %var% prueba y la variable de entorno var contiene el literal una, el intrprete de comandos: 1) Realiza la sustitucin de las variables de entorno, por tanto la lnea quedara como: ECHO esto es una prueba 2) A continuacin, ejecuta la instruccin: Como ECHO es un comando interno que escribe en el STDOUT lo que hay a continuacin, nos mostrar el literal esto es una prueba. Es importante la matizacin anterior ya que la expansin de variables es el primer paso y lo es para todas las instrucciones. Si hubisemos cometido un error y hubisemos puesto: ECHA esto es %var% prueba 1) Expandira la instruccin como: ECHA esta es una prueba 2) Intentara ejecutar la instruccin. ECHA no es el nombre de un comando interno, por tanto buscara en la carpeta en curso y posteriormente en el PATH un programa (otro script, o un .com, o un .exe, etc de acuerdo a las reglas vistas anteriormente). Si lo encuentra ejecutar el programa o script ECHA y si no lo encuentra nos dir que sucede un error. NOTA: La sintaxis completa de ECHO es: ECHO literal a escribir ECHO. (un . pegado a la instruccin sin separacin: escribe una lnea en blanco) ECHO ON ECHO OFF Estas dos ltimas son instrucciones a ejecutar slo dentro de un script. Veamos su uso. Nos creamos un script llamado por ejemplo: pr.cmd en mi usuario y en una nueva carpeta de pruebas llamada tmp con el contenido: set var=Hola echo %var% mundo. set var= Lo guardamos en disco y ahora lo ejecutamos. Qu vemos?: C:\Documents and Settings\miusuario\tmp>set var=Hola C:\Documents and Settings\miusuario\tmp>echo Hola mundo Hola mundo C:\Documents and Settings\miusuario\tmp>set var= Es decir, nos ha ido mostrando todas las lneas que va ejecutando y mezclado con las salidas que a su vez va dando el script. Si queremos suprimir la salida de las lneas y dejar solamente la salida de los comandos, es decir Hola mundo, lo primero que debemos decirle al script es que no queremos ECO de lo que va traduciendo. Este ECO es til cuando estamos depurando y probando un script, pero, cuando lo tenemos finalizado y correcto, lo lgico es ver slo la salida y no lnea por lnea. En este caso podemos poner como primera lnea del script: @ECHO OFF El smbolo @ como primer carcter en una lnea del script indica que no queremos que esa lnea se vea en la ejecucin. Si adems le damos la orden ECHO OFF, le estamos diciendo que hasta el final del script, o bien hasta que se encuentre otra orden ECHO ON, no muestre nada de la ejecucin (s de la salida de instrucciones) por pantalla. Es decir, en nuestro caso, si no queremos ver nada ms que el literal Hola mundo, nos quedan

dos posibilidades: 1) Poner una @ al comienzo de cada instruccin en el script. O bien: 2) Poner como primera lnea del script @ECHO OFF Vamos a hacer un parntesis en este captulo e introducir el concepto de nombre lgico de dispositivo. NOMBRES LGICOS DE DISPOSITIVOS Hay ciertos dispositivos que podemos usar en cualquier comando o dentro de un script con nombres reservados que se refieren a dispositivos, normalmente lgicos, de nuestra mquina. Por ejemplo: CON se refiere a la consola. Lo que se enve o reciba desde la consola se puede referenciar con CON. LPT1 se refiere a la impresora. Lo que se enve a l se escribir en la impresora (si est asignada a ese puerto). NUL dispositivo nulo. Lo que se enve a l, se pierde. Aunque existen ms dispositivos lgicos, llegado este punto slo vamos a ver estos tres. Veamos unos ejemplos: 1) Imaginemos que hemos recibido una clave de registro de un producto por mail, y lo queremos guardar en un fichero llamado licencia.txt en una carpeta determinada. La manera clsica de hacerlo mediante Windows es abrir el cuaderno de notas, copiar la clave desde el mail recibido y guardar el fichero en la carpeta que queremos con el nombre licencia.txt. Bien, podramos hacer en una consola de comandos: copy con licencia.txt En este punto se quedar el cursor esperando una entrada. Tecleamos la clave recibida (o la copiamos desde el mail), y para finalizar la entrada de datos le damos a CTRL-Z (CTRL-Z es la marca estndar de fin de fichero). Es decir, hemos copiado desde la consola a un fichero de la misma forma que si hubisemos copiado un fichero a otro fichero. 2) Queremos enviar un fichero a impresora: copy fichero.txt lpt1 3) No queremos ver, por ejemplo despus de un comando copy la lnea de xx archivos copiados que siempre nos informa el copy. Simplemente redirigimos la salida al dispositivo nulo. copy fichero1.txt fichero2.txt >nul RETOMANDO EL CONTROL DE FLUJOS DE EJECUCIN Una vez hecho el parntesis anterior, vamos a ver las instrucciones de control flujo. Bsicamente son 3. 1) Instruccin GOTO (ir a) Permite en un punto determinado de nuestro script saltar a otro punto del script. Normalmente se usa despus de una pregunta lgica por algn resultado (por ejemplo, dentro de una instruccin IF). GOTO nombre_etiqueta Y en algn lugar de nuestro script debemos tener :nombre_etiqueta (ntense los :) En este caso, al ejecutar la instruccin GOTO, buscar en el script la lnea :nombre_etiqueta y bifurcar a dicha lnea. NOTA: Existe una etiqueta implcita en cualquier script que no es necesario definir, :EOF (End Of File Fin de fichero). Por tanto, la ejecucin de la instruccin GOTO :EOF implica que se saltar hasta el final del fichero y por tanto finalizar el script. 2) Instruccin IF (si). Recordemos que lo encerrado entre corchetes es opcional if [not] errorlevel nmero comando [else expresin] Estamos verificando si la variable %ERRORLEVEL%, que indica el cdigo de retorno de un comando anterior, tiene un valor determinado. Si lo tiene ejecutar el comando y si no lo

tuviese y hemos codificado en la lnea (es opcional) un ELSE (en otro caso), ejecutar precisamente ese ELSE. if [not] cadena1==cadena2 comando [else expresin] cadena1 y cadena2 pueden ser cualquier cosa incluidas variables de entorno. Recordemos que lo primero que se hace es la expansin de variables. Hay que tener muchsimo cuidado con esto y no me gustan las instrucciones del estilo anterior a menos que tengamos delimitadores especficos. Voy a intentar explicarlo. Imaginemos que tenemos una variable var1 con contenido 1 y otra var2 con contenido tambin 1. La instruccin: if %var1%==%var2% echo valen lo mismo Se ejecutar sin problemas y nos sacar el mensaje valen lo mismo. Si var2 contiene un 2, la instruccin anterior, al no ser iguales, no mostrar nada. Pero y si var1 contiene Hola mundo, que sucedera? Pues un desastre. Al expandir la expresin quedara: if Hola mundo==2 echo valen lo mismo Detrs del hola no hay smbolo de comparacin, por lo cual la instruccin es sintcticamente incorrecta. Lo mismo pasara si var1 o var2 no tienen contenido. En estos casos, el truco consiste en encerrarlas entre algn delimitador. Por ejemplo, comillas -ya que estas definen un literal. Es decir: if %var1%==%var2% echo valen lo mismo Esto al expandirse quedara: if hola mundo==2 echo valen lo mismo La comparacin se realiza entre literales entrecomillados lo cual no provoca error ni aun en el caso de que alguno sea nulo al no tener contenido. if [not] exist nombreDeArchivo comando [else expresin] if [/i] cadena1 operadorDeComparacin cadena2 comando [else expresin] El /i realiza la comparacin de tal manera que no se distingue entre maysculas y minsculas. Es decir HOLA es lo mismo que hOLa. Fijmonos que hemos puesto no un == (igualdad) en este caos, sino que por primera vez se ha puesto operadorDeComparacion. Este operador que veremos a continuacin, y el smbolo == no es nada ms que uno de ellos. if defined variable comando [else expresin] OPERADORES DE COMPARACIN Especifica un operador de comparacin de tres letras. En la siguiente tabla puede ver los valores de operadorDeComparacin. EQU igual a (es lo mismo que ==) NEQ no es igual a LSS menor que LEQ menor que o igual a GTR mayor que GEQ mayor que o igual a PARMETROS Cualquier script es capaz de recibir parmetros desde la lnea invocante. Se considera parmetro cualquier literal enviado en la lnea que invoca al script. El sistema considera que los parmetros estn separados por espacios en blanco o bien por el delimitador ;. Cada parmetro se referencia dentro del script por %1, %2, %3, etc Vamos a crear un script que reciba dos parmetros, el nombre de un fichero y el nombre de una carpeta. El objetivo del script es copiar el archivo desde la carpeta en donde estemos posicionados en la carpeta destino, siempre y cuando no exista ya en el destino. Una manera grosera de realizar el script, llammosle copia.cmd, sin verificar que los parmetros son correctos, sera:

@echo off if not exist %2\%1 copy %2 %1 Si invocsemos al script de la siguiente manera: copia.cmd mifichero.txt c:\backup al desarrollar la instruccin el script, realizara: if not exist c:\backup\mifichero.txt copy mifichero.txt c:\backup lo cual es precisamente lo que queramos hacer. He comentado que este script, tal y como est, est realizado de una manera grosera. Si el nombre del archivo o el nombre de la carpeta destino tuviese espacios en blanco el sistema considerara que dicho espacio en blanco es un delimitador de parmetros y por tanto nos llegaran al script ms parmetros de los deseados. Realmente para realizar correctamente el script deberamos hacer: @echo off if {%1}=={} goto error if {%2}=={} goto error if {%3} NEQ {} goto error if not exist %1 goto error1 if not exist %2\nul goto error2 if exist %2\%1 goto aviso copy %1 %2\%1 2>&1 >nul if not errorlevel 1 goto correcto echo Copia errnea. Verifique permisos de la carpeta destino. goto:EOF :error echo parmetros errneos. Deben recibirse dos parmetros. goto :EOF :error1 echo Nombre del fichero origen no existe. goto :EOF :error2 echo Carpeta destino no existe. goto :EOF :aviso: echo El archivo ya existe en el destino. No se ha realizado copia. goto :EOF :correcto echo Archivo copiado correctamente. goto :EOF Y la manera de invocar al comando sera: copia.cmd nombre fichero.xxx c:\carpeta destino Ntese que hemos entrecomillado cada uno de los parmetros. De esta manera slo se recibirn dos parmetros ya que si no, se recibiran 4 al usar como delimitador el sistema los espacios en blanco entre ellos. Comentemos un poco el script. * Verificamos que hemos recibido 2 parmetros y slo 2. * Verificamos que exista el fichero origen * Verificamos que exista la carpeta destino. Para verificarlo usamos un pequeo truco: preguntar por el dispositivo nul en la carpeta destino. Si no existe, es que la carpeta no existe. * Verificamos que de acuerdo a las especificaciones del script no exista ya el fichero en la carpeta destino. * Realizamos la copia. Redirigimos todo a nul para que no de mensajes de archivos copiados.

* Comprobamos el cdigo de retorno y si no es cero enviamos el mensaje correspondiente. * Damos un mensaje de copia correcta cuando se ha finalizado correctamente el script. Bien, el ejemplo anterior nos puede servir para la introduccin de lo que son los parmetros y cmo se deben usar o referenciar en el script. Vamos a ver toda la casustica ms en detalle. Realmente podemos referenciar los parmetros desde %0 a %9. El parmetro recibido en %0 no se teclea y siempre el sistema nos pasa como contenido el nombre del script invocado. Hagamos una prueba: @echo off echo Parmetro 0: %0 %1 a %9 son los posibles parmetros enviados en la lnea de comandos. Realmente pueden pasarse ms de 9 parmetros pero slo 9 de ellos sern accesibles directamente. Si passemos ms, hay que usar el comando shift, el cual tiene por objeto desplazar los parmetros. Es decir, al ejecutar shift lo que se hace es que el %2 pasa a ser %1 (el %1 se pierde por lo que debemos guardarlo), el %3 pasa a ser el %2, etc De tal manera que al final el %9 pasa a contener el posible dcimo parmetro pasado. Realicemos como prueba: @echo off echo Antes de desplazar echo Parametro 1: %1 echo Parametro 2: %2 echo Parametro 3: %3 echo Parametro 4: %4 echo Parametro 5: %5 echo Parametro 6: %6 echo Parametro 7: %7 echo Parametro 8: %8 echo Parametro 9: %9 shift echo Despues de desplazar echo Parametro 1: %1 echo Parametro 2: %2 echo Parametro 3: %3 echo Parametro 4: %4 echo Parametro 5: %5 echo Parametro 6: %6 echo Parametro 7: %7 echo Parametro 8: %8 echo Parametro 9: %9 shift echo Despues de desplazar de nuevo echo Parametro 1: %1 echo Parametro 2: %2 echo Parametro 3: %3 echo Parametro 4: %4 echo Parametro 5: %5 echo Parametro 6: %6 echo Parametro 7: %7 echo Parametro 8: %8 echo Parametro 9: %9 e invoquemos al script anterior (parm.cmd, por ejemplo) de la siguiente manera: parm.cmd 1 2 3 4 5 6 7 8 9 10 11

NOTA: Podemos referenciar toda la lnea de parmetros mediante %* Si reescribimos el bat anterior: @echo off echo Toda la lnea de parmetros es: %* y ejecutamos parm.cmd 1 2 3 4 5 6 7 8 9 10 podemos comprobar la salida. Esto puede ser til si luego queremos tratar todo como una sola lnea y usamos comandos especficos, que veremos ms adelante, para tratar dicha lnea. A los parmetros y slo a los parmetros, pueden anteponrseles modificadores los cuales realizan una conversin especifica. Vamos a ver un ejemplo y a continuacin daremos todas las posibilidades. Hagamos un script (parm.cmd): @echo off echo Parmetro 1 expandido: %~f1 echo Parmetro 2 expandido: %~f2 Supongamos que nuestro script est en la carpeta: C:\Documents and Settings\miusuario\tmp> Al ejecutar: parm.cmd aaa.www bbb nos devolver: Parmetro 1 expandido: C:\Documents and Settings\miusuario\tmp\aaa.www Parmetro 2 expandido: C:\Documents and Settings\miusuario\tmp\bbb Es decir, el delimitador %~f por delante del numero de parmetro nos expande el parmetro considerndolo como si fuese nombre de archivo (sin verificarlo) al nombre completo de unidad, ruta y archivo en donde se est ejecutando el script. Realmente todos los modificadores posibles de parmetros son los que se describen a continuacin: %~1 Expande %1 y quita todas las comillas (). %~f1 Expande %1 y lo convierte en un nombre de ruta de acceso completo. %~d1 Expande %1 a una letra de unidad. %~p1 Expande %1 a una ruta de acceso. %~n1 Expande %1 a un nombre de archivo. %~x1 Expande %1 a una extensin de archivo. %~s1 Ruta de acceso expandida que nicamente contiene nombres cortos. %~a1 Expande %1 a atributos de archivo. %~t1 Expande %1 a una fecha/hora de archivo. %~z1 Expande %1 a un tamao de archivo. %~$PATH:1 Busca los directorios enumerados en la variable de entorno PATH y expande %1 al nombre completo del primer directorio encontrado. Si el nombre de la variable de entorno no est definido o la bsqueda no encuentra el archivo, este modificador se expande a la cadena vaca. La tabla siguiente enumera las combinaciones posibles de modificadores y calificadores que puede usar para obtener resultados compuestos. %~dp1 Expande %1 a una letra de unidad y una ruta de acceso. %~nx1 Expande %1 a un nombre y extensin de archivo. %~dp$PATH:1 Busca los directorios enumerados en la variable de entorno PATH para %1 y expande a la letra de unidad y ruta de acceso del primer directorio encontrado. %~ftza1 Expande %1 a una lnea de salida similar a dir. NOTA: En los ejemplos anteriores, se puede reemplazar %1 y PATH con otros valores de parmetros de proceso por lotes. No se pueden manipular parmetros de proceso en los scripts de la misma manera en que se manipulan variables de entorno (funciones de manejo de cadenas vistas anteriormente). No se pueden buscar y reemplazar valores ni examinar subcadenas. Sin embargo, se puede asignar el

parmetro a una variable de entorno para, despus, manipular la variable de entorno. Aunque no es necesario memorizarlos s que es importe saber que existen, ya que algunas veces nos puede ser necesario usarlos para expansin sobre todo en nombres de archivos. INVOCACIN A PROCEDIMIENTOS. INSTRUCCIN CALL Muchas veces es necesario desde un script llamar a otro procedimiento, o llamar a una subrutina del mismo procedimiento. Vemos ambos casos. * Llamada a procedimiento externo. Vamos a crearnos dos script. El primero de ellos lo llamaremos principal.cmd y con el contenido: @echo off echo estoy en el principal call invocado.cmd echo de vuelta en el principal Y un segundo procedimiento llamado invocado.cmd: @echo off echo estoy en el invocado Si lo ejecutamos veremos los resultados. Recordemos que tanto el procedimiento principal como el invocado pueden recibir parmetros y podemos jugar con ellos como queramos. Por ejemplo: principal.cmd: @echo off echo estoy en el principal echo mi primer parmetro: %1 echo mi segundo parmetro: %2 call invocado.cmd %2 echo de vuelta en el principal invocado.cmd: @echo off echo estoy en el invocado echo el parmetro del invocado es: %1 y ahora lo ejecutamos como principal.cmd primero segundo Qu es lo que vemos? Ntese, que el ejemplo anterior, si en vez de llamar con CALL, hubisemos omitido dicho CALL, es decir la lnea: CALL invocado.cmd slo tuviese: invocado.cmd tambin se ejecutara el invocado. Pero cuando este terminase, terminara todo y no volvera al script principal. * Llamada a procedimiento interno (subrutina). La sintaxis es CALL :nombre, en donde :nombre es un nombre de etiqueta interno al cual saltar la ejecucin del script, pero a diferencia del goto, cuando finalice la propia rutina continuar la ejecucin despus del CALL invocante. Se considera la finalizacin de la subrutina cuando se alcanza el fin del archivo por lotes. Pongamos un ejemplo (script.cmd) @echo off echo Parmetro 1: %1 echo Parmetro 2: %2 call :rutina1 %2 echo estoy de nuevo en el principal call :rutina1 %1 echo estoy de nuevo en el principal call :rutina2 parametrosjuntos%1%2

goto final :rutina1 echo en la rutina recibo parmetro: %1 goto:EOF :final echo estoy ya al final Fijmonos que la subrutina la terminamos con goto :EOF. Esto indica que cuando se la invoca con CALL volver a la lnea de continuacin del invocante (realmente salta a fin de fichero, con lo que provoca la condicin de vuelta que hemos citado anteriormente). CONSIDERACIONES SOBRE MBITO DE VARIABLES Hemos comentado anteriormente que cada programa tiene su rea de entorno la cual es una copia del rea de entorno del programa invocante, y que por tanto, si se modifican o aaden variables de entorno, esto *slo* afecta a dicho programa (y por supuesto a los que l invoque, ya que heredarn su entorno). Pero cul es el entorno de un script? Un script no es en s un programa: es una secuencia de comandos dentro del shell. Dentro del cmd.exe. Pero adems dentro slo del cmd.exe que lo ha invocado. Un script no tiene entorno propio: se usa, y por tanto se modifica o se aaden variables al entorno del cmd.exe invocante (y slo a l, es decir si tenemos arrancado o arrancamos posteriormente otro cmd.exe, este ltimo no se ver afectado). Si un script llama a otro script (mediante CALL) tendr acceso a todas las variables modificadas en el script principal. No es conveniente modificar el entorno del cmd.exe (aunque sea el invocante del script), y lo ideal sera que el script, al finalizar, dejase el entorno tal y como estaba antes de arrancarse. Pongamos un ejemplo: un simple script que haga: @echo off set a=%1 set computername=%a%_mio . Esto es vlido y hemos usado una variable llamada computername simplemente porque se nos ha ocurrido en el script. Pero, curiosamente, ese nombre de variable ya exista en el sistema (en el entorno del cmd.exe). Por tanto, lo que sucede es que al finalizar el script, ese cmd.exe -y slo esese quedar en su entorno con una variable que ya exista modificada por el script, y adems con otra variable a que antes de empezar el script no tena valor. Lo ideal sera no usar nombres que ya existan en el entorno en el propio script, y adems que el script limpiase sus variables internas antes de finalizar. Esto es engorroso y normalmente difcil de controlar. El sistema nos da la posibilidad de hacerlo l automticamente mediante las instrucciones setlocal y endlocal. Por ejemplo, si en el script anterior hubisemos hecho: @echo off setlocal set a=%1 set computername=%a%_mio endlocal Es decir, le estamos diciendo desde la instruccin setlocal que todo lo que hagamos ser local al script. Y cuando se ejecuta endlocal (al final del script) le estamos diciendo que deshaga todas las variables usadas y permanezca tal y como estaba desde que se ejecut la anterior instruccin setlocal. Como norma es conveniente en los scripts (o al menos en el principal si ussemos llamadas CALL - esto depender de la lgica-) el usar un setlocal al inicio del script y un endlocal como ltima instruccin del script. La instruccin setlocal admite adems opcionalmente la siguiente sintaxis:

setlocal {enableextension | disableextensions} {enabledelayedexpansion | disabledelayedexpansion} Algunas de ellas -las dos ltimas- ya las hemos comentado: por defecto el intrprete de comandos tiene desactivada la expansin diferida (a menos que se haya arrancado con /V:ON o bien se hayan modificado ciertas claves de registro para cambiar el comportamiento general del intrprete de comandos), y por ello hay que prestar especial atencin a la expansin de las variables de entorno en la lnea de comando antes de que esta pase a ejecucin (recordemos la sintaxis con ! como delimitador de la variable de entorno en vez de usar el delimitador % normal. Es conveniente revisar ese captulo ya que el concepto es extremadamente importante). Las dos primeras: {enableextension | disableextensions} no es conveniente tocarlas ya que se desactivaran las extensiones de comandos y las instrucciones: DEL o ERASE COLOR CD o CHDIR MD o MKDIR PROMPT PUSHD PUSHD POPD SET SETLOCAL ENDLOCAL IF FOR CALL SHIFT GOTO START (tambin incluye cambios en la invocacin de comandos externos) ASSOC FTYPE Tendra un comportamiento diferente. Podemos ver estas modificaciones pidiendo la ayuda de cualquiera de las instrucciones anteriores, por ejemplo CALL /? Por defecto, tal y como viene Windows, el valor es: setlocal enableextension disabledelayedexpansion Debido a que es posible que el sistema en donde se vayan a ejecutar nuestros scripts pueda haberse modificado el comportamiento global, siempre es conveniente forzar en nuestro script principal lo que deseamos. Mi consejo adems es permitir la expansin diferida del entorno, por tanto, es conveniente siempre poner al comienzo del script principal la instruccin: setlocal enableextension enabledelayedexpansion con lo cual ya podremos usar el delimitador ! cuando nos interese. COMANDOS INTERNOS DEL INTRPRETE DE COMANDOS Llegado a este punto ya podemos ver todos los comandos internos que tiene el intrprete de comandos. Recordemos igualmente que hay una lista alfabtica y detallada en el fichero de ayuda ntcmds.chm que reside en \windows\help. Es conveniente para los que se vayan a dedicar a la escritura de scripts el tener un acceso directo en Windows a dicho archivo. En esa lista alfabtica figuran tanto los comandos internos de Windows como los externos que nos da la propia versin del sistema operativo. Vamos a dar un repaso de todas formas y un pequeo comentario a cada uno de ellos, excepto para el comando ms potente de Windows: el comando FOR, el cual

merecer todo un captulo aparte. Es conveniente llegado a este punto que se vaya consultando cada uno de los comandos que citar a continuacin en ntcmds.chm. Los comandos internos son: ASSOC Ver / cambiar asociacin a la extensin de un archivo. CALL Llamada a procedimiento. CD o CHDIR Cambiar carpeta en curso. CLS Borrar pantalla. COLOR Atributos de color en el texto enviado a consola. COPY Copiar archivos. DEL o ERASE Borrar archivos. DIR Listar contenido de la carpeta en curso. ECHO Mostrar por pantalla (en STDOUT). ENDLOCAL Fin de tratamiento de variables locales de entorno. EXIT Final de la secuencia de comandos por lotes o sale de un cmd.exe si se invoca directamente. FOR (lo veremos en todo un captulo aparte). FTYPE Muestra o modifica los tipos de archivos empleados en asociaciones de extensiones de archivo. GOTO Ir a. (Salto incondicional a una etiqueta del script en curso). IF Instruccin de comparacin. MD o MKDIR Crear una carpeta. PATH Como instruccin devuelve el contenido de la variable %PATH%. PAUSE Detiene la ejecucin de un script y espera a que se pulse una tecla para continuar. POPD Cambia el directorio actual al que se haya almacenado con PUSHD. PROMPT Cambia el smbolo de sistema de Cmd.exe. PUSHD Guarda el nombre del directorio actual para que lo use el comando POPD. REM Es un comentario en un script. Lo que va a continuacin no se ejecuta. REN o RENAME Renombra un archivo o una carpeta. RM o RMDIR Borrar una carpeta. SET Asignacin de contenido a variables de entorno. SETLOCAL Tratamiento o comportamiento de las variables en un script y de las extensiones de comandos. SHIFT Desplazamiento de los parmetros con que se invoca a un script. START Inicia una ventana independiente de smbolo del sistema para ejecutar un programa o un comando especificado. TYPE Vuelca el contenido de un archivo al STDOUT. VER Muestra el nmero de versin de Windows. COMANDO FOR Es el comando ms importante y ms potente que podemos usar en un script. Por tanto, vamos a verlo en detalle y haciendo hincapi en ejemplos de su uso. NOTA: Es el nico comando que tiene sintaxis diferente ejecutado desde la lnea de comandos y ejecutado desde un script. Los subndices del comando -tal y como se vern a continuacin- se expresan con un smbolo % desde la lnea de comandos, pero en un script deben expresarse con un doble smbolo, es decir con %%. Definicin: Ejecuta un comando especificado para cada archivo de un conjunto de archivos. Sintaxis. Admite varias formas: (recordando que en script %variable debe ser %%variable) 1) for %variable in (grupo) do comando %variable Requerido. Representa un parmetro reemplazable. Utilice %variable para ejecutar for en el smbolo del sistema. Utilice %%variable para ejecutar el comando for dentro de un archivo por

lotes. Las variables distinguen entre maysculas y minsculas y se deben representar con un valor alfabtico, como %A, %B o %C. (grupo) Requerido. Especifica uno o varios archivos, directorios, intervalo de valores o cadenas de texto que se desea procesar con el comando especificado. Los parntesis son obligatorios. El parmetro grupo puede representar un nico grupo de archivos o varios. Puede utilizar caracteres comodn (es decir, * y ?) para especificar un grupo de archivos. Los siguientes son grupos de archivos vlidos: (*.doc) (*.doc *.txt *.me) (ene*.doc ene*.rpt feb*.doc feb*.rpt) (ar??1991.* ap??1991.*) por ejemplo, desde la lnea de comandos: for %f in (c:\windows\*.*) do @echo %f o bien desde un script: for %%f in (c:\windows\*.*) do @echo %%f nos mostrar los archivos que estn dentro de la carpeta c:\windows (similar a un dir pero slo nos mostrar el nombre. Ejercicio [for-1]: usando el comando for en la forma citada anteriormente obtener nicamente el nombre del archivo. Si lo ejecutamos vemos que la salida es c:\windows\fichero.ccc, c:\windows\fichero2.xxx, etc., y lo que queremos es nicamente el nombre y extensin del archivo. Evidentemente una manera simple de hacerlo sera: c: cd \windows for %f int (*.*) do @echo %f Pero esto no es lo que se solicita, sino que, con una sola lnea for y sin estar posicionado en la carpeta de Windows, se obtenga el mismo resultado que con las tres instrucciones anteriores. (la respuesta a estos ejercicios al final del captulo). comando Requerido. Especifica el comando que desea ejecutar en cada archivo, directorio, intervalo de valores o cadena de texto incluido en el (grupo) especificado. NOTA: Hay que prestar especial atencin al posible uso del %variable dentro de la accin do as como al posible uso de variables dentro de l. Recordemos la parte vista anteriormente de expansin diferida o no del comando a la hora de traducir la lnea. NOTA: Cuando estn habilitadas las extensiones de comandos (es el valor por defecto del cmd.exe en Windows) -ver captulos anteriores- es posible tambin las sintaxis que veremos a continuacin 2) for /D %variable in (grupo) do comando /D -> Slo directorios Si grupo contiene caracteres comodn (* y ?), el comando especificado se ejecuta para cada directorio (en lugar de un grupo de archivos de un directorio especificado) que coincida con grupo. La sintaxis es: for /D %variable in (grupo) do comando [opcionesDeLneaDeComandos] Por ejemplo, para recorrer todas las subcarpetas de la carpeta Windows: for /d %s in (c:\windows\*.*) do @echo %s 3) for /R [unidad :]rutaDeAcceso] %variable in (grupo) do comando

[opcionesDeLneaDeComandos] /R -> Recursividad. Recorre el rbol de directorios con raz en [unidad:]rutaDeAcceso y ejecuta la instruccin for en cada directorio del rbol. Si no se especifica un directorio despus de /R, se considera el directorio actual. Si grupo tiene nicamente un punto (.) slo se enumerar el rbol de directorios. Ejercicio [for-2]: Se desea obtener en un fichero llamado c:\datos.txt todos los archivos, un delimitador como puede ser ; y el nombre de la carpeta en la cual residan. Es decir un archivo de texto con el formato: notepad.exe;c:\Windows etc Ejercicio [for-3]: Obtener los mismos datos que en el ejercicio anterior pero recibiendo la carpeta origen por parmetro. 4) for /L %variable in (nmeroInicial,nmeroPaso,nmeroFinal) do comando /L -> Iteracin de un intervalo de valores. Se utiliza una variable iterativa para establecer el valor inicial (nmeroInicial) y, despus, recorrer un intervalo de valores especificado hasta que el valor sobrepase el valor final (nmeroFinal) especificado. /L ejecutar la iteracin mediante la comparacin de nmeroInicial con nmeroFinal. Si nmeroInicial es menor que nmeroFinal, el comando se ejecutar. Si la variable iterativa sobrepasa el valor de nmeroFinal, el shell de comandos sale del bucle. Tambin se puede utilizar un valor nmeroPaso negativo para recorrer un intervalo de valores decrecientes. Por ejemplo, (1,1,5) genera la secuencia 1 2 3 4 5 y (5,-1,1) genera la secuencia (5 4 3 2 1) for /l %i in (5,-1,1) do @echo %i Ejercicio [for-4]: Dar un barrido de ping a las primeras 30 ips desde 172.16.0.1 5) Interaccin y anlisis de archivos. Es la parte ms potente del FOR ya que permite ejecucin interna de comandos dentro del propio do -realiza o puede realizar spawn del posible comando dentro del doLo veremos despus de entender la solucin a los ejercicios. RESPUESTAS A LOS EJERCICIOS (1) [for-1] for %f in (c:\windows\*.*) do @echo %~nxf Revisar el captulo de parmetros para ver los prefijos ~n o bien ~x que pueden ponerse a parmetros (o bien a variables explcitas o implcitas en un for -son equivalentes a parmetros-) para entender el comando anterior. [for-2] Vamos a realizarlo en un script. @echo off setlocal enabledelayedexpansion set ruta= del c:\datos.txt 2>&1 >nul for /r c:\windows %%a in (.) do ( set ruta=%%a&@for %%f in (!ruta:\.=!\*.*) do echo %%~nxf;!ruta:\.=! >>c:\datos.txt ) endlocal Razonar el script y cada detalle dentro del for. [for-3]

Vamos a realizarlo en un script. @echo off setlocal enabledelayedexpansion if %* EQU goto error0 pushd cd %* >nul if errorlevel 1 goto error1 set ruta= del c:\datos.txt 2>&1 >nul for /r %* %%a in (.) do ( set ruta=%%a&set r=!ruta:\.=!&@for %%f in (!r!\*.*) do echo %%~nxf;!r! >>c:\datos.txt ) goto FIN :error0 echo Falta parametro. goto FIN :error1 echo Carpeta recibida por parametro inexistente goto FIN :FIN endlocal popd Razonar el script y cada detalle del uso del parmetro as como los controles realizados. [for-4] for %i in (1,1,30) ping 172.16.0.%i COMANDO FOR INTERACCIN Y ANLISIS DE ARCHIVOS Hemos dejado aparte la interaccin y anlisis de archivos debido a que es la ms compleja y a la vez la que ms potencia da a los scripts y que usaremos en muchos de nuestros procedimientos. Es la parte ms potente del FOR ya que permite ejecucin interna de comandos dentro del propio do -realiza o puede realizar spawn del posible comando dentro del in-. Vamos a ver la definicin formal y la sintaxis, pero sobre todo, a continuacin, vamos a insistir en la comprensin real de su ejecucin mediante ejemplos. Aconsejo una lectura rpida hasta la parte de Ejemplos y comprensin del comando. Definicin formal: El anlisis de archivos se compone de la lectura de la informacin de salida, la cadena o el contenido del archivo, su divisin en lneas individuales de texto y el anlisis de cada lnea en cero o ms testigos. Despus, se llama al bucle for con la variable de iteracin establecida al valor del testigo. De forma predeterminada, /F pasa el primer testigo separado por espacios en blanco de cada lnea de cada archivo. Las lneas en blanco se omiten. Las distintas sintaxis son: Sintaxis: for /F ["palabrasClaveDeAnlisis"] {%% | %}variable in (grupoNombreArchivos) do comando [opcionesDeLneaDeComandos] for /F ["palabrasClaveDeAnlisis"] {%% | %}variable in (cadenaLiteral) do comando [opcionesDeLneaDeComandos] for /F ["palabrasClaveDeAnlisis"] {%% | %}variable in (comando) do comando [opcionesDeLneaDeComandos] El argumento grupoNombreArchivos especifica uno o varios nombres de archivo. Cada archivo se abre, lee y procesa antes de pasar al siguiente archivo en grupoNombreArchivos. Para suplantar el comportamiento predeterminado del anlisis, especifique palabrasClaveDeAnlisis. Se trata de

una cadena incluida entre comillas que contiene una o varias palabras clave que especifican diferentes opciones de anlisis. Si incluye la opcin usebackq, utilice una de las sintaxis siguientes: for /F ["usebackqpalabrasClaveDeAnlisis"] {%% | %}variable in (grupoNombreArchivos) do comando [opcionesDeLneaDeComandos] for /F ["usebackqpalabrasClaveDeAnlisis"] {%% | %}variable in (cadenaLiteral) do comando [opcionesDeLneaDeComandos] for /F ["usebackqpalabrasClaveDeAnlisis"] {%% | %}variable in (`comando`) do comando [opcionesDeLneaDeComandos] En la tabla siguiente se enumeran las palabras clave de anlisis que se pueden utilizar para palabrasClaveDeAnlisis. Palabra clave Descripcin eol=c Especifica un carcter de fin de lnea (slo un carcter). skip=n Especifica el nmero de lneas que se omitirn al principio del archivo. delims=xxx Especifica un grupo de delimitadores. Reemplaza el grupo de delimitadores predeterminado, formado por los caracteres espacio y tabulador. tokens=x,y,m-n Especifica los testigos de cada lnea que se pasarn al cuerpo de for en cada iteracin. Como consecuencia, se asignarn nombres de variable adicionales. La forma m-n es un intervalo que especifica los testigos m hasta n. Si el ltimo carcter de la cadena tokens= es un asterisco (*), se asigna una variable adicional que contendr el texto que queda en la lnea despus del ltimo testigo analizado. usebackq Especifica que se pueden utilizar comillas para incluir los nombres de los archivos de grupoNombreArchivos, que una cadena incluida entre comillas se ejecutar como si fuera un comando y que una cadena escrita entre comillas simples es un comando de cadena literal. Reemplazo de variables: Se han mejorado los modificadores de reemplazo de las referencias a variables de for. La tabla siguiente muestra la sintaxis opcional (para cualquier variable I): Variable con modificador Descripcin %~I Expande %I que elimina las comillas () delimitadoras. %~fI Expande %I a un nombre de ruta de acceso completo. %~dI Expande %I a una letra de unidad solamente. %~pI Expande %I a una ruta de acceso solamente. %~nI Expande %I a un nombre de archivo solamente. %~xI Expande %I a una extensin de archivo solamente. %~sI Expande la ruta de acceso para que solamente contenga nombres cortos. %~aI Expande %I a los atributos del archivo. %~tI Expande %I a la fecha y hora del archivo. %~zI Expande %I al tamao del archivo. %~$PATH:I Busca los directorios enumerados en la variable de entorno PATH y expande %I al nombre completo del primero encontrado. Si el nombre de la variable de entorno no est definido o la bsqueda no encuentra el archivo, este modificador se expande a la cadena vaca. En la tabla siguiente se enumeran las combinaciones de modificadores que se pueden utilizar para obtener resultados compuestos. Variable con modificadores combinados Descripcin %~dpI Expande %I a una letra de unidad y una ruta de acceso solamente. %~nxI Expande %I a un nombre y extensin de archivo solamente. %~fsI Expande %I a un nombre completo de ruta de acceso para que solamente contenga nombres cortos.

%~dp$PATH:I Busca los directorios enumerados en la variable de entorno PATH de %I y se expande a la letra de unidad y ruta de acceso del primero encontrado. %~ftzaI Expande %I a una lnea de salida parecida a la de dir. En los ejemplos anteriores se puede reemplazar %I y PATH por otros valores vlidos. Los nombres de variable vlidos de for terminan con la sintaxis %~. Si utiliza nombres de variables en maysculas como %I, el cdigo resultar ms legible y evitar confusiones con los modificadores, que no distinguen entre maysculas y minsculas. Analizar una cadena: Tambin se puede utilizar la lgica de anlisis for /F en una cadena inmediata; para ello, escriba entre comillas simples el grupoNombreArchivos (es decir, grupoNombreArchivos) que est entre parntesis. De esta forma, grupoNombreArchivos se considerar como una nica lnea de entrada de un archivo y se analizar as. Analizar la informacin de salida: El comando for /F se puede utilizar para analizar la salida de un comando; para ello, se debe escribir entre comillas el grupoNombreArchivos que est entre parntesis. As se considerar como una lnea de comando, que se pasa a un comando Cmd.exe secundario y la informacin de salida se captura en la memoria y se analiza como si fuera un archivo. * Ejemplos y comprensin del comando Hasta el momento, nicamente he copiado la definicin formal que figura en la propia ayuda de Windows. Voy a darle ahora una vuelta e intentar explicarlo bajo dos puntos de vista que son los bsicos de cara a la ejecucin de un script: 1) Lectura del contenido de un fichero o ficheros Leer el contenido de un fichero, lnea por lnea, es tan sencillo como usar: for /f %i in (pr.abc pr1.txt) do lo que queramos El comando anterior leer todos los ficheros enumerados en la clusula in del directorio en curso y el contenido de ellos, lnea por lnea lo pasar dentro de la variable i al do de ejecucin. Recordemos que en un script el %i debe sustituirse por %%i. Ntese igualmente que esta sintaxis del for no admite caracteres comodn en los nombres de archivo, es decir, no podemos referenciarlos por *.abc o bien por ???.abc, sino que el nombre debe estar totalmente cualificado. Cmo podramos entonces hacer para ver el contenido de todos los archivos con extensin abc? Bien, usando un poco la imaginacin y sabiendo que el for normal (sin /f) es capaz de enumerar los archivos en un directorio, podremos endentar dos for para hacerlo. for %i in (*.abc *.txt) do @for /f %j in (%i) do @echo %j (recordemos igualmente que las @ son para no ver la expansin del comando. Cuando estemos depurando una instruccin lo normal es no ponerlas, para poder seguir lo que est haciendo). Evidentemente este es un ejemplo poco agraciado, ya que mediante el comando type podramos obtener resultados similares, pero vindolo con un for nos ayuda a comprender el propio for. Compliqumoslo un poco. Queremos el resultado anterior pero ignorando la primera lnea de cada archivo. Para ignorar n lneas de un archivo pr.abc sera: for /f skip=n %i in (pr.abc) En nuestro ejemplo, por tanto: for %i in (*.abc *.txt) do @for /f skip=1 %j in (%i) do @echo %j Sigamos complicndolo un poco ms con un ejemplo real: imaginemos que somos administradores de una red y queremos que no se use el emule (o cualquier otro programa) en nuestra red. Una manera sencilla sin entrar a modificar las polticas, seria tener un script en nuestra mquina que peridicamente matase los procesos que queramos en las mquinas remotas. La primera idea es que tenemos que tener un fichero con la lista de las mquinas en las cuales

queremos controlar los procesos. Adems, deberamos tener otro dichero con la lista de programas que queremos matar. De esta manera, simplemente aadiendo en uno de los ficheros una nueva mquina o en el segundo fichero un nuevo programa, podremos tener siempre planificado un script nico que peridicamente analice en las mquinas especificadas en el fichero uno y mate los procesos especificados en el fichero dos. Para ello, creamos un fichero uno con el nombre de las mquinas. Llamemos a ese fichero mquinas.txt en el cual escribiremos los nombre o direcciones IP de las mquinas: \\KA0001 \\192.168.0.10 Igualmente crearemos un fichero dos, con el nombre de programas que queremos matar. Sea este fichero: programas.txt emule.exe bittorrent.exe Debido a que vamos a acceder a mquinas remotas, se necesita un usuario / password administrador en las mquinas remotas. Deseamos que el script reciba por parmetro el usuario y nos solicite por pantalla la password de ese administrador. Igualmente recordemos un par de comandos de XP Profesional o bien de W2003. Para ver los programas que estn en ejecucin en una mquina, simplemente teclear en una consola de comandos tasklist. Esto nos muestra la lista de procesos y su PID (nmero nico que identifica un proceso). Recordemos tambin que el comando taskkill es capaz de matar un proceso pasndole como parmetro el PID del programa a matar. Podemos verlo ejecutando en una consola taskkill /? Bien, ya tenemos todos los ingredientes. Ahora ya es trivial la resolucin: @echo off if {%1} EQU {} (echo Falta usuario&goto :EOF) setlocal enabledelayedexpansion set user=%1 set /p pass=password del usuario %1 : cls for /f %%f in (mquinas.txt) do call :proc00 %%f endlocal goto :EOF :proc00 for /f skip=2 tokens=1,2,* delims= %%g in (tasklist /S %1 /U %user% /P %pass%) do ( call :proc01 %1 %%g %%h ) goto :EOF :proc01 for /f %%i in (programas.txt) do if {%2} EQU {%%i} taskkill /S %1 /U %user% /P %pass% /PID %3 goto:EOF Podemos modificar el script para no solicitar la password y recibirla tambin por un segundo parmetro y ponerlo en el planificador de tareas para que se ejecute por ejemplo cada 5 minutos. Las otras mquinas no se enterarn de nada pero los programas p2p se le morirn cada 5 minutos misteriosamente. (Este ejemplo es valido sin cortafuegos. Con cortafuegos deberemos tener abiertos el puerto netbios-ssn que es el que usan los comandos tasklist y taskkill). En www.sysinternals.com existe una utilidad llamada pskill, pslist las cuales tambin funcionan en XP Home (que no posee los comandos anteriores). Como ejercicio, os podis bajar dichas utilidades, ejecutarlas en consola para ver cmo son dichas salidas y preparar un script similar con ellas. Vamos a comentar algunas caractersticas usadas en el script anterior:

in (tasklist /S %1 /U %user% /P %pass%) Fijmonos en la comilla simple que delimita al comando tasklist y sus parmetros. Cuando dentro de un for /f en la parte del in, especificamos algo encerrado entre comillas simples lo que estamos haciendo es ordenando que se ejecute ese comando en un cmd aparte y que cuando finalice, la salida que nos mostrara en pantalla (STDIN) de la pase al for directamente. Esto lo veremos en detalle en la parte 2) de este captulo. Por tanto es como si se ejecutase el tasklist y lo que se vera por pantalla se le pasa al for. Evidentemente toda esa salida (probarla por pantalla) debe filtrarse para separar los campos que necesitamos, ya que primero: nos molestan las lneas de cabecera y segundo: en las lneas de detalle tenemos que separar lo que es el nombre del programa de lo que es el PID y el resto de datos (que nos sobran en este caso). Es decir, si ejecutamos tasklist en nuestra mquina veremos algo as: Image Name PID Session Name Session# Mem Usage ================ === ================ ======== ============ System Idle Process 0 Console 0 24 K System 4 Console 0 252 K smss.exe 412 Console 0 644 K csrss.exe 524 Console 0 5.848 K winlogon.exe 564 Console 0 5.512 K services.exe 608 Console 0 6.208 K . Fijmonos ahora por delante de la clusula in que es lo que hay: skip=2 tokens=1,2,* delims= %%g Con esto le estamos diciendo: a) Que ignore las dos primeras lneas. b) En tokens, le estamos indicando que vamos a coger el primer campo (que lo pondr en %%g), el segundo, (que lo pondr en %%h) y el resto (que lo pondr en %%i). Fijmonos que slo hemos definido %%g en la lnea, pero al especificar ms campos, usar las letras alfabticamente a partir de %%g como nombres de variables. c) en delims= (ntese un espacio en blanco al final), le estamos diciendo que considere delimitadores los caracteres que van a continuacin del smbolo igual, por tanto en nuestro caso le estamos diciendo que slo hay un delimitador y que este delimitador son los espacios en blanco. Por tanto la instruccin: for /f skip=2 tokens=1,2,* delims= %%g in (tasklist /S %1 /U %user% /P %pass%) do Est recuperando en %%g el nombre de cada proceso y en %%h el PID de dicho proceso. Creo que con este pequeo resumen puede comprenderse perfectamente la potencia del for. Analizar despacio ahora el resto del script. 2) Ejecucin de instrucciones o comandos dentro del for (en la clusula in) Hemos introducido anteriormente en el ejemplo de la parte 1) que dentro del in puede ir entrecomillado simple el nombre de un programa o comando y que el sistema lo ejecutar. Vamos a ver cmo se realiza esto y cmo se recuperan los datos: Lo existente entrecomillado simple dentro de un in en un comando for /f se ejecutar abriendo (en forma oculta) otro cmd el cual ejecutar el comando. La salida a consola (STDOUT) de ese comando cuando finalice, ser la que se pase lnea por lnea al for invocante. Hay una manera de comprobar esto. Abrimos un administrador de tareas y ordenamos por el Nombre de imagen -pinchado ascendente o descendentemente- en la pestaa procesos. De esta manera vemos cuantos cmd.exe tenemos en ejecucin. Ahora nos creamos un simple script (pr.cmd) que haga: @echo off dir

pause Esto sacara un dir y esperara hasta que pulsemos una tecla. En vez de ejecutarlo directamente vamos a ejecutarlo desde dentro de un for for /f tokens=* %i in (pr.cmd) do @echo %i El ejecutar lo anterior qu pasa? Ejecutmoslo. Lo primero que vemos es que se queda parado. Fijmonos tambin en el administrador de tareas: hay un cmd.exe ms en ejecucin de forma oculta ya que no hay consola que veamos, y que realmente es el que esta ejecutando el pr.cmd y est parado en la instruccin pause. Nuestro for todava no ha devuelto datos, por tanto, aunque el dir del pr.cmd se ha ejecutado, todava no ha devuelto contenido al for. Si ahora tecleamos cualquier cosa en la nica consola que tenemos abierta, esta entrada se pasar al segundo cmd (es decir, redirige tambin el STDIN). En ese momento, en la segunda consola (oculta) al recibir la tecla, contina y finaliza. En el momento de la finalizacin es cuando devuelve los datos, lnea por lnea al for. Programacin 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 matemticas, 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: Cdigo 1. 2. 3. 4. 5. @echo off echo %0 %1 %2 %3 shift /1 echo %0 %1 %2 %3

al llamar: Cdigo 1. C:\Documents and Settings\Administrador\tempcurso>astring 123 456 789 2. astring 123 456 789 3. astring 456 789 4.

shift borro, el primer argumento. Tambien contamos con los siguientes modificadores para los archivos: Cdigo 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. %~f1 %~d1 %~p1 %~n1 %~x1 %~s1 %~a1 %~t1 %~z1 - regresa la ruta y el archivo de %1. - regresa la letra de la unidad de %1. - regresa solo la ruta del archivo %1. - regresa solo el nombre de archivo %1. - regresa solo la extension del archivo %1. - regresa solo la ruta, con directorios, con nombres cortos del archivo %1. - regresa los atributos del archivo. - regresa la hora/fecha del archivo %1 - regresa el tamao del archivo %1.

por ejemplo: en un directorio donde tenemos: Cdigo 1. C:\Documents and Settings\Administrador\tempcurso>dir 2. El volumen de la unidad C no tiene etiqueta.

3. El nmero de serie del volumen es: A057-553B 4. 5. Directorio de C:\Documents and Settings\Administrador\tempcurso 6. . 7. 24/07/2006 12:25a <DIR> 8. 24/07/2006 12:25a <DIR> .. 9. 24/07/2006 12:25a 6 archivo.txt 10. 1 archivos 6 bytes 11. 2 dirs 401,715,161,088 bytes libres 12.

este batch: Cdigo 1. @echo off 2. echo Ruta al archivo: %~f1 3. echo Disco: %~d1 4. echo Solo ruta: %~p1 5. echo Nombre: %~n1 6. echo Extension: %~x1 7. echo Ruta Corta: %~s1 8. echo Atributos: %~a1 9. echo Fecha: %~t1 10.echo Tamao: %~z1 11.

llamandolo analiza.bat, saca el siguiente resultado: Cdigo 1. C:\Documents and Settings\Administrador\tempcurso>analiza archivo.txt 2. Ruta al archivo: C:\Documents and Settings\Administrador\tempcurso\archivo.txt 3. Disco: C: 4. Solo ruta: \Documents and Settings\Administrador\tempcurso\ 5. Nombre: archivo 6. Extension: .txt 7. Ruta Corta: C:\DOCUME~1\ADMINI~1\TEMPCU~1\archivo.txt 8. Atributos: --a-----9. Fecha: 24/07/06 12:25a 10.Tamao: 6 11.

Tambien podemos usar varias propiedades, por ejemplo, este codigo: Cdigo

1. @echo off 2. 3. echo %~anxt1 4.

saca este resultado: Cdigo 1. C:\Documents and Settings\Administrador\tempcurso>analiza archivo.txt 2. --a------ 24/07/06 12:25a archivo.txt 3.

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: Cdigo 1. @echo off 2. echo Con Comillas: %1 3. echo Sin Comillas: %~1 4.

saca este resultado: Cdigo 1. C:\Documents and Settings\Administrador\tempcurso>astring "parametro de varias letras" 2. Con Comillas: "parametro de varias letras" 3. Sin Comillas: parametro de varias letras 4.

Y por ejemplo, si queremos obtener todos los argumentos, se usa: %* es decir: Cdigo 1. @echo off

2. 3. echo Argumentos: %* 4.

al ejecutar: astring parametro de varias letras nos regresa: Cdigo 1. C:\Documents and Settings\Administrador\tempcurso>astring parametro de varias letras 2. Argumentos: parametro de varias letras

Para asignar a una variable, el valor de algo escrito por el usuario, puedes usar: set /P variable= por ejemplo: Cdigo 1. 2. 3. 4. 5. 6. @echo off echo Como te llamas? set /P miva= echo Tu te llamas %miva%

hara algo asi: Cdigo 1. 2. 3. 4. 5. C:\Documents and Settings\Administrador\tempcurso>astring &#9488;Como te llamas? Juan Tu te llamas Juan

Ahora, si por ejemplo, queremos, hacer algo como, obtener las ultimas 3 letras del nombre: Cdigo 1. @echo off

2. echo Escribe tu Nombre 3. set /P NOM= 4. echo %NOM:~-3% 5.

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: Cdigo 1. 2. 3. 4. @echo off echo Escribe una frase set /P FRA= echo %FRA:e=XXX%

esto reemplazara las letras "e" por "XXX". Para hacer calculos matematicos, se usa el modificado /A, de esta forma: Cdigo 1. 2. 3. 4. 5. 6. @echo off set /A x=1 echo %x% set /A x=x*9 echo %x%

tenemos las siguientes operaciones disponibles: Cdigo 1. () 2. * / % 3. + - agrupar - operadores aritmticos - operadores aritmticos

4. << >> - mays lgica 5. & - AND - XOR 6. ^ - OR 7. | 8. = *= /= %= += -= - asignacin 9. &= ^= |= <<= >>= 10., - separador de expresin 11.

Con este podemos usar numeros hexadecimales de la siguiente forma: Cdigo 1. 2. 3. 4. 5. @echo off set /A x=2 echo %x% set /A x=x*0xff echo %x%

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: Cdigo 1. @echo off 2. set x=pru 3. set pru=HOLA 4. 5. :: Esto imprimira el contenido de x 6. echo %x% 7. 8. ::Esto imprimira la letra x 9. echo x 10. 11.::Esto imprimira %x% 12.echo %%x%% 13. 14.::Esto imprimira el valor de x entre %% 15.echo %%%x%%%

16. 17.:: Lo mismo 18.echo %pru% 19.echo %%pru%% 20.echo %%%pru%%% 21.

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: Cdigo 1. echo <html><h1>Hola</h1></html> >index.html 2.

no funcionara, pero: Cdigo 1. echo ^<html^>^<h1^>Hola^</h1^>^</html^> >index.html 2.

dara: Cdigo 1. C:\Documents and Settings\Administrador\tempcurso>type index.html 2. <html><h1>Hola</h1></html> 3.

Algunas otras variables de entorno

Tenemos otras variables de entorno que podrian servir, ademas de las comunes de ALLUSERSPROFILE y HOMEPATH, por ejemplo: Cdigo 1. 2. 3. 4. 5. 6. @echo off echo Directorio Actual: %CD% echo Fecha: %DATE% echo Hora: %TIME% echo Numero Aleatorio: %RANDOM%

dara como resultado: Cdigo 1. C:\Documents and Settings\Administrador\tempcurso>astring 2. Directorio Actual: C:\Documents and Settings\Administrador\tempcurso 3. Fecha: Lun 24/07/2006 4. Hora: 2:13:49.33 5. Numero Aleatorio: 24523 6. 7. C:\Documents and Settings\Administrador\tempcurso>astring 8. Directorio Actual: C:\Documents and Settings\Administrador\tempcurso 9. Fecha: Lun 24/07/2006 10.Hora: 2:13:51.60 11.Numero Aleatorio: 3681 12.

Otras instrucciones muy utiles, serian POPD y PUSHD, que sirven para guardar y regresar al directorio actual, por ejemplo: Cdigo 1. 2. 3. 4. 5. 6. 7. @echo off echo %CD% PUSHD \ echo %CD% POPD echo %CD%

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: Cdigo 1. @echo off 2. echo %CD% 3. PUSHD \ 4. echo %CD% 5. PUSHD %homepath% 6. echo %CD% 7. POPD 8. echo %CD% 9. POPD 10.echo %CD% 11.

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: Cdigo 1. @echo off 2. IF "%~1"=="hola" echo hola 3.

usamos %~1 para que aunque el usuario ponga comillas, no salga error Cdigo 1. @echo off 2. IF /I "%~1"=="hola" echo hola 3.

este codigo, solo responde si dices hola CON minusculas. /I es para hacer mas estricta la comparacion. ahora, podemos usar IF en varias lineas: Cdigo 1. 2. 3. 4. 5. 6. 7. @echo off IF EXIST %~snx1 ( echo EXISTE! ) ELSE ( echo NO EXISTE )

con parentesis (). si vamos a usar comparaciones numericas, debemos usar los siguientes codigos de comparacin: Cdigo 1. 2. 3. 4. 5. 6. 7. 8. 9.

EQU - igual NEQ - no igual LSS - menor que LEQ - menor que o igual GTR - mayor que GEQ - mayor que o igual

por ejemplo: Cdigo 1. @echo off 2. echo Cual es tu edad?

3. 4. 5. 6. 7. 8. 9.

SET /P m= IF %m% GEQ 18 ( echo ERES MAYOR DE EDAD ) ELSE ( echo NO ERES MAYOR DE EDAD )

que regresa: Cdigo 1. C:\Documents and Settings\Administrador\tempcurso>acon 2. Cual es tu edad? 3. 19 4. ERES MAYOR DE EDAD 5. 6. C:\Documents and Settings\Administrador\tempcurso>acon 7. Cual es tu edad? 8. 17 9. NO ERES MAYOR DE EDAD 10.

Tambien podemos saber si una variable ya fue definida: Cdigo 1. 2. 3. 4. 5. 6. IF DEFINED var ( echo SI ) ELSE ( echo NO )

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: Cdigo

1. 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: Cdigo 1. FOR /L %%i IN (0,1,10) DO (echo %%i) imprimira 0 1 2 3 4 5 6 7 8 9 10 sinembargo, la forma mas sencilla de usar FOR, es para numerar archivos, y hacer algo con ellos.. por ejemplo: Cdigo 1. FOR %%x in (x*) DO echo %%x mostrar todos los archivos que empiezan con x. para SOLO mostrar directorios: Cdigo 1. FOR /D %%x in (m*) DO echo %%x el modificador "/D", mostrar solo los directorios, que empiesen con m. 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: Cdigo 1. 2. 3. 4. 5. &#9500;&#9472;&#9472;&#9472;adios &#9474; &#9492;&#9472;&#9472;&#9472;algo &#9474; &#9492;&#9472;&#9472;&#9472;xx &#9492;&#9472;&#9472;&#9472;hola

al ejecutar el comando: Cdigo 1. FOR /R /D %%x in (a*) DO echo %%x 2. C:\adios 3. C:\adios\algo

sinembargo, al ejecutar el comando.. Cdigo 1. 2. 3. 4. 5. 6. 7. 8. FOR /R %%x in (*x*) DO echo %%x C:\ax.txt C:\adios\sx.txt C:\adios\wwx.txt C:\adios\algo\kkx.txt C:\adios\algo\xx\xx.txt C:\hola\ax.txt C:\hola\rx.txt

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: Cdigo 1. 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: Cdigo 1. 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: Cdigo 1. 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: Cdigo 1. 2. 3. 4. 5. 6. @echo off call:funcion 1 2 3 call:funcion %* goto:EOF :funcion echo Estoy en: %~nx0-^>%0 %*

al ser llamado, por ejemplo en:

Cdigo 1. C:\>ejemplo 2. Estoy en: ejemplo.bat->:funcion 1 2 3 3. Estoy en: ejemplo.bat->:funcion el primero muestra los parametros enviados por el batch (1 2 3), y el segundo los parametros enviados al programa. en este otro ejemplo: Cdigo 1. C:\>ejemplo HOLA MUNDO 2. Estoy en: ejemplo.bat->:funcion 1 2 3 3. Estoy en: ejemplo.bat->:funcion HOLA MUNDO la funcion obtiene tambien los argumentos del programa. 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: Cdigo 1. @echo off&call:main&goto:EOF 2. 3. :suma 4. set /A res=%1 + %2 5. echo %res% 6. goto:EOF 7. 8. :resta 9. set /A res=%1 - %2 10.echo %res% 11.goto:EOF 12. 13.:multiplica 14.set /A res=%1 * %2 15.echo %res% 16.goto:EOF 17. 18.:main 19.set /P arg=Escribe 2 numeros separados por un espacio 20.echo %arg% 21.echo su suma es: 22.call:suma %arg% 23. 24.echo su resta es:

25.call:resta %arg% 26. 27.echo su producto es: 28.call:multiplica %arg% 29. 30.goto:EOF 31.

como podemos ver goto:EOF se usa para regresar al orden de comandos. el resultado es algo asi: Cdigo 1. C:\>operaciones 2. Escribe 2 numeros separados por un espacio 6 2 3. 6 2 4. su suma es: 5. 8 6. su resta es: 7. 4 8. su producto es: 9. 12 10.

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: Cdigo 1. 2. 3. 4. 5. 6. @echo off&call:%*&goto:EOF :funcion1 ... :funcion2 ...

por ejemplo:

--inclu.bat-Cdigo 1. @echo off&call:%*&goto:EOF 2. 3. :cabeza 4. echo ############### 5. echo # Hecho por: # 6. echo # sirdarckcat # 7. echo ############### 8. goto:EOF 9. 10.:uso 11.echo uso: 12.echo %~nx0 Nombre 13.goto:EOF 14. 15.:nombre 16.echo Hola %* 17.goto:EOF 18.

--inicio.bat-Cdigo 1. 2. 3. 4. 5. 6. 7. 8. @echo off if "%~1"=="" ( inclu.bat cabeza inclu.bat uso ) else ( inclu.bat nombre %~1 )

esto daria este resultado: Cdigo 1. 2. 3. 4. 5. 6. 7. C:\>inicio ############### # Hecho por: # # sirdarckcat # ############### uso: inclu.bat Nombre

8. 9. C:\>inicio sirdarckcat 10.Hola sirdarckcat 11. 12.C:\> 13.

Misc Algunos filtros y comandos interesantes:

comando | more

muestra el resultado del comando de forma paginada

comando | sort

muestra el resultado del comando de forma ordenada

TITLE "algo"

cambia el titulo de la ventana de CMD

SUBST ruta/a/alguna/carpeta [letra_unidad]

asgina a letra_unidad la ruta de acceso

FIND "cadena"

busca cierta cadena en un archivo (se puede usar como filtro), con el modificador /v encuentra solo las que NO tienen la linea especificada. (para mas info, escribe en CMD: FIND /?)

FINDSTR

extension de FIND, acepta expresiones regulares, y busqueda general (lo mas parecido que DOS tiene a grep), descripcin detallada: Cdigo 1. Busca cadenas en los archivos. 2. 3. FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/P] 4. [/F:archivo] 5. [/C:cadena] [/G:archivo] [/D:lista de directorios] [/A:atributos de color] 6. [cadenas] [[unidad:][ruta]nombredearchivo[ ...]] 7. 8. /B Hace coincidir los modelos si estn al principio de la lnea.

9. /E Hace coincidir los modelos si estn al final de la lnea. 10. /L Literalmente utiliza cadenas de bsqueda. 11. /R Utiliza cadenas sde bsqueda como expresiones regulares. 12. /S Busca archivos que coinciden en el directorio actual y en todos 13. los subdirectorios. 14. /I Especifica que la bsqueda no distingue maysculas de minsculas. 15. /X Imprime lneas que coinciden con exactitud. 16. /V Slo imprime lneas que no contienen una correspondencia. 17. /N Imprime el nmero de la lnea antes de la lnea que coincide. 18. /M Slo imprime el nombre de archivo si el archivo contiene una 19. correspondencia. 20. /O Imprime un carcter de desplazamiento antes de las lneas que 21. coinciden. 22. /P Omite archivos con caracteres que no son imprimibles 23. /A:attr Especifica atributos de color con dos dgitos hexadecimales. Ver 24. "color /?" 25. /F:archivo Lee la lista de archivos desde el archivo especificado 26. (/ significa consola). 27. /C:cadena Utiliza una cadena especificada como una bsqueda de cadena 28. literal. 29. /G:archivo Coje la bsqueda de archivos desde el archivo especificado (/ significa consola). 30. 31. /D:dir Busca un signo de punto y coma de la lista delimitada de 32. directorios 33. cadenas Texto que se debe buscar. 34. [unidad:][ruta]nombredearchivo 35. Especifica un archivo o archivos que buscar. 36. 37.Utiliza espacios para separar mltiples cadenas de bsqueda a no ser que 38.el argumento lleve un prefijo con /C. Por ejemplo, 'FINDSTR "qu tal" x.y' 39.busca "qu" o "tal" en el archivo x.y. 'FINDSTR /C:"qu tal" x.y' busca 40."qu tal" en el archivo x.y. 41. 42.Expresin regular de referencia rpida: 43. . Comodn: cualquier carcter 44. * Repetir: cero o ms ocurrencias de un carcter previo o de clase 45. ^ Posicin de lnea: comienzo de la lnea 46. $ Posicin de lnea: fin de lnea 47. [clase] Clase de carcter: cualquier carcter en la serie 48. [^class] Clase inversa: cualquier carcter que no est en la serie 49. [x-y] Intervalo: cualquier carcter que est dentro del intervalo 50. especificado 51. \x Escape: uso literal de un metacarcter x 52. \<xyz Posicin de palabra: principio de palabra 53. xyz\> Posicin de palabra: fin de palabra 54. 55.Para obtener una informacin ms completa sobre expresiones regulares de 56.FINDSTR referirse al Comando de referencia Command en lnea. 57. 58.

start "titulo ventana nueva" [OPCIONES] comando argumentos

START tiene mas opciones de las que son usadas comunmente. "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 aplicacin 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 TITLE cadena Fija el ttulo de la ventana en la ventana del smbolo del sistema.

PROMPT [texto] Cambia el smbolo del sistema de cmd.exe. texto Especifica un nuevo smbolo del sistema. En el smbolo del sistema se pueden escribir caracteres normales y los siguientes cdigos especiales: $A $B $C $D $E $F $G $H $L $N $P $Q $S $T $V $_ $$ & (Smbolo de unin) | (barra vertical) ( (Parntesis izquierdo) Fecha actual Cdigo de escape (cdigo ASCII 27) ) (Parntesis derecho) > (signo mayor que) Retroceso (elimina el carcter previo) < (signo menor que) Unidad actual Unidad y ruta de acceso actual = (signo igual) (espacio) Hora actual Versin de Windows XP Retorno de carro y alimentacin de lnea $ (signo del dlar)

Si las Extensiones de comando estn habilitadas, el comando PROMPT admite los siguientes caracteres de formato adicionales: $+ cero o ms caracteres de signo "ms" (+) en funcin de la profundidad del directorio de pila PUSHD, un carcter por cada nivel insertado. $M Muestra el nombre remoto asociado a la letra de unidad actual o la cadena vaca si la unidad actual no es una unidad de red. COLOR n1n2 Configura los colores predeterminados de primer y segundo planode la consola. Especificados con dos dgitos hex: el primero corresponde al fondo; el segundo al texto. 0 = Negro 8 = Gris 1 = Azul 9 = Azul claro 2 = Verde A = Verde claro 3 = Aguamarina B = Aguamarina claro 4 = Rojo C = Rojo claro 5 = Prpura D = Prpura claro 6 = Amarillo E = Amarillo claro 7 = Blanco F = Blanco brillante Si no se indican argumentos, este comando restaura el color que tenacuando se inici CMD.EXE. Este valor proviene de la ventanade la consola, el modificador de lnea de comando o el valor del registro DefaultColor.

El comando COLOR configura ERRORLEVEL a 1 si se realiza un intento de ejecutar el comando COLOR con el mismo color de primer y segundo plano BREAK: Activa o desactiva Ctrl+C extendido en DOS Est presente para que haya compatibilidad con sistemas DOS, pero no tiene efecto en Windows XP. Si se activan las extensiones de comando y se ejecuta en la plataforma deWindows XP, el comando BREAK introducir un punto de ruptura dentro del cdigo, si est siendo depurado por un depurador. CHCP [nnn] nnn Especifica una pgina de cdigos. Escriba CHCP sin parmetro para mostrar el nmero de la tabla de cdigos activa. GRAFTABL [xxx] Permite que Windows muestre caracteres extendidos en modo grfico. Similar a chcp xxx Especifica el nmero de la tabla de cdigos. /STATUS Muestra la tabla de cdigos seleccionada para usar con GRAFTABL. SET [variable=[cadena]] Muestra, establece o quita las variables de entorno de cmd.exe.

variable Especifica el nombre de la variable de entorno. cadena Especifica una serie de caracteres que se asignar a la variable. Escriba SET sin parmetros para ver las variables de entorno actuales. Si las extensiones de comando estn habilitadas, SET cambia as: "Cuando se llama al comando SET solamente con un nombre de variable, sin signo de igual ni valor, se mostrarn los valores de todas las variables cuyos prefijos coincidan con el nombre especificado como parmetro para el comando SET. Por ejemplo: SET P mostrar todas las variables que empiecen con la letra 'P'

El comando SET establecer ERRORLEVEL en 1 si no se encuentra el nombre de la variable en el entorno actual. El comando SET no permitir que un signo de igual sea parte de una variable. Se han agregado dos modificadores nuevos al comando SET: SET /A expression SET /P variable=[promptString] El modificador /A especifica que la cadena a la derecha del signo de iguales una expresin numrica que es evaluada. El evaluador de expresiones esbastante simple y es compatible con las siguientes operaciones, en orden de precedencia decreciente: () !~- agrupar - operadores unarios

*/% - operadores aritmticos +- operadores aritmticos << >> - desplazamiento lgico & - bit a bit y ^ - bit a bit exclusivo o | - bit a bit = *= /= %= += -= - asignacin &= ^= |= <<= >>= , - separador de expresin Si se utiliza cualquiera de los operadores lgicos o de mdulo, ser necesario escribir la cadena entre comillas. Cualquier cadena de la expresin que no sea numrica, se tratar como variable de entorno cuyo valor se convertir a tipo numrico antes de utilizarse. Si se especifica una variable que no est definida en el entorno actual, se utilizar el valor cero. Esto permite hacer operaciones aritmticas con los valores de variables de entorno evitando el escribir todos estos signos % para obtener sus valores. Si se ejecuta el comando SET /A desde la lnea del comando fuera de la secuencia decomandos, entonces se mostrar el valor final de la expresin. El operador de asignacin requiere un nombre de variable de entorno a la izquierda del operador de asignacin. Los valores numricos son nmeros decimales, a no ser que lleven el prefijo 0x delante para los nmeros hexadecimales, y 0 para los nmeros octales. De esta manera 0x12 es lo mismo que 18, y lo mismo que 022. Nota: la notacin octal puede ser confusa: 08 y 09 no son nmeros vlidos porque 8 y 9 no son dgitos octales vlidos. El modificador /P permite establecer el valor de una variable para una lneade entrada escrita por el usuario. Muestra la cadena del smbolo del sistema antes de leer la lnea de entrada. La cadena del smbolo del sistema puede estar vaca. La sustitucin de variables de entorno ha sido mejorada as: %PATH:str1=str2% expandir la variable de entorno PATH, sustituyendo cada repeticin de "str1" en el resultado expandido con "str2". "str2" puede ser la cadena vaca para borrar efectivamente todas las repeticiones de "str1" de la salida expandida. "str1" puede empezar con un asterisco, en cuyo caso,coincidir con lo contenido en la salida expandida desde su inicio, hasta la primera aparicin del fragmento de str1 que queda. Tambin puede especificar subcadenas para una expansin. %PATH:~10,5% expandir la variable de entorno PATH, y usar slo los 5 caracteres a partir del dcimo primer carcter (desplazamiento 10) del resultado expandido. Si la longitud no se especifica, se utilizar el resto del valor de la variable. Si algn nmero (desplazamiento o longitud) es negativo, entonces el nmero usado es la longitud del valor de la variable de entorno aadido al desplazamiento o longitud especificados.

%PATH:~-10% extraer los 10 caracteres de la variable PATH. %PATH:~0,-2% extraer todo menos los 2 ltimos caracteres de la variable PATH. Finalmente, se ha aadido compatibilidad para la expansin de la variable retardada. Este soporte est siempre deshabilitado de forma predeterminada, pero puede habilitarse o deshabilitarse a travs del modificador de lnea de comandos /V a CMD.EXE. Ver CMD /? La expansin de la variable de entorno es til para tratar con las limitaciones de la expansin actual, las cuales ocurren cuando una lnea de texto es leda, y no cuando se ejecuta. El siguiente ejemplo demuestra el problema con la expansin de la variable inmediata: set VAR=antes if "%VAR%" == "antes" ( set VAR=despus if "%VAR%" == "despus" @echo Si esto se puede ver, entonces significa que funcion ) dado que %VAR% se sustituye al mismo tiempo en ambas instrucciones IF cuando se lee la primera instruccin IF, pues incluye lgicamente al cuerpo del IF, el cual es una instruccin compuesta. De esta manera, IF, dentro de la instruccin compuesta est realmente comparando "antes" con "despus" lo cul nunca ser igual. De un modo parecido, el siguiente ejemplo no funcionar como se espera: set LIST= for %i in (*) do set LIST=%LIST% %i echo %LIST% en esto NO generar una lista de archivos en el directorio actual, pero en su lugar establecer la variable LIST en el ltimo archivo encontrado. De nuevo, esto ocurre porque %LIST% es expandido slo una vez cuando la opcin FOR es leda, y en ese momento la variable LIST variable est vaca. As el ciclo actual FOR que se est ejecutando es: for %i in (*) do set LIST= %i el cual slo mantiene el valor LIST hasta el ltimo archivo encontrado. La expansin de la variable de entorno retardada permite utilizar un carcter diferente (el signo de exclamacin para expandir variables en tiempo de ejecucin. Si la expansin de la variable retardada est habilitada, los ejemplos se pueden escribir de la siguiente manera para que funcionen como es necesario: set VAR=antes

if "%VAR%" == "antes" ( set VAR=despus if "!VAR!" == "despus" @echo Si esto se puede ver, entonces significa que funcion ) set LIST= for %i en (*) do set LIST=!LIST! %i echo %LIST% Si las extensiones de comando estn habilitadas, hay varias variables dinmicas de entorno que pueden ser expandidas pero que no se muestran en la lista de variables que muestra ESTABLECER. Estos valores de variable se calculan dinmicamente cada vez que el valor de la variable se expande. Si el usuario define una variable explcitamente con uno de estos nombres, entonces esa definicin suplantar la variable dinmica abajo descrita: %CD% - se expande a la cadena del directorio actual . %DATE% - se expande a la fecha actual usando el mismo formato que el comando DATE. %TIME% - se expande a la hora actual usando el mismo formato que el comando TIME. %RANDOM% - se expande a un nmero decimal aleatorio entre 0 y 32767. %ERRORLEVEL% - se expande al valor de NIVEL DE ERROR actual %CMDEXTVERSION% - se expande al nmero actual de versin de las extensiones del comando del procesador. %CMDCMDLINE% - se expande a la lnea de comando original que invoc el Procesador de comandos.

CMD [/A | /U] [/Q] [/D] [/E:ON | /E:OFF] [/F:ON | /F:OFF] [/V:ON | /V:OFF] [[/S] [/C | /K] cadena] Inicia una nueva instancia del intrprete de comandos de Windows

/C Ejecuta el comando especificado en cadena y luego finaliza /K Ejecuta el comando especificado en cadena pero sigue activo /S Modifica el tratamiento de cadena despus de /C o /K (consultar

ms abajo) /Q Deshabilita el eco /D Deshabilita le ejecucin de los comandos de AutoRun del registro (consultar ms abajo) /A Utiliza ANSI para la salida de comandos internos hacia una canalizacin o un archivo /U Utiliza UNICODE para la salida de comandos internos hacia una canalizacin o un archivo /T: fg Configura los colores de primer y segundo plano (para obtener ms informacin, consulte COLOR /?) /E:ON Habilita las extensiones de comando (consultar ms abajo) /E:OFF Deshabilita las extensiones de comando (consultar ms abajo) /F: ON Habilita los caracteres de terminacin de los nombres de archivos y directorios (consultar ms abajo) /F: OFF Deshabilita los caracteres de terminacin de los nombres de archivos y directorios (consultar ms abajo) /V: ON Habilita la extensin de variables de entorno retardada usando ! como delimitador. Por ejemplo, /V: ON permitir que !var! extienda la variable var en tiempo de ejecucin. La sintaxis var extiende variables en tiempo de entrada, lo cual es diferente cuando se est dentro de un bucle FOR. /V: OFF Deshabilita la extensin de variables de entorno retardada. Tenga en cuenta que los comandos mltiples separados por el separador de comandos '&&' se aceptan como cadena si estn entre comillas. Por razones de compatibilidad, /X equivale a /E:ON, /Y equivale a /E:OFF y /R equivale a /C. Se omitir cualquier otro tipo de modificador. Si se especifica /C o /K, lo que viene despus de la lnea de comando se ejecuta como lnea de comando, siguiendo la lgica siguiente para procesar caracteres comillas ("): 1. Se conservan las comillas del comando si se cumplen todas las condiciones siguientes:

- no aparece el modificador /S - hay exactamente dos caracteres comillas - no hay caracteres especiales entre ambas comillas, siendo los caracteres especiales: &<>()@^| - hay uno o ms espacios en blanco entre ambas comillas - la cadena entre ambas comillas es el nombre de un archivo ejecutable 2. En caso contrario, el comportamiento clsico es comprobar si el primer carcter es una comilla y de ser as, quitar sta y tambin la ltima comilla de la lnea de comandos, conservando el texto que venga despus de sta Si no se especific /D en la lnea de comandos, cuando CMD.EXE se inicie, buscar las variables del Registro REG_SZ/REG_EXPAND_SZ, y si alguna de ellas est presente, se ejecutarn en primer lugar. HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\AutoRun y (o) HKEY_CURRENT_USER\Software\Microsoft\Command Processor\AutoRun Las extensiones de comando estn habilitadas de forma predeterminada. Puede deshabilitar las extensiones de una invocacin particular usando el modificador /E:OFF. Puede habilitar o deshabilitar las extensiones de todas las invocaciones de CMD.EXE en una mquina o en una sesin de usuario estableciendo con REGEDT32.EXE los dos valores de REG_DWORD del registro siguientes: HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\EnableExtensions y (o)

HKEY_CURRENT_USER\Software\Microsoft\Command Processor\EnableExtensions a 0x1 o 0x0. La configuracin especfica del usuario tiene preferencia respecto a la del equipo. Los modificadores de la lnea de comando tienen prioridad sobre la configuracin del registro Las extensiones de comando implican cambios y ampliaciones en los siguientes comandos: DEL o ERASE COLOR CD o CHDIR MD o MKDIR PROMPT PUSHD POPD SET SETLOCAL ENDLOCAL IF FOR CALL SHIFT GOTO START (tambin incluye cambios en la invocacin de comandos externos) ASSOC FTYPE Para obtener detalles especficos, escriba nombredelcomando /?. La expansin de variables de entorno retardada NO est habilitada de manera predeterminada. Puede habilitar o deshabilitar la expansin de variables de entorno retardada para una llamada particular de CMD.EXE con los modificadores /V:ON o /V:OFF. Puede habilitar o deshabilitar la terminacin para todas las llamadas de CMD.EXE en una sesin de inicio de usuario o equipo estableciendo con REGEDT32.EXE los dos valores de REG_DWORD del registro siguientes: HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\DelayedExpansion y (o)

HKEY_CURRENT_USER\Software\Microsoft\Command Processor\DelayedExpansion a 0x1 0x0. La configuracin especfica del usuario tiene prioridad sobre la configuracin del equipo. Los modificadores de la lnea de comandos tienen prioridad sobre la configuracin del Registro. Si la expansin de variables de entorno retardada est habilitada, se puede utilizar el carcter de exclamacin para sustituir el valor de la variable de entorno en tiempo de ejecucin. La terminacin de los nombres de Archivo y Directorio NO est habilitada de forma predeterminada. Se puede habilitar o deshabilitar la terminacin de un nombre de archivo para una invocacin particular de CMD.EXE con el modificador /F:ON o /F:OFF. Se puede habilitar o deshabilitar la terminacin para todas las invocaciones de CMD.EXE en una mquina y/o el inicio de sesin del usuario estableciendo cualquiera de los dos siguientes valores REG_DWORD en el registro usando REGEDT32.EXE: HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\CompletionChar HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\PathCompletionChar y/o HKEY_CURRENT_USER\Software\Microsoft\Command Processor\CompletionChar HKEY_CURRENT_USER\Software\Microsoft\Command Processor\PathCompletionChar con el valor hex de un carcter de control para utilizarlo en una funcin particular (por ej. 0x4 es Ctrl-D y 0x6 es Ctrl-F). La configuracin de usuario especfica tiene precedencia sobre la configuracin de la mquina.Los modificadores de la lnea de comandos tiene precedencia sobre laconfiguracin del registro. Si la terminacin est habilitada con el modificador /F:ON, los dos caracteres de control usados son Ctrl-D para la terminacin del nombre del directorio y

Ctrl-F para la terminacin del nombre de archivo. Para deshabilitar una terminacin de carcter determinada en el registro, utilice el valor del espacio en blanco (0x20), ya que no es un carcter de control vlido. Se invoca la terminacin cuando se escriben cualquiera de los dos caracteres de control. La funcin de terminacin, desplaza el contenido de la ruta de acceso hacia la izquierda del cursor, le anexa un carcter comodn si no hay ninguno todava presente y genera una lista de rutas de acceso que coincidan. Despus muestra la primera ruta de acceso que coincida. Si no coincide ninguna ruta de acceso, emite un sonido y no muestra nada. Posteriormente, el presionar repetidamente el mismo carcter de control se desplazar a travs de la lista de las rutas de acceso que coinciden. Si presiona la tecla Mays con el carcter de control se mover a travs de la lista hacia atrs. Si se edita la lnea de cualquier manera y presiona el carcter de control de nuevo, la lista de ruta de acceso guardada es anulada y se generar una nueva. Ocurrir lo mismo si pasa de una terminacin de nombre de archivo a uno de directorio. La nica diferencia entre los dos caracteres de control es que la terminacin del carcter del archivo coincide con ambos nombres del archivo y del directorio, mientras que la terminacin del carcter del directorio slo coincide con los nombres del directorio. Si la terminacin del archivo es usada en cualquier construccin de comandos de directorio (CD, MD o RD) entonces se asume la terminacin del directorio. El cdigo de terminacin trata adecuadamente con nombres de archivo que contienen espacios u otros caracteres especiales colocando comillas entre la ruta de acceso que coincide. Tambin, si se hace una copia de seguridad, se llamar a una

terminacin dentro de la misma lnea, el texto a la derecha del cursor que fue llamado en el punto de la terminacin es descartado. Los caracteres especiales que requieren comillas son: &()[]{}^=;!'+,`~

IF ERRORLEVEL Cada orden externa de ms-dos genera un cdigo de salida a su trmino indicando si pudo realizarse satisfactoriamente. Generalmente un cdigo de salida 0 indica que no hubo ningn problema y un cdigo de salida superior hace referencia a diferentes errores. Muchos ficheros por lotes necesitan saber si la orden anterior cumpli su cometido correctamente: para ello utilizan la orden If errorlevel. Es muy importante recordar que la orden se ejecutar si el cdigo de salida es igual o superior al especificado detrs de ERRORLEVEL. A modo de ejemplo tenemos a continuacin los cdigos de salida de Xcopy:

Cdigo Significado 0 Los ficheros fueron copiados sin error. 1 No se encontraron ficheros para copiar. 2 El usuario presion Ctrl+Pausa para suspender el proceso de Xcopy. 4 Ocurri un error de inicio. No hay suficiente memoria o espacio en el disco, se introdujo un nombre de unidad no vlida o se utiliz una sintaxis incorrecta en la lnea de rdenes. 5 Ocurri un error de escritura de disco.

Vamos a crear un fichero por lotes para copiar los ficheros de la unidad A: a la B: e informe del resultado de la copia. @echo off rem Programa: COPIA-AB.BAT

xcopy a:\ b:\ if errorlevel 1 goto Error if errorlevel 0 echo La copia fue correcta! goto Final :Error echo Se produjo un error durante la copia :Final En primer lugar, Xcopy intenta realizar la copia de ficheros y devolver un cdigo de salida. Si se ha producido algn error el cdigo ser 1 o superior y entonces, el programa se desva hasta la etiqueta :Error, muestra el mensaje y finaliza. Si la copia fue satisfactoria, el cdigo de salida es 0. La segunda lnea If mostrar el mensaje de xito, saltando despus a la etiqueta :Final y como no hay ms lneas, termina el proceso. En muchas ocasiones puede ser fuente de complicaciones que If errorlevel nmero se cumpla si el nmero es igual o mayor. Para cumplirse exclusivamente si el cdigo de salida es 5 -por ejemplopodemos usar lo siguiente: if errorlevel 5 if not errorlevel 6 dir Esta compleja lnea se traduce as: Si el cdigo de salida es 5 o superior pero inferior a 6 ejecutar Dir, es decir, si el cdigo es 5 ejecutar Dir. La orden CHOICE Permite escoger una opcin entre varias y, dependiendo de la opcin elegida, devuelve un cdigo de salida. Su sintaxis es: CHOICE [mensaje] [/C:opciones] [/N] [/S] [/T:opcin,segundos]

/C:opciones Especifica las opciones posibles. Si el usuario pulsa la primera de las opciones, Choice devolver un cdigo de salida 1; si pulsa la segunda opcin, Choice devuelve el cdigo 2 y as sucesivamente. Si no se especifica este parmetro se asumen las opciones por defecto (SN). /N No muestra las opciones admitidas detrs del mensaje. /S Hace distincin entre maysculas y minsculas. Si no se especifica este parmetro se toman como la misma opcin. /T:opcin,segs Toma la opcin indicada si no se pulsa ninguna otra tecla en los segundos especificados. mensaje Contiene el mensaje mostrado al usuario pidiendo que introduzca una de las opciones admitidas.

El programa DEMO.BAT podemos mejorarlo sensiblemente si cambiamos las rdenes Pause por rdenes Choice. @echo off rem Programa: DEMOB.BAT echo ******************************************** echo ** Este programa copia todos los ficheros ** echo ** de la unidad A: al directorio actual ** echo ******************************************** choice Desea continuar? if errorlevel 2 goto Final :Proceso copy a:\ . choice Para continuar con otro disquete pulse C y para finalizar, F /C:FC if errorlevel 2 goto proceso :Final En la primera orden Choice se toman las opciones por defecto S y N. `S' corresponde a un cdigo de salida 1 y `N' a un cdigo 2. En la segunda orden Choice se toman las opciones F y C. `F' corresponde a un cdigo 1 y `C' a un cdigo 2. Con la orden Choice y de una forma muy sencilla podemos crear mens con diferentes opciones: @echo off rem Programa: UTIL.BAT :Menu cls echo UTILIDADES DE MS-DOS echo -------------------echo. echo A. Anti-Virus echo B. Backup echo D. Defragmentar echo E. Editor echo S. Salir echo. choice Qu utilidad desea comenzar? /c:abdes /n /t:s,15 if errorlevel 5 goto Salir if errorlevel 4 goto Editor if errorlevel 3 goto Defrag if errorlevel 2 goto Backup if errorlevel 1 goto Anti if errorlevel 0 goto Menu :Anti MSAV goto Menu

:Backup MSBACKUP goto Menu :Defrag DEFRAG goto Menu :Editor EDIT goto Menu :Salir echo. Observe la orden Choice: el modificador /C indica las opciones admitidas. Si se pulsa la `A' se generar un cdigo de salida 1 y as sucesivamente hasta la `S' que corresponde a un cdigo 5. Gracias al modificador /N Choice no muestra las teclas admitidas detrs del mensaje. El modificador /T toma como opcin por defecto la `S' si pasan 15 segundos sin pulsar ninguna tecla. Observe, asimismo, cmo se ha comenzado en las lneas If por el errorlevel ms alto: as se evitan conflictos. El cdigo de salida 0 se obtiene si el usuario responde con Ctrl+Pausa al mensaje de Choice Ejemplo de un proceso batch Lo que voy a realizar aqui, es un proceso batch que os permita entender mejor la teoria que explique en la entrada de "Curso basico de MS-DOS". Este proceso lo que hace es crear un menu principal que contiene los siguientes puntos:

Aplicaciones Utilidades Fin

Dentro de estos hay submenus que llevan a ordenes como la de copiar un archivo etc... Este es el proceso: @echo off

echo MENU PRINCIPAL echo 1-Aplicaciones echo 2-Utilidades echo 3-Fin echo -------------------------------------choice /c 123 /m "Elija una opcion" @if errorlevel 3 goto :fin @if errorlevel 2 goto :utilidades @if errorlevel 1 goto :aplicaciones

:aplicaciones cls echo A.-Memoria echo B.-Fecha echo C.-Menu principal choice /c ABC /m "Elija una opcion" cls @if errorlevel 3 Examen.bat @if errorlevel 2 goto :fecha @if errorlevel 1 goto :memoria :memoria cls ver pause goto :menu :fecha cls date 01-01-2011 date /t pause goto :menu :utilidades cls echo A.-util1 echo B.-util2 echo C.-copiar echo D.-Menu principal choice /c ABCD /m "Elija una opcion" @if errorlevel 4 goto :menu @if errorlevel 3 goto :copiar @if errorlevel 2 goto :util2 @if errorlevel 1 goto :util1 :util1 cls dir c:\utilidades /a:a pause goto :menu :util2

cls dir c:\ "asi1.*" pause goto :menu :copiar cls copy c:\prueba.txt c:\asi1\texto1.txt pause goto :menu :fin exit FINAL DEL PROCESO

Vous aimerez peut-être aussi