Tutorial de Programacion Batch (Final)
Tutorial de Programacion Batch (Final)
https://sites.google.com/site/nikos3194rfcindex/home/batch
Dedicacin
Este tutorial est dedicado a Gary Kildall, el autor de CP/M, el verdadero creador de DOS y el hombre que pudo
haber sido ms millonario que Bill Gates.
Todos los das perdemos una docena de genios en el anonimato. Y se van. Y nadie sabe de ellos, de su historia, de
su peripecia, de lo que han hecho, de sus angustias, de sus alegras. Pero al menos una docena de genios se van
todos los das sin que sepamos de ellos.
Juan Antonio Cebrin
Agradecimientos
Este tutorial fue posible gracias a la colaboracin (directa o indirecta) de los aportes de las siguientes personas:
Simon Sheppard, Leo Gutierres (RockoX), sirdarckcat, Soplo, HolyKnight, PyXOLo, KJ, P.Hoffman, Angel Segado,
Casimiro Zaragoza y muchas otras personas que compartieron sus aportes en Internet.
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
INDICE DE CONTENIDO
0.0 Prlogo Pg. 3
0.1 Como usar este tutorial Pg. 4
EOF Pg. 60
F de erratas:
Ciertos apartados como el 6.0 de Subrutinas (que incluye los 6.1, 6.2, 6.3) se encuentran incompletos.
(Este es un proyecto que sera ms largo pero que qued inconcluso por adversidades del autor).
2
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
Prlogo
En agosto de 2012 por diversas razones, entre ellas el hecho de querer compartir todo mi conocimiento
relacionado con la programacin Batch, me haba decidido lanzar el ambicioso proyecto de hacer el tutorial con la
mayor recopilacin de informacin que pude hallar hasta el momento de la manera que me hubiera gustado tener
en mis inicios en este lenguaje y por lo tanto en la programacin en general.
Personalmente Batch fue el lenguaje de programacin que ms he utilizado en Windows para manipular, mantener
y respaldar archivos de manera rpida, adems de haberme permitido tambin manipular muchas opciones del
sistema mediante funciones bsicas que incluso pude interpretar desde otros lenguajes como PowerShell, Python,
Perl, VisualBasic, Delphi y C .
Solo quiero aclarar que quise hacer este tutorial ms halla de Batch, de manera que se puedan abarcar otros
lenguajes ms avanzados como Bash (el verdadero shell en que se bas Batch) y Python, un lenguaje de
programacin que ha superado por lejos a Visual Basic y otros lenguajes propietarios monoplataforma como
PowerShell. De esta manera espero que los lectores puedan migrar a otros lenguajes teniendo como primera
nocin nuestro primer conocimiento de Batch.
3
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
Recomiendo no leer las funciones de los comandos de memoria, ya que con una lectura al vuelo es posible
comprender el funcionamiento de cada comando para interpretar los ejemplos prcticos. Adems todo
programador siempre tiene que tener un texto de referencia consigo antes de programar una aplicacin, estos
machetes o chuletas son denominados Cheat Sheets o Quick References (se encuentran con Google), y son
utilizados por los programadores que trabajan en distintos lenguajes para evitar equivocaciones. Con esto quiero
decir que lean las funciones de los comandos solo cuando quieran utilizarlos, de lo contrario se podran frustrar
prematuramente.
Una vez que adquieran experiencia, vern que es posible interpretar los comandos de forma lgica y cuando
tengan una idea con solo consultar la ayuda podrn resolver cualquier problema ;)
4
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
Cualquier comando de instruccin DOS o programa interpretable en la shell puede ser utilizado en un archivo
batch. Hay varias maneras de buscar funciones para programar de forma avanzada en este tipo de archivos:
Para ejecutar un programa Batch tenemos que guardar el archivo con extensin .bat o .cmd. Si lo guardamos con
.cmd solo funcionar en las versiones basadas en NT (XP/Vista/7/8) y si lo guardamos con extensin .bat funcionar
en todos los Windows, emuladores y sistemas compatibles (como Wine, DosBox, DOSEmu, FreeDOS, OS/2 y
ReactOS). As que por una razn de compatibilidad elegiremos usar la extensin .bat :)
Para ver los principales comandos disponibles en Batch solo hay que ir a Inicio Ejecutar (o la tecla de
Windows+R) y escribir cmd (4), luego tipear HELP seguido de enter en la consola, de esta manera obtendremos
un ndice de los comandos junto a una breve descripcin. Si se tipea HELP seguido de un comando especifico
aparecern todos sus parmetros y instrucciones detalladas, por ejemplo: HELP cmd es lo mismo que cmd /?
(luego veremos esto con ms profundidad).
1
Los lenguajes de scripting se caracterizan por ser interpretados. En nuestro caso Batch es interpretado por el
cmd, as como Bash es interpretado por el shell de Linux que a diferencia de windows se encuentra nucleado en
el propio sistema operativo. Python y VisualBasic son tambin lenguajes de alto nivel interpretados pero que se
pueden compilar como en los lenguajes de bajo nivel como C++ o Delphi (entindase que bajo nivel hace
referencia a los lenguajes cercanos al binario mientras que los de alto nivel son ms amenos y superficiales al
sistema). Ver ms en Wikipedia [Fuente 1] [Fuente 2].
2
La consola de Windows se llama cmd (abreviatura de command), es el comando principal del sistema (aunque
ya no constituye su plataforma) y se conoce tambin como Smbolo de sistema o Shell de windows. Antiguamen-
te llamada command.com, fue creada por Tim Paterson como un plagio del sistema CP/M que le haba robado a
Gary Kildall, y que luego compraron Bill Gates y Paul Allen por una baja suma de dinero copindole casi todas las
funciones del shell de UNIX para hacer el sistema operativo monousuario Ms-Dos durante los 80, el cual
convirtieron en Windows copiando las funciones grficas a la Apple de Steve Jobs y as a ido copiando y
evolucionando hasta ahora sin perder mucho su comportamiento original. [Fuente 1] [Fuente 2] [Fuente 3].
3
Porque se usa .bat? Es porque tanto en Ms-Dos como en UNIX las extensiones de los archivos tenan original-
mente un mximo de tres caracteres (conocido como el formato 8.3) y se usan las tres primeras letras de batch.
4
Es posible abrir el cmd de diferentes maneras desde el men inicio pero por una razn de compatibilidad entre
las distintas versiones de windows elijo recurrir a la opcin del cuadro de dialogo Ejecutar (Run).
5
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
Primeros pasos
Por convencin, el primer programa que vamos a realizar ser un hola mundo ;P
Primero hay que abrir un editor de texto como el Bloc de notas de windows (notepad.exe), o el Notepad++ (muy
bueno), siempre y cuando sea un editor de texto llano (nunca usar el Word, Wordpad Writer porque estos
programas aaden instrucciones ocultas llamadas formato de texto y que hacen que no sirvan para programar).
Personalmente recomiendo el Notepad++ que se puede encontrar tanto en versin instalable como portable, la
ventaja que tiene es que destaca la sintaxis de lo que se escribe permitiendo ms facilidad a la hora de programar
(y as como el Notepad++ existen muchos otros editores ms).
Una vez abierto nuestro editor preferido, habr que escribir lo siguiente:
@echo off
title hola
echo HOLA MUNDO!
echo.
pause
exit
Analicemos lo bsico:
Primero que nada, siempre que hagamos un programa en batch se iniciara con: @echo off
Este comando, deshabilita el echo para que no muestre una repeticin en la consola de los comandos usados en
el archivo bat, sino saldra esto:
El arroba que tiene adelante acta para que el comando se ejecute de manera anticipada, ya que si se usara solo
echo off se seguira viendo la primera lnea con el prompt (5) y el todo el resto normal. La funcin del comando
echo es para mostrar mensajes en pantalla, pero con los parmetros on/off permite poner o quitar el eco
local que hace que se vean en el cmd una repeticin del prompt con los comandos utilizados (algo molesto).
Para dejar un espacio de lnea en el programa, que es lo equivalente a pulsar enter hay que escribir este comando:
echo. (o sea echo seguido de punto)
El comando title le asigna un titulo a la ventana del programa Batch cuando se abre, no es obligatorio ponerlo,
pero en mi caso quise utilizar los titulos para los nombres de los archivos.
El comando pause sirve para hacer una pausa y que el programa diga "Pulse una tecla para continuar...", es
extremadamente util ya que de lo contrario el programa finalizara sin que pudisemos terminar de ver el mensaje
de hola mundo!
5
Se denomina Prompt al guon o punto de insercin que precede el smbolo > (mayor que) y que se encuentra a la
espera de ordenes. De manera predeterminada el Prompt de windows muestra la ruta actual donde nos ubicamos
en el sistema (C:\>_ ). El Prompt puede configurarse de distintas maneras, ver prompt /? para ms informacin.
6
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
Tambin podemos hacer una pausa sin que la pantalla muestre el mensaje "Pulse una tecla para continuar...", solo
hay que escribir: pause > nul (mayor que > redirige el mensaje de pause a nul, o sea a nulo).
Finalmente exit sale del cmd, aunque si no lo pusiramos finalizara la aplicacin igualmente por el final de
archivo (EOF o End Of File).
Cabe aclarar que se pueden poner cometarios para el cdigo que solo se vern en el modo edicin, (suele escribirse
para hacer aclaraciones), para ello debemos escribir: rem comentario (rem significa remark y fue copiado del
BASIC) o sino :: comentario (ambos son validos).
El mbito local
Lo que explicar en este apartado ser relativo al manejo bsico de la consola, por lo que puede ser salteado para
los usuarios que ya tengan un conocimiento aproximado.
Cuando abrimos un smbolo de sistema (cmd) en nuestra pc, este se inicia en una carpeta predeterminada
establecida por el sistema, en Windows XP y anteriores es la carpeta del usuario por defecto (ejemplo:
C:\Documents and Settings\Usuario), en Windows 7 y 8 es en la carpeta de instalacin de windows (ejemplo:
C:\WINDOWS).
Comandos tiles
Ahora pasaremos a describir los principales comandos internos de la consola:
CD o CHDIR:
El comando cd (ChangeDirectory) permite cambiar de directorio (carpeta) especificando su ubicacin:
C:\Users\nikos3194> cd C:\WINDOWS
C:\WINDOWS>
Cuando usemos cd los nombres de los directorios que contengan espacios no sern tratados de forma separada,
antiguamente era necesario especificar los nombres con espacios entre comillas ya que la consola poda
interpretarlos de forma errnea. Igualmente a veces pueden aparecer errores si por ejemplo queremos ir a la
carpeta Archivos de programa y existe ya otra de nombre Archivos.
Cuando se vea el apartado 1.3.2, veremos que es posible usar comodines como atajos, por ejemplo esto nos
llevara a nuestro escritorio (para windows 7 u 8):
C:\Users\nikos3194> cd De*
C:\Users\nikos3194\Desktop>
7
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
Adems tambin se puede usar la tecla Tab para completar nombres de directorios coincidentes, adems si los
directorios contienen espacios, Tab les aade comillas para ms seguridad. Otro tip importante es que el slash
inverso (\) nos permite movernos a la raz (directorio principal) de un disco:
C:\Users\nikos3194\Desktop> cd \
C:\>
Para cambiar hacia otra unidad de disco es necesario indicar el parmetro /d, aunque igualmente tambin es
posible hacerlo con solo indicar la letra de unidad:
C:\> cd /d E:
E:\> C:
C:\>
Cd es un comando procedente de UNIX (por lo tanto tambin est presente en Linux y lenguajes anexos como C,
Perl o PHP). Una cosa importante que debemos saber a lo hora de ubicarlos en la consola es que .\ (punto)
corresponde al directorio actual y que ..\ (doble punto) corresponde al directorio superior. Por lo que si tecleamos
cd .. nos enviar al directorio que est sobre nosotros.
DIR:
Lista a los archivos y subdirectorios que halla adentro del directorio actual o la carpeta especificada.
C:\> dir
El volumen de la unidad D es Windows
El nmero de serie del volumen es: B391-E9F4
Directorio de C:\
8
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
Dir contiene una amplia lista de modificadores y parmetros que nos permiten listar los archivos y carpetas de
diferentes maneras. Algunos de los ms importantes son:
/A : Lista los archivos con los atributos especificados. Sin especificar ningn atributo permite ver archivos ocultos y
de sistema.
/B : Usa el formato de listado simple (sin encabezados ni descripciones).
/D : Igual que /B pero los archivos aparecen listados en columnas, diferenciando a los directorios entre corchetes y
sin omitir los encabezados.
/O : Lista a los archivos segn un orden especificado. Ver dir /? para ms informacin.
/P : Hace una pausa por cada pantalla.
/S : Muestra los archivos y directorios de todos los subdirectorios (una alternativa a Tree)
/T : Lista los archivos por su fecha de acceso, creacin o modificacin.
PUSHD y POPD:
El comando pushd funciona al igual que CD, con la diferencia de que permite guardar la direccin del directorio de
trabajo actual para luego regresar usando el comando POPD:
Adems si estamos conectados a una red LAN en nuestra casa o trabajo, pushd permite asignar una letra de unidad
a un recurso compartido en red empezando desde la unidad Z: hacia atrs. Igualmente existe el comando net use
que ya esta determinado para tal fin (ver net /?).
REN o RENAME:
Cambia el nombre y/o extensin de un archivo especificado:
Los modificadores ms peligrosos son /F, /S y /Q. Estos suelen aparecer en diversos virus que eliminan archivos en
las carpetas del sistema o del usuario.
9
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
Este es un comando que recomiendo usar con precaucin, ya que un error lgico o de dedo al tipear los nombres
de los archivos a borrar (en especial si incluimos comodines) puede costarnos la integridad de nuestros archivos.
MD o MKDIR:
Permite crear uno o mltiples directorios (carpetas) en una ubicacin especificada:
C:\> md Alma
C:\> md Hola\que\tal\como\estas
C:\> rd Alma
/S : Borra un arbol de directorios, eliminando todos los archivos y carpetas que pudiera contener. (puede ser un
comando letal)
/Q : Modo silencioso. En conjunto con /S no pide confirmacin al borrar un arbol de directorios.
Ejemplo:
C:\> rd /S /Q Hola
Esto eliminara el conjunto de directorios Hola\que\tal\como\estas (creado en el ejemplo de uso de MD) y todos
sus archivos.
Al igual que DEL, este un comando presente en diversos virus. A la hora de utilizarlo conviene actuar con mucha
precaucin.
MOVE:
Acta como funcin Cortar, permitiendo mover uno o ms archivos. Adems puede ser usado para renombrar
directorios.
Mover un archivo:
Renombrar un directorio:
ATTRIB:
Con attrib se pueden establecer o quitar atributos a los archivos. Estos atributos pueden ser de oculto (H), solo
lectura (R), sistema (S) o almacenamiento (A). Ejemplo de asignacin:
10
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
Adems podemos aadir el modificador /D para que procese las carpetas y /S para que los haga de forma recursiva
en todos los subdirectorios con sus archivos.
START
Permite ejecutar un programa o comando especifico en una ventana aparte. Sirve para abrir archivos mediante sus
extensiones asociadas en el sistema por los comandos assoc y ftype.
Cabe considerar que el comando start contiene muchos modificadores y parmetros, por lo que recomiendo ver
start /?
Lo interesante de estos modificadores es que pueden combinarse de manera interesante.
Este sera un ejemplo para abrir el programa netcat como troyano usando start: (6)
Descripcin: esto abre el programa NetCat sin crear una ventana (/B) en un espacio de memoria separado
(/SEPARATE) en prioridad de ejecucin alta (/HIGH) en un entorno cmd distinto (/I) en el directorio C:\WINDOWS
(/D %windir%) y a netcat (nc.exe) lo inicia en modo troyano (-L) en el puerto 1337 (-p 1337), siempre que el firewall
o el antivirus lo permitan.
Luego ya veremos algunas cosas que sern explicadas ms adelante.
6
Agradecimientos a sirdarkcat por proporcionar el presente ejemplo en el foro el-hacket.net.
11
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
Debido al gran nmero de modificadores que posee cada comando quise postergar la descripcin detallada para el
apartado 1.7 de ndice de comandos, funciones y utilidades del smbolo de sistema. Igualmente recomiendo ver
su ayuda usando el parmetro /?.
CLS Borra la pantalla (CLearScreen) [util para limpiar los comandos ya usados].
CMD Inicia una nueva instancia del intrprete de comandos de Windows (Consola).
COLOR Establece los colores de primer plano y fondo predeterminados de la consola.
DATE Muestra o establece la fecha.
EXIT Sale del programa CMD.EXE (interfaz de comandos).
FOR Ejecuta un comando para cada archivo en un conjunto de archivos.
GOTO Direcciona el intrprete de comandos de Windows a una lnea en un programa por lotes.
FIND Busca una cadena de texto en uno o ms archivos [bsico].
FINDSTR Busca cadenas de texto en archivos [es ms avanzado que FIND].
IF Ejecuta procesos condicionales en programas por lotes.
MORE Muestra la informacin pantalla por pantalla.
PAUSE Suspende el proceso de un archivo por lotes y muestra un mensaje.
REPLACE Reemplaza archivos.
SET Muestra, establece o elimina variables de entorno de Windows.
SORT Ordena las entradas.
TIME Muestra o establece la hora del sistema.
TITLE Establece el ttulo de la ventana de una sesin de CMD.EXE.
TREE Muestra grficamente la estructura de directorios de una unidad o ruta de acceso.
TYPE Muestra el contenido de un archivo de texto.
Los comandos como FOR, IF, GOTO, FIND, FINDSRT o SET los explicar de lleno ms adelante.
Hay muchos otros comandos como: ASSOC, AT, ATTRIB, BREAK, CALCS, CALL, CHCP, etc. (sin contar con los
comandos ocultos en el system32) que luego explicar ms adelante para no molestar la benevolencia del lector :P
Historiales DosKey
Muchas veces necesitamos volver a escribir un comando utilizado durante una sesin en el smbolo de sistema.
Para ello existen funciones establecidas por el comando doskey de forma predeterminada que nos permiten ver o
manipular los comandos usados mediante las siguientes teclas:
12
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
Las funciones que ms recomiendo tener en cuenta son las de flecha arriba, flecha abajo, Tab, F7, F8, F9 y Esc.
Doskey establece un mximo de 50 comandos en la lista de la memoria para el historial, esta configuracin puede
modificarse usando: doskey /listsize=numero
Cuando se vea el capitulo de comandos de programacin avanzada veremos otros usos para el comando doskey.
Mascaras y comodines
Bueno, esto es algo de uso global en todos los sistemas y lenguajes, as que asumo que muchos ya lo conocern.
Cabe aclarar que a diferencia de Linux, en windows solo existen dos metacaracteres que pueden ser usados como
mascaras o comodines en la manipulacin de archivos y carpetas, estos son:
Ejemplos:
type *.txt = lista el contenido de todos los archivos con extensin .txt (puede ser extenso).
cd Mis* = viaja al primer directorio que comience con Mis
dir *asa*.jpg = lista archivos que contengan asa en su nombre y terminen con .jpg
start mi_novi?.jpg = abrir todos los archivos de nombre mi_novia.jpg o mi_novio.jpg
dir archivo_?.doc = lista archivos de nombre archivo_ y que posean un caracter antes de .doc
copy *.??? H:\ = copiar todos los archivos con extensin de 3 caracteres a la unidad H:\
copy *.?x? H:\ = copiar todos los archivos de extensin .exe y .txt a H:\
dir *s*.m?? = listar archivos que contengan s en su nombre y su extensin comience con .m
13
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
Ahora bien tuve que colocar >> para la siguiente lnea debido a que si utilizara solo > el texto anterior en el archivo
seria sobrescrito, creando un fichero nuevo. Desde hace mucho la consola de windows permite omitir el hecho de
tener que utilizar primero > para crear el archivo, pudiendo crearlo directamente con >> para no correr riesgo de
sobrescribir nada, por lo que desde ahora para volcar texto usaremos solo >> para ms seguridad.
Supongamos que queramos tener un listado del contenido de la carpeta Mis documentos, si nos ubicamos en
nuestro usuario solo debemos hacer:
En el comando cd quise usar comillas para Mis documentos debido a que la consola puede reconocer los espacios
de los directorios como instancias separadas y aunque este no es el caso deberamos ir acostumbrndonos a usar
comillas en nombres de archivos o carpetas que contengan espacios. Para el comando tree, el parmetro /F
permite mostrar los archivos contenidos en cada carpeta y el parmetro /A hace que el resultado sea volcado en
texto ASCII que es ms fcil de leer en un archivo de texto plano. Hay que tener en cuenta que usar el comando
tree en directorios extensos como el C:\ desde la consola puede llegar a saturar un poco por lo que es
recomendable pausarlo con la tecla Pause Inter y finalizarlo con Ctrl+C (para directorios grandes siempre es
mejor volcar el contenido a un archivo de texto:
tree /F C:\ >> archivos_disco_duro.txt )
Si usramos el mismo comando tree sin redireccionar el resultado a un archivo, probablemente nos resultara
imposible de ver la cantidad de texto que se despliegue en consola, y para evitar esto podemos usar la utilidad
more que acta como filtro en la salida de comandos por medio del smbolo | el cual se denomina tubera o
pipe (existente tambin en Linux por ser una funcin copiada de UNIX) y en este caso canalizar el resultado
usando more:
tree /F | more
Al pie de la ventana nos aparecer el mensaje --Ms-- y que si presionamos enter o espacio seguir avanzando
mostrndonos el listado cmodamente. Esta redireccin tambin es muy til para leer la ayuda de un comando
extenso (ej: HELP cmd | more).
Otra manera de usar more es con la redireccin < , por ejemplo lo siguiente permitira ver el texto volcado
anteriormente de forma ordenada:
Pero esta redireccin solo funciona con archivos, ya que si quisiramos hacer lo mismo de tree /F | more como
more < tree /F no funcionara ya que el comando tree se ejecuta en segundo termino y more no puede mostrar
algo que an no existe.
Otra funcin til es el comando sort que sirve para ordenar listados o textos y tiene muchos parmetros tiles
(para verlos tipear sort /?). Por ejemplo si tecleamos tree /F | sort aparecern todos nuestros archivos ordenados
de forma alfabtica. Tambin podremos usar una doble redireccin: tree /F | sort | more como as tambin una
redireccin seguida de un desvo:
14
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
Para dar otro caso practico, podramos imaginar que tenemos un archivo de texto con un contenido que
deseramos clasificar alfabticamente (una lista de direcciones de correos, telfonos, nombres de personas, etc.).
Esto podra cumplirse con el siguiente comando:
Aunque no es necesario tener que llamar al comando type ya que como en el caso de more, sort tambin permite
expandir un archivo de manera directa:
Como se explic antes tambin es posible usar las redirecciones para evitar que los comandos muestren mensajes
que no queremos ver, por ejemplo el comando pause siempre dice Presione una tecla para continuar...,
redireccionandolo a nul (un valor especial que significa nulo) podemos quitar el mensaje mostrado por pause.
Ahora bien hay que saber que nul pese a ser un sitio que no existe, pertenece a los dispositivos de salida definidos
por la consola y que podemos utilizar mediante las redirecciones.
Es normal ver que todava se encuentren viejas computadoras con sistemas Ms-Dos soportando a dispositivos
fiscales anticuados. Esto se debe primero por la tacaera de los comerciantes de no querer invertir en nuevos
dispositivos y segundo porque facilita las evasiones fiscales por ser sistemas que son difcilmente accesibles y
controlables por los nuevos sistemas de los agentes fiscales (aunque no siempre ;P).
Para no irme de tema veremos un par de ejemplos para usar los dispositivos de salida.
Con CON podemos manipular el contenido entrante en pantalla. Por ejemplo podemos copiar los que tipeamos a
un archivo de texto de la siguiente forma:
15
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
Con esta manera podremos redactar texto de manera ms extendida que con el comando echo (aunque con la
desventaja de no poder retroceder ) pero que para finalizar la copia ser necesario presionar la tecla Ctrl+Z en
vez de el atajo normalmente utilizado que es Ctrl+C, esto de debe a que como el comando copy es algo antiguo
conserva la vieja funcionalidad de DOS.
Tambin es posible imprimir la salida de un comando redirigindolo a PRN, por ejemplo:
type archivo.txt > prn
Pero no recomiendo que lo hagan ya que si nuestra impresora no est soportada podra colgarnos la consola sin la
posibilidad de detener la accin, debiendo cerrar forzadamente.
Es muy usual encontrar en muchos tutoriales batch en la red de redes que usan varias redirecciones para volcar
gran contenido a otros archivos, como el caso de archivos batch que crean a otros archivos batch de la siguiente
manera:
Pero algo interesante es que cmd.exe nos permite usar parntesis sin discriminaciones para poder agrupar todo
hacia una nica redireccin:
(
echo @echo off
echo title Saludo
echo color F0
echo echo Hola!
echo pause
) >> hola.bat
De esta manera podemos redireccionar gran cantidad de contenido a un archivo determinado sin tener que andar
poniendo una redireccin a cada lnea.
Otra ventaja que nos ofrece el uso de parntesis en las redirecciones es el hecho no incluir un espacio en blanco
para el final de cada lnea volcada con echo:
(echo Este texto se volcar al archivo sin espacios al final de la linea) >> archivo.txt
Vuelvo a repetir que cmd.exe no discrimina el uso de parntesis, por lo que podemos usarlos donde queramos y
agruparlos como queramos, pero siempre que no nos equivoquemos lgicamente el sitio en donde los ponemos.
16
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
@echo off
(
(title Prueba)
(color F0)
)
(((echo Mensaje de prueba)
pause>nul)
exit)
@echo off
((title Prueba) (color F0))(((echo Mensaje de prueba) pause>nul)exit)
@echo off
((title Prueba) && (color F0)) && (((echo Mensaje de prueba) && pause>nul) && exit)
Canalizaciones secuenciales
La canalizacin secuencial es similar al redireccionamiento, salvo que est enfocada a ejecutar una secuencia de
varios comandos canalizados en una misma lnea.
Para canalizar se usan los signos & (Alt+38) y | (Alt+124), de manera doble.
&& Representa al y lgico AND. Ejecuta los comandos especificados hasta que finalice
el string (cadena de cdigo) o alguno falle.
|| Representa al o lgico OR. Busca intentar ejecutar los comandos especificados
hasta que alguno no falle o finalice el string.
Como vimos && expresa un y lgico, por lo que nos permite agrupar todos los comandos que queramos en una
misma lnea de cdigo, con el inconveniente de que si alguno llega a fallar, la ejecucin se detendr.
Esto es muy til para usar desde otros sitios diferentes como los accesos directos usando el modificador /C para
cmd.exe (ver cmd /?), el cual sirve para llamar al interprete de comandos desde otros lugares, programas o incluso
otros lenguajes y de esta forma interpretar cdigos de manera externa.
17
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
Por ejemplo, para el caso de que usramos el Internet Explorer y se nos quedara colgado sin la posibilidad de
cerrarlo, podramos disponer de un acceso directo con el comando taskkill, para matar el proceso de Internet
Explorer iexplore.exe:
Esto ofrece adems el hecho de poder aadir un icono de nuestro gusto para el acceso directo, lo que hace que
tambin sea una tcnica muy usada por malos hackers que buscan que ejecutemos cdigos batch malintencionados
hacindolos pasar por otros archivos.
Posiblemente a veces en la red de redes se vean ejemplos de archivos batch con un solo ampersand (&) como
separador, esto tambin es valido pero no respeta la compatibilidad con la que se lo copio del sistema UNIX, en el
cual se utiliza doble (&&), por lo que siempre recomiendo usarlo de esta ultima manera.
@echo off
@verify on
copy archivo1.txt archivo2.txt archivo3.txt G:\ || echo Hubo un error en la copia
pause>nul
En caso de que la copia del archivo.txt no se concrete, se mostrara un mensaje de error. Como nota aparte aad el
comando @verify on, el cual es muy til para comprobar que los datos que copiamos se escriban bien en una
unidad o disco.
Expresiones
Batch proporciona un sistema de expresiones simple con el que se pueden hacer diversos tipos de operaciones, ya
sean de tipo cadena (string), lgicas o aritmticas. Estas expresiones son manejadas generalmente por el comando
SET, un sucesor menor de LET (comando normalmente usado en otros lenguajes como BASIC o Bash), que es
tambin muy verstil.
Variables: Set
Las primeras expresiones que veremos sern las variables. Una variable es una especie de memoria a la que
podemos asignarle un dato, para hacerle referencia ms adelante. Voy a dar un ejemplo:
18
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
@echo off
rem En este ejemplo quise utilizar tabulacines y espacios para una fcil lectura.
SET var=Hola
echo %var% que tal?
pause > nul
Resumiendo: set var=Hola declara la cadena de texto Hola como la variable var, y para poder interactuar a
var dentro del cdigo hay que ponerla entre % quedando %var% y as funcionaria: echo %var% qu tal?:
Hola que tal?
Cabe mencionar que la consola de windows no es case-sensitive por lo que ser igual escribir %var% que %VAR% o
%VaR% ya que no se distinguirn maysculas de minsculas.
Ahora vamos a ver otro tipo de variables muy parecidas, estas variables hacen que se pueda escribir algo y el
programa enve una respuesta, tcnicamente se conocen como PromptStrings, un ejemplo:
@echo off
title Variable con pregunta
color f0
set /P nombre=Como te llamas?
set /P edad=Y cual es tu edad?
Es exactamente igual, escribimos el comando set pero con el parmetro /P que permite ingresar texto
declarando la variable desde la misma ventana de la consola.
El modificador /P tambin permite que la declaracin de la variable est precedida por un texto que ser omitido
en la asignacin:
SET /P var=Ingrese un texto y pulse enter: _
Resumiendo: si queremos que se escriba algo en la pantalla y que se almacene en una variable, hay que poner set
/p var=loquesea
Seguramente habrn notado el nuevo comando COLOR. Este comando sirve para aplicar colores a la consola y se
utiliza seguido de un cdigo para cada color, por ejemplo: color f0 (F=color de la ventana [blanco] y 1=color del
texto [negro]); color 0a (0 [cero]=color de la ventana [negro] y a=color del texto [verde claro]), etc. Se pueden ver
mas colores disponibles escribiendo: help color color /?
Es muy importante saber que a veces pueden aparecer espacios al final de las variables que declaramos. Estos
espacios sobrantes aunque no dificultan las operaciones pueden ser molestos en ciertos programas y es posible
eliminarlos de dos maneras:
19
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
Expresiones aritmticas
Ahora veremos nuevas expresiones de variables que sirven para operaciones matemticas, se asignan de la
siguiente manera:
Es decir que set con el modificador /A podr evaluar cualquier expresin numrica bajo cualquiera de las
siguientes operaciones:
() Agrupacin
~- Operadores unarios
! Negacin lgica
*/% Multiplicacin, divisin y resto
+- Suma y resta
<< >> Desplazamiento (mays lgica)
& Bit a bit y (AND)
^ Bit a bit exclusivo (XOR)
| Bit a bit o (OR)
= Asignacin de variable
== *= /= %= Asignaciones
+= -= &= ^= Asignaciones
|= <<= >>= Asignaciones
, Separador de expresiones
Con estas operaciones podremos transformar la consola en una maquina de calcular con un limite de hasta 10
caracteres, pudiendo hacer operaciones decimales, hexadecimales precedidos de 0x (ej: 0x12 que es 18 decimal en
hex) u octales precedidos de 0 (ej: 022 que es 18 decimal en oct). Para los operadores lgicos o de mdulo ser
necesario usar comillas. Recomiendo que consulten la ayuda de set /a en el sitio de microsoft technet: (en ingls)
http://technet.microsoft.com/en-us/library/bb490998.aspx
(en caso que el link se caiga usar el buscador de la propia pagina o google)
Si estamos apresurados por hacer un clculo sin un archivo batch, podemos usar set /a directamente en consola sin
declarar ninguna variable:
20
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
Es conveniente agrupar usando los parntesis ya que para la instruccin anterior la consola interpretar
(8*8*8*8*8) + (16/2) cuando lo que queramos era hacer (8*8*8*8*8+16) / 2 dando 16392 en vez de 32776.
Una cosa muy til de set /a es el hecho de poder separar expresiones usando comas, permitindonos declarar
mltiples variables en una misma lnea (siempre y cuando el valor de las variables sea numrico)
Se puede ver que luego de aclarar las variables aparece un 3, esto se debe a que set interpreta la declaracin
anterior como un clculo y decide mostrar el ultimo resultado obtenido, para evitar mostrar este mensaje podemos
redirigir la salida usando > nul
Es posible usar las variables declaradas anteriormente para sumarle nuevos valores en conjunto:
El resultado 26 de la variable d, fue obtenido a partir de las asignaciones anteriores a las variables a, b y c; las
cuales fueron multiplicadas por 2 dando 4, 8 y 14, para finalmente sumarse obteniendo 26.
Cabe aclarar que si se fijaron en los ejemplos anteriores no he usado el signo de porcentaje (%) para expandir las
variables dentro del propio comando set. Si quisiramos usarlo no habra problema (set /a a=%a% * 2), pero
recordemos que como se trata de un signo aritmtico podra llegar a haber un error, es por eso que /A es el nico
modificador que nos permitir expandir a las variables sin este signo dentro de set (claro que siempre que sean de
valor numrico).
Otras cosas que podemos hacer es incluir variables no declaradas o combinar a otras variables ya declaradas dentro
de nuevas:
21
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
Como podemos ver, las variables x y z no estaban previamente declaradas, pero pese a que sus valores eran
nulos, set acepta sumarlas como 0+1 dentro de w y y, para sumarlas posteriormente en e como 1+1=2.
Para terminar, la principal ventaja que ofrece set /a es el de poder escribir una expresin completamente visible,
algo que en la calculadora de windows no es posible ya que por cada operacin se renovar el resultado en
pantalla. Por otra parte la nica desventaja es que set carece de soporte aritmtico de coma flotante, es decir que
no podremos hacer operaciones con nmeros decimales, algo que solucionaremos cuando veamos Python.
Ahora mejor vamos a ver un ejemplo prctico para un programa en batch, donde aadir un nuevo comando
llamado CLS que sirve para renovar la pantalla:
@echo off
title Sacar la media
color f0
set /a suma=a+b+c
rem aqu arriba sumamos las 3 cifras
Se pueden ver todas las variables de entorno del sistema escribiendo el comando set sin parmetros.
22
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
Las variables de entorno (7) fueron creadas por una razn de compatibilidad y es la mejor manera (casi obligatoria)
que tiene un programador para que su aplicacin sea completamente funcional en las distintas versiones de
Windows. El contenido de la variable puede cambiar pero la variable en s siempre ser la misma. Veamos un
ejemplo prctico...
Imaginemos que desarrollamos un programa en batch para hacer copias de respaldo y queremos que instale un
registro con los respaldos hechos de nombre Log.txt y en la carpeta de datos de programa del usuario, la ruta en
Windows 2000, XP o Vista ser la siguiente:
Hay programadores que solo piensan para los ltimos sistemas, pero puede suceder de gente que siga utilizando
los sistemas viejos (he visto comercios y oficinas estatales que an utilizan el Ms-Dos) y para resolver este
problema de compatibilidad existe la variable de entorno APPDATA la cual existe y seguir existiendo para todas las
versiones de windows, posibilitando resumir la cadena anterior a esto:
Esta sera una lista de las principales variables de entorno y sus valores con una breve explicacin para los windows
XP al 7; quise marcar en negrita las ms utiles:
23
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
Recordemos que las variables en windows no son Case Sensitive por lo que ser igual poner %HOMEDRIVE% que
%HoMeDRiVe%
La variable %PATH% es una de las ms importantes variables de entorno ya que nos permite agregar rutas con
programas que el sistema podr ejecutar automticamente sin escribir su ruta completa. %PATH% y %PATHEXT%
son las nicas variables que pueden tener un conjunto de distintos valores dentro de ellas, y es muy importante
definir que para modificarla hay que reagregar la misma variable y establecer las nuevas rutas separadas por punto
y coma:
Si no incluyramos %PATH% antes de indicar la nuevas rutas en la asignacin, los valores anteriores de la variable
se perderan quedando solo los nuevos. Recordar esto a la hora de modificar este tipo de variables (8). Escribir path
/? para ms informacin.
Existen un tipo especial de variables de entorno que se destacan por ser dinmicas, es decir que cambian o pueden
cambiar sus valores constantemente. Estas variables no aparecen en la lista que muestra SET pero pueden ser
reemplazadas por un valor distinto en caso que lo queramos. Las variables dinmicas son:
C:\> cd C:\GUINDOU$
El sistema no puede hallar la ruta especificada.
C:\> echo %errorlevel%
1
Existen dos variables que aunque no son muy tiles se hallan entre las variables dinmicas:
8
Cabe mencionar que el espacio mximo para almacenar rutas dentro de la variable PATH como para cualquier
otra variable es de 1024 caracteres.
24
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
%CMDEXTVERSION% expande la versin actual de las extensiones del comando del procesador %CMDCMDLINE%
expande la ruta de la lnea de comando original que invoc el procesador de comandos. Como la lnea de comando
original siempre ser la variable de entorno %COMSPEC%, nuestro procesador de comandos es
C:\WINDOWS\System32\cmd.exe (cuanta novedad ;P)
Todas estas seran las variables dinmicas del shell de windows. Las primeras 5 son las ms tiles y se vern ms
adelante. Cabe recalcar que adems de estas existen otras variables dinmicas de windows que no detallar por el
momento ya que no se vinculan al cmd pero pueden ser llamadas he interpretadas por el mismo.
Usando una redireccin del archivo hacia el comando Set /P podremos almacenar su contenido en una variable. Los
nicos inconvenientes son que solo permitir almacenar la primera lnea contenida en el archivo y que esta no
podr exceder los 1024 caracteres.
El ejemplo anterior servira para almacenar la ruta de trabajo actual en una variable, es una alternativa no dinmica
a %cd% que puede ser til para muchas cosas.
Ahora bien, a la hora de expandir el contenido de cualquier variable podemos sustituir, manipular o modificar el
resultado que se muestra en tiempo real sin tener que volver a declararla con otro valor distinto.
Existen varias formalidades para hacer esto y voy a tratar de exponerlas usando la variable %path% tal como
muestra la ayuda de set.
Para la prctica, si expandimos la variable path los valores originales en los ejemplos sern los siguientes: (9)
9
Los valores para la variable PATH suelen ser muchos ms que los descritos en el ejemplo. Esto es debido a que
muchos de los programas que se instalan suelen agregar nuevas entradas a esta variable para facilitar la
bsqueda de sus ejecutables y dems dependencias.
25
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
Lo que har esto es cambiar la letra de unidad C: por D: en todos los directorios. La formalidad es %var:X=Y%
donde cada repeticin de X ser sustituida por Y dentro de la variable, donde Y tambin puede ser una cadena
vaca para borrar el valor de X. Tambin podemos agregar un asterisco delante de X para que coincida en todo el
contenido hasta la primera aparicin de X. Por ejemplo si usamos %path:*;=% eliminar al primer directorio
delimitado por ; , o sea que X sera el punto y coma, y el asterisco delimitara la cadena previa, o sea
C:\WINDOWS\system32, y como luego del signo = no se especifica nada, la cadena sera eliminada dentro de la
variable %path%
La segunda formalidad permite expandir una variable especificando las substrings (o subcadenas) que se quieren
extraer:
Lo que har lo anterior ser desplazarse 11 caracteres (a travs de C:\WINDOWS\) y luego tomar solo los siguientes
8 caracteres (system32). La formalidad es %var:~X,Y% (10) en donde X ser el nmero de caracteres que se
desplazar la variable y Y el nmero de caracteres que se tomarn, donde si ,Y no se especifica ser el resto del
valor de la variable.
Tambin es posible usar nmeros negativos para desplazarse de atrs hacia adelante.
Por ejemplo esto extraer los ltimos 24 caracteres de la variable %path%:
Llevando estos ejemplos a un ambiente ms practico, imaginemos que quisiramos usar un programa para crear
carpetas con la fecha actual de manera automtica (podra servir para un programa de respaldos). Para eso
necesitaramos usar la variable dinmica %date%, pero resulta que la fecha expandida por date tiene un caracter
especial no permitido para los nombres de archivos y carpetas, el slash (/):
Para poder quitar el slash, deberemos primero dividir la fecha entre da, mes y ao, contando primero por que
caracteres nos desplazaremos y luego los caracteres que tomaremos:
10
Debo aclarar que para usar esta formalidad se necesita del smbolo ~ (Alt + 126)
26
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
Primero a partir de la posicin 0, tomamos los primeros 2 caracteres (20), luego en la posicin 3 tomamos los
siguientes 2 (01) y luego tomamos directamente los 4 ltimos (2013).
Ahora si quisiramos aadir tambin la hora actual usando la variable %time%, deberamos quitar los smbolos de
dos puntos (:) para poder incorporarla como parte del nombre de una carpeta o archivo. Time expande la hora de
la siguiente manera:
Como vemos, adems de la hora, los minutos y los segundos, tambin se muestran las dcimas de los segundos,
algo que tal vez deberamos omitir ya que no viene al caso incorporar a un nombre.
Utilizando el mtodo que usamos con la variable %date% podemos desarmar la hora actual:
Ahora podramos definir un sistema para crear una carpeta o archivo con la fecha y la hora actual usando set /a.
Para poder establecer una mejor organizacin de los archivos, invertiremos el orden de la fecha para que sea
fcilmente clasificable:
@echo off
title Crear carpeta con fecha y hora
set /a dia=%date:~0,2%,mes=%date:~3,2%,anio=%date:~-4%
set /a hor=%time:~0,2%,min=%time:~3,2%,seg=%time:~6,2%
set fecha=%anio%-%mes%-%dia%
set hora=%hor%-%min%-%seg%
md %fecha%_%hora%
Esto dar como resultado una carpeta con el siguiente nombre: 2013-1-20_20-31-52
Obviamente esto lo podramos modificar como quisiramos, pero cabe aclarar que si observamos el formato del
mes actual (01) a perdido el cero que lo preceda, ya que debido a como expresa la ayuda de set, los nmeros con
prefijo cero son validos solo como octales, pero no como decimales. Por eso, cuando veamos la sentencia de
control FOR, veremos otro mtodo distinto para obtener la hora y fecha actual, aunque no menos complicado que
el actual.
Finalizando todo este captulo, en la manipulacin avanzada de variables solamente me faltaba explicar lo que se
denomina expansin de variable retardada, pero que debo postergar debido a que primero necesitaremos saber
las sentencias de control para poder explicarlo (u_u)
27
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
Sentencias de control
Aunque Batch no pueda soportar un conjunto demasiado amplio de sentencias de control como el shell de Linux o
PowerShell (ya que carece de muchas funciones de programacin esenciales como Case, While, Until, etc.
presentes en Bash y otros lenguajes), sin embargo puede resolver muchos de los problemas ms usuales con sus
sentencias de control, aunque recordemos que podemos recurrir a buscar muchos de los comandos de UNIX/Linux
compilados especialmente para funcionar en el cmd de windows, algo notablemente til para aprender a usar
Linux desde nuestro windows y as tambin resolver las funciones que hagan falta.
Etiquetas: Goto
Para poder explicar de la mejor manera posible las funciones de las sentencias de control (y en especial la sentencia
If) debo primero ensear el uso de etiquetas con la instruccin Goto, el cual es una subrutina ms que una
sentencia de control, por lo que se ver con ms profundidad cuando explique la funcin Call en el apartado de
Subrutinas. Hay que aclarar que el uso de goto y etiquetas tiene un enfrentamiento entre diversos grupos de
programadores que desaconsejan su uso dentro de la programacin secuencial y estructurada debido a que el
abuso de estas instrucciones dificulta la lectura del cdigo fuente de los programas, produciendo lo que se llama
cdigo spaghetti. Pueden saber ms sobre esto viendo en Wikipedia:
http://es.wikipedia.org/wiki/Transferencia_incondicional
Como ancdota, la instruccin goto es una de las pocas funciones de batch que no fueron copiadas de UNIX. Fue
copiado ntegramente de BASIC (actual Visual Basic) y este a su vez lo extrajo del lenguaje Pascal (actual Delphi) que
a su vez lo haba sacado de los primeros lenguajes mquina.
Ahora para explicar bsicamente lo que es el uso de Goto, podramos describir a las etiquetas (labels) como si
fueran mens, se crean con un texto precedido del signo dos puntos (:) pudiendo contener cualquier carcter
exceptuando el espacio o smbolos especiales (&()[]{}^=;!'+,`~), el texto de la etiqueta luego es referenciado con el
comando goto. Su uso es bastante fcil:
@echo off
:etiqueta
echo Hola de nuevo ;)
pause>nul
goto etiqueta
Lo que en este caso hace la funcin goto es ir hacia :etiqueta (de aqu el termino de transferencia o
redireccionamiento que se le otorga a goto), la cual se ubica al inicio del cdigo haciendo que este se repita de
nuevo, permitindonos crear bucles. Tal vez algunos conocern el virus satura pc que aparece seguido por los
tutoriales hacker de youtube y que bsicamente hace repetir la ejecucin de un programa de windows pudiendo
colgar temporalmente la pc:
:repetir
start cmd.exe
goto repetir
28
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
En este caso se omite el comando pause lo que produce una repeticin o loop infinito, por lo que nunca olviden de
colocar un pause o pause>nul antes de usar un goto que accione una ejecucin retroactiva (o sea una accin hacia
atrs).
Para finalizar, cuando usamos goto es posible llamar etiquetas de 3 formas distintas:
goto label
goto :label
goto:label
Cualquiera de las maneras anteriores es correcta. Con el condicional if podremos ver mejores ejemplos para el uso
de goto.
Condicionales: If
La sentencia de control if es un condicional, o sea que establece una condicin como: si esto se cumple, hace esto...
y si no se cumple, hace esto otro. If puede comparar cadenas, comprobar la existencia de archivos, hacer
comparaciones matemticas o reconocer valores de error entre muchas otras cosas.
Segn expresa la ayuda de if, sus principales funciones son las siguientes:
* El parmetro opcional de not expresa que una accin solo se debe llevar a cavo si la condicin es falsa o desigual.
@echo off
title Preguntita
:inicio
set /p cuenta=Cuanto es 2+2 ?...
:bien
echo El resultado es correcto ;P
pause>nul
exit
:mal
echo El resultado es incorrecto. Vuelva a intentarlo.
goto inicio
29
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
El doble igual == establece una coincidencia (o igualdad), que si es cierta proceder a ejecutar una accin y que si
no es cierta (aplicando else) har otra cosa, siendo else una funcin opcional que podemos omitir. Recordemos
que el uso de parntesis tambin se puede omitir salvo cuando se utilice la funcin else.
Veamos un ejemplo:
@echo off
title Redactor
if not %var%==nikos3194 (
echo Te equivocaste
) else (
echo Correcto! ^^
)
pause>nul
Como se puede ver, cuando colocamos parntesis podemos acomodar las acciones como se nos antojen, pero con
cuidado de que si usamos ms de una accin las precedamos de &&, ya que if no permite usar ms de un comando
por cada condicin. (Veremos esto ms adelante).
En este caso si existiera el archivo archivo.jpg sera eliminado, de lo contrario mostrara un mensaje de que el
archivo no existe.
Una forma muy til de usar esto es para detectar la presencia de virus en memorias y eliminar su fichero de
autoreproduccin autorun.inf:
if exist %homedrive%\autorun.inf (
echo Su unidad esta infectada!, presione una tecla para eliminar el archivo perjudicial
) else (
echo Su unidad no se encuentra infectada && pause>nul && goto EOF)
pause>nul
del /f /s /q %homedrive%\autorun.inf
30
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
Al igual que if exist para los archivos, tambin se puede usar if defined para las variables, permitiendo saber si
una variable fue declarada correctamente:
En donde cadena1 y cadena2 pueden ser un nmero, una palabra, una variable o un conjunto de caracteres,
que estar delimitado por la opcin de comparacin que se halla definido, siendo el lugar de opcin cualquiera
de las siguientes opciones:
EQU: Igual (=) LSS: Menor que (<) GTR: Mayor que (>)
NEQ: No igual () LEQ: Menor o igual () GEQ: Mayor o igual ()
El parmetro opcional /i indica que para las comparaciones no habr distincin entre maysculas y minsculas, ya
que if por defecto trae la funcin Case-Sensitive habilitada.
@echo off
title Menor o mayor de edad
:mayor
echo Usted es mayor de edad Diviertase!!!
pause>nul
goto salir
:menor
echo Usted es menor de edad Afuera!!!
pause>nul
:salir
exit
En este ejemplo comprobbamos si la variable %edad% era mayor o igual (GEQ), o menor o igual (LEQ) de 18.
Podemos ver este otro ejemplo donde se pueden utilizar GTR (mayor que) y LSS (menor que) para adivinar un
nmero:
31
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
@echo off
:menu
echo Tenes que averiguar el numero para poder salir
if %var%==5 goto si
if %var% LSS 5 goto menor
if %Var% GTR 5 goto mayor
:si
echo correcto!!
pause>nul
goto salir
:menor
echo elegi otro mas alto
goto menu
:mayor
echo elegi otro mas chico
goto menu
:salir
exit
Y as como se pueden hacer comparaciones con nmeros tambin se pueden comparar cadenas de texto:
@echo off
title Login
:inicio
echo Introducir la contrasea:
set /p contra=
:correcto
echo CONTRASEA CORRECTA!
echo Usted dispone de pribilegio para ver el contenido oculto...
pause>nul
type secreto.txt
exit
:incorrecto
echo CONTRASEA INCORRECTA, VOLVE A INTENTARLO
goto inicio
Pero para este ultimo caso, el hecho de especificar EQU sera lo mismo que poner ==, ya que expresa igualdad:
32
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
En caso de que usramos el parmetro /i , introducir Admin o ADMIN seria igual que admin.
If permite comprobar los valores de las variables dinmicas ErrorLevel y CmdExtVersion de manera directa.
En el apartado de Variables de Entorno y Dinmicas habamos visto que errorlevel servia para detectar errores. Si
errorlevel muestra un cdigo de salida 0 indica que no hubo ningn problema y si muestra un cdigo de salida
superior hace referencia a que hubo diferentes errores.
Por ejemplo, de la siguiente manera podremos saber si hubo un error mayor o igual a uno:
La ayuda de if (aunque psimamente traducida xD) nos muestra un ejemplo muy ocurrente de usar goto para
identificar los distintos cdigos de error devueltos por errorlevel:
goto error%errorlevel%
:error0
echo El programa batch no ha enviado cdigos de error. (0) && pause && goto next
:error1
echo El programa batch devolvi el cdigo de error genrico. (1) && pause && goto next
:error9009
echo El programa batch devolvi el error de comando o programa desconocido. (9009)
pause
Pero aunque esto parezca corto, si le aadimos ms etiquetas se podra complicar, ya el hecho de tener que usar
una lnea de etiqueta hace que tengamos que agregar ms comandos precedidos de && hacia una nueva etiqueta
(next). Para mejor utilidad dentro de una aplicacin batch resulta ms prctico usar if. El siguiente ejemplo con el
comando xcopy demuestra ser ms simple y menos problemtico:
@echo off
echo Respaldo de la carpeta Mis documentos a un pendrive:
Por supuesto as como hay cdigos de error especiales como el 9009 que indica que un programa ejecutado no se
reconoce como un comando interno o externo, programa o archivo por lotes ejecutable, tambin hay muchos
otros errores especficos del sistema. Personalmente no puedo explicar ms errores ya que carezco de recursos
para identificarlos todos, adems de que ocuparan un considerable espacio en este tutorial.
33
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
CmdExtVersion funciona como ErrorLevel pero devolviendo la versin actual de las extensiones de comando
(Windows_9x es 1 y en Windows_NT es 2), aunque con la particularidad de que tambin nos permite saber si las
extensiones de comando de cmd.exe estn habilitadas poniendo el 1 o el 2:
Tal vez esa sea la mayor utilidad que le podremos dar a esta variable. Recordemos que si las extensiones de
comando no estuviesen habilitadas (solo puede suceder por accin de un malware) significa que la mitad de las
funciones, mejoras y actualizaciones de los comandos se perderan (ver cmd /? )
Para finalizar solo me queda decir que uno de los pocos problemas del if de Batch es que no posee la funcin elif (o
else if) que hay en Bash, PowerShell y otros lenguajes, y que para solucionarlo ser necesario habilitar la expansin
de variable de entorno retardada anidando un nuevo if dentro de otro if, algo que se ver en el apartado de
Expansin de variables retardadas. (Por favor pido que resistan :P).
A modo de repaso voy a dejar un ejemplo de bucle numrico improvisado con if y goto:
@echo off
title Bucle simple
:inicio
set numero=1
set /a resultado=%resultado% + %numero%
if %resultado%==10 (echo Bucle completo && pause && exit) else (goto inicio)
Con esto hicimos que la variable %resultado% (por defecto 0) se le fuera sumando 1 hasta llegar a 10, donde
mostrara el mensaje Bucle completo.
Bucles: For
Estamos ante el apartado ms denso y tal vez ms complicado de este tutorial. FOR es una de las funciones ms
importantes y poderosas que existen para los lenguajes de programacin en general, desde su inicio en el ASM
(Assembler), pasando por Pascal (Delphi), C++, Java, Visual Basic, Ruby, Perl, Python y una infinidad de etcteras.
Posiblemente, aunque el comando FOR en Batch sea poderoso, resulte un poco ms recortado que en otros
lenguajes.
El comando FOR en s es una herramienta muy completa que nos permite crear funciones lgicas mediante bucles,
analizar segmentos y contenidos de archivos o carpetas entre muchas cosas ms.
Si vemos la ayuda (FOR /?), la definicin del comando FOR por defecto es: "Ejecuta el comando para cada uno de
los archivos especificados en el conjunto de archivos."
34
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
La sintaxis aunque parezca compleja, es muy fcil y eficaz de interpretar si se le presta buena atencin:
%%variable = As se declara a una variable en un programa batch; y no, no est mal xD, ya que las variables en el
comando FOR se definen de esta forma, precedidas de dos signos %% (de porcentaje). Al igual que cualquier otra
variable podemos definirla como queramos (%%3 , %%X , %%var) exceptuando a los caracteres especiales no
permitidos (&()[]{}^=;!'+,`~).
IN = Incluye al (conjunto).
(conjunto) = archivos o dgitos con los que queremos trabajar. Representa los parmetros o funciones que usarn
para ejecutar las acciones.
DO = Incluye a las (acciones).
(acciones) = Son el o los comandos que queremos ejecutar para llevar a cabo una o varias acciones. Cada comando
puede llevar sus parmetros, modificadores y variantes.
Ejemplos: ...DO (attrib r h -s %%var) , ...DO (del /f /s /q %%var) , ...DO (echo %%var >> text.txt) ...etc.
Cabe decir que para declarar variables en for existen dos modalidades: una para la lnea de comandos la cual se
hace precedindola con un solo signo de porcentaje (%) y otra para los archivos por lotes, la cual es precedindola
de dos signos (%%) tal como se expuso arriba. Otra cosa muy importante es que el mximo de declaracin de
variables para FOR est limitado a las letras existentes en el abecedario ingls (26) ms los nmeros del 0 al 9. Esto
se debe a que FOR solo toma el primer carcter de una variable declarada, por lo que %%var solo valdr %%v a la
hora de expandirse. Para evitar errores es recomendable usar variables de un solo carcter.
Para dar un mejor ejemplo de alguno de los usos que podemos darle a FOR, imaginemos que nuestra impresora
tuviera soportada la salida PRN para poder imprimir usando el comando print por consola y quisiramos imprimir
un gran nmero de documentos TXT, Word y PDF, la solucin sera la siguiente:
FOR %%a IN ( .\*.txt .\*.doc .\*.pdf ..\*txt ..\*.doc ..\*.pdf ) DO ( print %%a )
Esta instruccin anterior establece para (FOR) la variable %%a sobre el conjunto (IN) del grupo de archivos de
texto de extensin .txt, .doc y .pdf ubicados en el directorio actual (.\) y en el padre (..\), y luego ejecuta la accin
(DO) del comando print, el cual enva a imprimir a todo el grupo de archivos.
Aclaro tambin que no es obligatorio usar .\ para dirigirse a los archivos del directorio actual:
Como se pudo observar, tampoco fue necesario utilizar && para incluir a ms de un comando dentro del DO, ya
que interpreta el salto de lnea como una nueva accin dentro de los parntesis.
Lamentablemente todo esto solo funcionara si los drivers de nuestra impresora soportaran la redireccin del
puerto paralelo (en desuso) hacia el puerto USB, adems de que el comando print posiblemente podra fallar al
identificar el formato de los archivos .doc y .pdf
Este seria otro ejemplo que nos permitira eliminar los archivos de la carpeta Temp (la cual contiene archivos
temporales):
35
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
No quise usar los parmetros /F (forzar) y /S (sistema) para el comando DEL ya que puede haber archivos
temporales en uso que podran ser no convenientes de borrar.
Tambin aclaro que solo puse las extensiones ms usuales que dejan los programas en la carpeta de archivos
temporales, pero si se desea se puede colocar *.* para eliminar todo lo que pueda haber.
FOR tiene muchas utilidades que podemos usar con archivos. Por ejemplo, lo siguiente nos permitira obtener una
lista de los archivos contenidos en el directorio actual:
Tambin podramos pedir que listara solo los archivos de extensin .txt:
En este otro caso solo se listaran las carpetas que contuvieran la letra m en su nombre:
Tambin es posible combinarlo con /D para mostrar los nombres de todos los subdirectorios usando el comodn
dentro del conjunto:
36
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
(1, 1, 10)
Esto hara empezar la secuencia a partir de 1, avanzando de a 1 y terminando en 10. Si lo incorporramos a FOR
generara lo siguiente: 1 2 3 4 5 6 7 8 9 10
De esta forma si pusiramos (0, 2, 10), empezara de 0 avanzando de a 2 hasta el 10, generando la sucesin de 0 2 4
6 8 10
Tambin es posible hacer cuentas regresivas de la siguiente forma: (10, -1, 0)
El nmero de avance al ser negativo generar la sucesin 10 9 8 7 6 5 4 3 2 1 0
Ahora bien, las opciones que podrn usarse para manipular el conjunto especificado son:
eol --> Todo lo que est despus de ste carcter (especificado con eol) ser ignorado (para cada lnea)
delims --> Delims nos sirve para separar strings (cadenas de caracteres), y si no se coloca esta opcin se usarn
como separadores el smbolo espacio o tab de manera predeterminada.
tokens --> Con tokens especificamos qu segmentos (delimitados por "delims") sern pasados a las variables.
Por ejemplo:
1, 2, 3
Solo pasar los primeros 3 segmentos.
1,2*
Pasa 2 segmentos, el primero y todo lo que este despus (el * regresa todo el resto de la lnea)
1,2,3-7.8.9-14,16*
Pasar los tres primeros segmentos, luego saltar al sptimo, seguir has el noveno. Luego saltar al 14, salta al
diecisis hasta que se acaben los segmentos.
11
For /F (tambin llamado burlosamente for five por quienes se desvelan para entenderlo), posee muchas
funciones que requieren leer y releer los textos adems de practicarlos para su correcta comprensin. Tener
paciencia ;)
37
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
Primero que nada debemos saber que esta funcin est siempre deshabilitada de forma predeterminada (ya que
nunca es utilizado en la consola salvo en determinados programas batch con funcionalidades especiales), y que
para habilitarla hay dos formalidades: una para cuando estemos en la propia consola (o sea en tiempo real) y otra
cuando estemos dentro de un programa batch (o sea en un archivo por lotes).
Para la primera formalidad para usar en tiempo real (o sea sin un archivo batch, muy raro que se utilice pero que
muestro para mencionarla) es necesario usar el modificador /V:ON en cmd.exe:
cmd /v:on
Para la segunda formalidad (la aplicada en archivos Batch) solo hay que llamar al comando SetLocal con el
argumento EnableDelayedExpansion desde el mismo archivo batch: (12)
setlocal enabledelayedexpansion
Pero ahora bien vallamos a la prctica, para poder explicar su uso tratar de dar todos los ejemplos que me sean
posibles y espero que les resulte comprensible...
Primero explicar porqu se da esta implementacin. Resulta que si queremos manipular a una misma variable que
se encuentra tanto fuera como dentro de una sentencia de control (como una funcin For que utiliza una variable
previamente declarada), dentro de una sentencia anidada sobre otra sentencia (como un If dentro de otro If), o en
cualquier otra iteracin (repeticin) cmd siempre expandir el primer valor que tuvo la variable, veamos un
ejemplo de este problema con if:
set chupacabras=adelante
if "%chupacabras%" == "adelante" (
echo Corre por tu vida! :0
set chupacabras=atras
if "%chupacabras%" == "atras" (
echo Acabas de escapar! :P
)
)
Como la expansin de variables predeterminada es inmediata, %chupacabras% tendr el valor adelante para
ambas instrucciones if, por lo cual cuando se compare adelante con atrs habr un error de desigualdad.
Y como expresa la ayuda de Set este error tambin ocurre con la sentencia For:
12
Recomiendo ver setlocal /? para ms incormacin.
38
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
La sentencia for %%i in (*) do set LISTA=%%i lista todos los archivos de nuestro directorio pero solo se establecer
en el ultimo archivo encontrado, el cual almacenar en la variable LISTA. Para poder hacer que se vean todos los
archivos, la variable LISTA debe ser previamente declarada para ir acumulando el contenido del resultado de for
por cada archivo encontrado:
Ntese que antes de almacenar %%i se almacena a %LISTA%, la cual contiene el resultado acumulado de cada
bucle hecho por for. Esto debera funcionar si el cmd no tomar como nico valor para la variable %LISTA% al
primer valor declarado, o sea Mis archivos en este directorio son: repitindose el mismo error que suceda en el
ejemplo del if.
Bueno no hago ms ejemplos o me van a querer matar :P ...ahora que tenemos bien aclarados (o eso espero) los
errores que ocurren de forma predeterminada, veremos como solucionarlos usando
setlocal EnableDelayedExpansion (Habilitacin de Retardo de Expansin)
Habilitando la expansin de variables retardadas, la expansin de variables permite usar el carcter de exclamacin
(!) en vez del signo de porcentaje (%) para las variables previamente declaradas y anidadas dentro de otras
subsentencias:
@echo off
title Chupacabras
setlocal enabledelayedexpansion
set chupacabras=adelante
if "%chupacabras%" == "adelante" (
echo Corre por tu vida!
set chupacabras=atras
if "!chupacabras!" == "atras" (
echo Acabas de escapar! ;P
)
)
pause>nul
Ntese que cuando se redeclara la variable (set chupacabras=atras) en el segundo if se expande la variable
encerrndose entre signos de exclamacin (!chupacabras!)
39
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
@echo off
title Mis archivos
setlocal enabledelayedexpansion
pause>nul
Ahora que la variable %LISTA% fue expandida como !LISTA! podr ir acumulando cada resultado mostrado por el
bucle for, almacenando luego todos los nombres de nuestros archivos.
Mis archivos en este directorio son: texto.txt Chupacabras.bat foto.jpg Mis archivos.bat
Para exponer un ejemplo ms avanzado de iteraciones de variables con condicionales if y bucles for, expondr el
siguiente programa que realic como un generador de una lista de tablas de multiplicar:
@echo off
title Tablas de Multiplicar
rem Hecho por nikos3194 para explicar la expansin de variables retardadas
setlocal enabledelayedexpansion
echo.
echo Este programa generara una lista de tablas de multiplicar
echo del 1 al 10 a un archivo de texto definido por el usuario.
echo.
set /P archivo=Indique el nombre para el archivo:
set archivo=%archivo%.txt
set num=0
:ini
rem Es posible reducir esto a set /a num=%num% + 1 && goto bucle
:bucle
echo. >>%archivo%
echo Tabla del %num% >>%archivo%
40
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
:listo
echo.
echo Las tablas de multiplicar fueron generadas y se
echo encuentran en el archivo "%archivo%" ;)
pause>nul
exit
Tabla del 1 Tabla del 2 Tabla del 3 Tabla del 4 Tabla del 5
1x0=0 2x0=0 3x0=0 4x0=0 5x0=0
1x1=1 2x1=2 3x1=3 4x1=4 5x1=5
1x2=2 2x2=4 3x2=6 4x2=8 5 x 2 = 10
1x3=3 2x3=6 3x3=9 4 x 3 = 12 5 x 3 = 15
1x4=4 2x4=8 3 x 4 = 12 4 x 4 = 16 5 x 4 = 20
1x5=5 2 x 5 = 10 3 x 5 = 15 4 x 5 = 20 5 x 5 = 25
1x6=6 2 x 6 = 12 3 x 6 = 18 4 x 6 = 24 5 x 6 = 30
1x7=7 2 x 7 = 14 3 x 7 = 21 4 x 7 = 28 5 x 7 = 35
1x8=8 2 x 8 = 16 3 x 8 = 24 4 x 8 = 32 5 x 8 = 40
1x9=9 2 x 9 = 18 3 x 9 = 27 4 x 9 = 36 5 x 9 = 45
1 x 10 = 10 2 x 10 = 20 3 x 10 = 30 4 x 10 = 40 5 x 10 = 50
Obviamente las encerr en cuadros de texto para economizar el largo de la hoja, adems solo agrego hasta la tabla
del 5 asumiendo que los lectores ya las deberan conocer completas. :P
Polimetra
Este apartado es una pequea continuacin del apartado anterior. La polimetra es la combinacin o anidacin de
dos o ms variables entre si. Para explicarlo vamos a ver un ejemplo:
@echo off
title Extraccin de caracteres
setlocal enabledelayedexpansion
set variable=!variable:~1,%n%!
echo.
echo %variable%
41
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
Como podemos observar, se ha anidado la variable %n% dentro de !variable! . En este caso se utiliz para extraer
un nmero de caracteres indicados por el usuario. As como este caso, podemos ver otro ejemplo con un bucle for:
@echo off
title Apareciendo
setlocal enabledelayedexpansion
set "var=apareciendo"
a
ap
apa
apar
apare
aparec
apareci
aparecie
aparecien
apareciend
apareciendo
Si a esto le aadiramos el comando CLS y el comando timeout (para reducir la velocidad), hara un efecto bonito
para mostrar texto corredizo en la pantalla ;)
Subrutinas
Bueno, aqu lo que yo llamo subrutinas en Batch no son las mismas clases de subrutinas que comnmente se ven
en el resto de lenguajes de programacin, como en el caso de Bash o Python. Pero podran llamarse Subrutinas si
as lo queremos xD
Call
Call puede llamar a un archivo bat externo como un subprograma, aunque tambin es posible usar call llamando a
una etiqueta. Call es un comando que podemos utilizar para la programacin modular.
42
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
Shift
Shift alterna la posicin de los parmetros en un archivo bat. Gracias a la ayuda de este podremos utilizar ms de
10 parmetros reemplazables numerados de 0 a 9, en las lneas de comando, marcando una diferencia de una
posicin para cada SHIFT que se introduce.
El signo % seguido de un nmero (del 1 al 9) son los parmetros que se pasaron al invocar nuestro programa bat.
Por ejemplo si tenemos un programa llamado saludo.bat con lo siguiente:
@echo off
echo Hola %1 , como estas?
pause>nul
As como %1 representa al primer parmetro con que fue invocado el bat, %0 representa el nombre del archivo bat
en ejecucin (o sea al mismo saludo.bat) y %# representa a todos los parmetros que se le pasaron (# pertenece al
intervalo del 1 al 9)
@echo off
:cita
echo %3 %4 %5 %1 %2
Con call :cita llamamos a la etiqueta :cita , y en la etiqueta :cita vemos que seguido del comando echo se imprimen
unos parmetros en un orden determinado, podemos observar que los primeros parmetros son el 3, el 4 y el 5, y
que luego vienen el 1 y el 2. Este orden cambiara la frase de Estudiar batch es algo agradable por es algo
agradable Estudiar batch.
Como vemos, el comando call establece un contenido para una etiqueta que luego puede ser interpretado
mediante parmetros, y nosotros podemos ordenar cuales parmetros queremos pasar antes o despus.
Los parmetros tienen muchas utilidades y se pueden usar por ejemplo para pasar nombres de archivos a un bat
que se encarga de borrarlos, moverlos, etc.
El signo %0 representa el nombre del archivo bat en ejecucin. El signo %* representa todos los parmetros que se
le pasaron.
43
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
La sustitucin de los parmetros del archivo por lotes (%n) ha sido ampliada. Ahora puede usar la siguiente
sintaxis opcional:
Macros DosKey
Anteriormente hemos visto que el comando doskey permite recorrer historiales con los comandos usados en la
consola mediante teclas de funcin (F7, F8, F9, etc.). Otra de las funcionalidades de doskey es la de crear macros.
Una macro es un conjunto de uno o ms de comandos que se pueden ejecutar llamndolos mediante una clave. La
principal ventaja de las macros creadas con doskey es que se almacenan en memoria con lo cual su ejecucin es
ultrarrpida aunque con la nica desventaja de que las macros duran solo durante una sesin de la ventana del
smbolo de sistema (aunque es posible dejarlas guardadas en un archivo batch).
doskey nombre_macro=comando
doskey n=netstat /a /n /o
44
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
Cuando pulsemos la tecla n seguido de enter, estaremos usando netstat para listar las direcciones y puertos
abiertos (-a) en formato numrico (-n) con su PID o identificador de proceso (-o), pero ahora preguntarn: porqu
cambie el guin - por un slash / ? (lo correcto sera netstat ano), esto se debe a que doskey no funciona bien
con las opciones que son precedidas por guiones, por lo que para ms compatibilidad ser necesario cambiarlos
por /.
Igualmente hay una solucin para esto que es bastante simple: usar el comodn de control ^ para los caracteres
especiales, lo cual nos permitir adems poder usar && para agrupar comandos:
Esto nos permitir usar netstat de la misma manera y en conjunto con el comando ipconfig /all con solo pulsar n.
Ahora bien, un tema interesante es que doskey posee una codificacin especial para usar en sus macros.
Por ejemplo si quisiramos crear un pseudo comando que cree un directorio y luego pase al mismo, con la
siguiente instruccin podramos hacerlo:
doskey mc=md $1 $T cd $1
Obteniendo lo siguiente:
mc Carpeta
C:\Carpeta>_
El $1 es igual a %1 y indica el primer parmetro pasado, o sea el nombre del directorio Carpeta, $T es igual a && y
permite adjuntar al comando cd de la misma manera que ^&^&.
Aqu una tabla descriptiva con los cdigos soportados por Doskey:
Cdigo Significado
$G o $g Redirecciona la salida de los datos a un sitio o archivo. Equivalente a >
$G$G o Redirecciona la salida de los datos a un archivo pero sin sobrescribirlo. Equivalente a >>
$g$g
$L o $l Redirecciona la entrada de datos desde un dispositivo o archivo. Equivale a <
$B o $b Enva el resultado de la macro a otro comando para su ejecucin. Equivalente a |
$T o $t Separa comandos y permite su ejecucin secuencial. Equivalente a &&
$$ Especifica el signo $ en caso que sea necesario.
$1 a $9 Equivalente a los parmetros en los archivos por lotes (%1 ~ %9), y representa cualquier
informacin que deba ser introducida por el usuario de la macro.
$* Representa a todos los parmetros pasados a la macro.
Lo siguiente servira para volver a cargar el archivo con las macros guardadas anteriormente:
doskey /macrofile=mis_macros.bat
Finalmente si lo deseamos, usando Alt+F10 podemos borrar todas las macros generadas para la sesin de cmd.exe.
45
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
Extras
46
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
partir del DOS 6.22 y luego fue vuelto a reemplazar por el comando COMPACT en las versiones actuales de
Windows NT.
DEBUG - Lanzaba el programa de debugging (eliminacin de errores). Debug siempre estuvo reservado a los
expertos, aunque tena varias funciones utiles para archivos batch. Luego de casi 30 aos de uso fue eliminado por
obsoleto en Windows 7.
DEFRAG A partir del DOS 6 desfragmentaba los archivos en el disco duro para mejorar la velocidad y la seguridad
de lectura.
DELOLDOS - Suprima la puesta en reserva de un DOS antiguo.
DELTREE Era un comando que suprima un directorio y todo lo que pudiera contener, incluyendo los
subdirectorios, en una sola operacin. Esto hizo que fuera un comando peligroso usado por virus por lo que fue
removido.
DEVICE - Instalaba un driver de perifrico, por medio del Config.sys.
DEVICEHIGH Ayudaba a cargar un administrador en memoria superior, por encima del lmite de los primeros 640
KB.
DISKCOMP - Comparaba el contenido total, pista por pista y sector por sector, de dos disquetes
del mismo tipo. Era un comando muy lento de utilizar.
DISKCOPY - Copiaba de modo idntico el contenido de un disquete fuente en un disquete destinatario
rigurosamente del mismo formato, formateando previamente este ltimo y hacindolo sobre el modelo del
disquete fuente si es necesario. Sola dar muchos errores.
DISPLAY.SYS - Se utilizaba para conmutar las tablas de cdigos, va el Config.sys.
DOS - Estableca un vnculo en la memoria usual y la memoria superior a travs del config.sys.
DOSSHELL - Llamaba a la superestructura de dilogo del DOS. Este shell fue suprimido en la versin DOS 6.2 ya que
Microsoft consider que haba sido reemplazado ventajosamente por el administrador de archivos de Windows
Explorer.exe.
DRIVER.SYS - Administraba las disqueteras a travs del Config.Sys.
DRIVPARM - Defina los parmetros de perifricos en modo bloque a travs del Config.Sys.
EMM386 - Simulaba la memoria expandida en la memoria extendida a travs del Config.sys.
EXE2BIN Un comando bastante til en su momento. Serva para convertir el formato .EXE en .BIN o .COM,
haciendo que los programas usarn menos espacio en memoria y fueran ms compatibles. Este comando estaba
destinado a los programadores.
EXPAND - Descomprime un archivo comprimido CAB. An se contina utilizando.
FASTHELP - Mostraba en pantalla la ayuda de los comandos de MS-DOS 6.
FASTOPEN - Proporcionaba un acceso rpido a los archivos que se usan con ms frecuencia, o a los ltimos que se
han utilizado, memorizando su camino de acceso.
FC Permite comparar de archivos. No estuvo disponible en todas las versiones.
FCBS - Especificaba la cantidad de bloques de control de archivos en el Config.Sys.
FILES - Especificaba la cantidad de archivos abiertos en el Config.Sys.
GRAFTABL - Cargaba la tabla de los caracteres grficos, los cdigos ASCII 128 a 255, para la visualizacin en
pantalla. No se us ms pero fue conservado por compatibilidad.
GRAPHIC - Cargaba una secuencia que permite la impresin de la pantalla que incluye caracteres grficos, de
cdigos ASCII 128 a 255.
GWBASIC - Llamado del antiguo Basic avanzado de Microsoft. No existio ms ya que fue reemplazado por el QBasic.
HELP - Pedido de ayuda de comandos a partir del DOS 5.
HIMEM.SYS - Administrador de memoria extendida, an se usa por compatibilidad.
INCLUDE - Inclua un bloque de configuracin en otro a travs del Config.Sys.
INTERLNK - Conectaba dos computadoras en red, por medio de sus puertos paralelos o en serie.
JOIN - Asignaba el contenido de un disco a un directorio de otro disco. No existe ms.
KEYB - Cargaba el programa que administrara el teclado (reemplaba al que reside en la memoria muerta, para el
teclado de USA).
LASTDRIVE - Define la cantidad de unidades de disco en el Config.Sys.
LINK - Llamaba al editor de conexiones. Reservado a los programadores.
LOADFIX - Cargaba un programa por encima de los primeros 64 Kb de memoria.
47
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
LOADHIGH - Cargaba un programa en la memoria superior a travs del autoexec.bat a partir del DOS 5. Su otro
nombre era LH.
MEM - Muestra en pantalla la memoria ocupada y la disponible, disponible hasta Windows XP.
MEMMAKER Permita la administracin y optimizacin de la memoria desde DOS 6.
MENUCOLOR - Determinaba el color de texto y fondo para el primer men desde Config.Sys.
MENUDEFAULT - Especificaba el men por defecto en el inicio.
MENUITEM - Defina un tem del men de arranque.
MIRROR - Copia de seguridad para el seguimiento del borrado de archivos con el DOS 5.
MODE - Estableca las condiciones de funcionamiento de los perifricos, impresora, interfase de video y conexiones
en serie, tambin servia para la preparacin de las tablas de cdigos. Fue conservado por compatibilidad en las
versiones de NT.
MSBACKUP - Procedimiento de copia de seguridad en el DOS 6.
MSD Provea informacin tcnica sobre la computadora en el DOS 6.
NLSFUNC - Comando relativo a los idiomas nacionales. Su nombre proviene de Nacional Languages Support
Function. Da informaciones complementarias sobre los pases y preparaba el uso de las tablas de cdigos con
CHCP.
PAUSE - Suspenda la ejecucin de un programa .BAT mostrando en pantalla un mensaje optativo de 121
caracteres como mximo. Actualmente fue modificado y ya no permite mostrar mensajes opcionales.
POWER - Pona o sacaba de servicio la administracin del consumo de energa.
PRINT - Imprime el contenido de archivos, en segundo plano, mientras se prosigue con un trabajo en la
pantalla. Fue conservado por compatibilidad.
PRINTER.SYS - Se usaba para conmutar las tablas de cdigos con las impresoras en Config.Sys.
QBASIC - Fue el nuevo lenguaje Basic de Microsoft en el DOS 5. Reemplazado por Visual Basic.
RAMDRIVE - Instalaba un disco virtual a travs del Config.Sys.
RECOVER - Interviene cuando hay que recuperar los datos de un archivo porque hay un sector defectuoso en el
disco. Los datos de este sector se habrn perdido. Se conserv en Windows NT.
RESTORE Restaura el contenido de un disco a partir de su copia de seguridad anterior, con los DOS hasta el 5
inclusive. Posteriormente slo existi por compatibilidad.
SETVER - Declaraba las versiones del DOS para algunas aplicaciones.
SHARE - Instalaba el programa para compartir archivos en red.
SHELL - Instalaba un procesador de comandos.
SHIPDISK - Bloqueaba los cabezales del disco duro antes de desplazarlo. Desapareci en DOS 6.
SMARTDRV - Creacin de la ante memoria de disco SmartDrive en DOS 6.
STACKS - Defina las pilas a travs del Config.Sys.
SUBMENU - Defina un tem del men de arranque abriendo un submen a partir del DOS 6.
SUBST - Sustituye un camino de acceso cuya ruta y/o descripcin es larga, por una unidad de disco ficticia que
bastar con llamar luego. An contina utilizndose.
SWITCHES - Sustitua al teclado extendido por el teclado convencional.
SYS Comando que copiaba los tres archivos que sirven de ncleo al sistema del disco fuente activo a un disco
destinatario.
UNDELETE - Recuperacin de archivos borrados. Reemplazado por RECOVER.
UNFORMAT - Reconstruccin de un disco reformateado a partir del DOS 5 (dej de existir).
VDISK - Instalaba un disco virtual, a travs del Config.Sys. Dej de existir en DOS 6.
VER - Muestra en pantalla la versin activa del sistema.
VOL - Muestra en pantalla el nombre del disco actual o el del solicitado.
XCOPY - Copia archivos selectivamente, inclusive los que provienen de subdirectorios. Es un comando excelente
que sirve para efectuar copias de seguridad.
48
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
49
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
Migracin bsica
Tabla de comparacin de comandos entre Batch y sus equivalentes en Bash (Unix/Linux): (13)
50
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
51
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
A partir de esta tabla podramos crear una lista de alias que nos permita usar el equivalente de cada comando sin
tener que rememorizarlos. Los alias pueden ser guardados en el archivo de perfil de Bash .bashrc en la carpeta
personal del usuario, o sea que se encuentra generalmente en la ubicacin $HOME/.bashrc.
Esta sera una sucinta lista de algunos de los comandos ms usuales y sus equivalentes:
52
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
alias
alias dir=ls -lF
alias del=rm
del=rm -iv
alias move=mv
move=mv -iv
alias rename=mv
rename=mv -iv
alias copy=cp
copy=cp -piv
alias type=cat
type=cat
alias cls=c
cls=clear
alias
alias mem=free
mem=free
alias ver=uname
ver=uname -a
alias C:=cd
C:=cd /
Aunque pensndolo bien, lo mejor sera aprender los comandos de Linux y dejar la costumbre de usar cmd.exe, por
lo que es ms recomendable mostrar un mensaje mencionando la sintaxis correcta de cada uno de los comandos:
Tabla de comparacin entre operadores de consola Batch (cmd.exe) y Bash (Bourne Again Shell):
53
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
54
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
Python es un lenguaje mas fcil que C, pero a su vez es tan poderoso como C, Python adems puede ser utilizado
como una potente calculadora. Yo ahora me voy a basar en un entorno UNIX like como el caso de GNU/Linux
Ubuntu para variar un poco del entorno de Windows (comnmente usado por la mayora).
Primero debemos tener instalado Python, siendo que en Linux ya viene instalado en especial en todas las
distribuciones derivadas de Devian. En Windows la instalacin es bastante fcil, en la pgina de
http://www.python.org/download/ se puede bajar la ltima versin del interprete de Python para cada plataforma.
Conceptos bsicos
Ahora vamos a hacer lo primero que se hace con cualquier lenguaje que se aprende: un Hola Mundo :P
Primero abrimos nuestro editor de cdigo favorito (recomiendo PyScripter, Kate o Notepad++) La sintaxis es fcil:
Luego lo guardamos con el nombre y la extensin hola_mundo.py (recomiendo reemplazar los espacios por el
guin bajo en los nombres de archivos python para hacerlos mas accesibles desde la consola) y luego desde la
consola Bash o el CMD tecleamos:
$ python hola_mundo.py
Al dar intro aparecer el tpico mensaje Hola mundo!, al haber tipeado python al principio estoy llamando al
interprete a que ejecute el archivo personalmente, para poder hacer que el archivo se ejecute con un doble clic hay
que agregar la siguiente lnea al principio del cdigo:
#!/usr/bin/python
python hola_mundo.py
55
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
Ademas en UNIX*/Linux hay que decirle al archivo que es ejecutable mediante la orden:
Ahora para definir una variable, se pone cualquier nombre sin espacios ni caracteres especiales y su valor
encerrado entre comillas seguido del igual, luego se convoca a la variable por el nombre definido:
Las variables de python son mucho ms elegantes que en batch, aunque parecidas en que se pueden usar para
hacer clculos, pero mucho mas potentes:
Tambin hay muchas funciones especificas como len() cuya funcin es medir la cantidad de caracteres de una
cadena de texto, en este caso la variable mensaje:
len(mensaje)
10
Los comentarios en Python se definen con # (numeral), y en este caso agrupamos la variable en el mensaje,
saludando a una persona:
# Saludando a pepe
nombre = Pepe
print Hola, nombre # El texto esta entre comillas y la variable afuera
Para que una variable pueda ser definida por el usuario se utiliza el comando raw_input(Ingrese un valor: ) que
vendra a ser como el Set /P Ingrese un valor: en batch, puede ponerse input() solo el texto seria tratado como un
valor de variable en memoria y no como una cadena de texto (string) como lo define el prefijo raw_, ac se
combinara raw_input() adentro de una variable:
#!/usr/bin/python
# Saludando a una persona
nombre = raw_input(Como te llamas? )
print Hola, nombre
print y tu nombre tiene, len(nombre), letras.
Esto devolvera:
56
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
Al programa podramos agregarle un condicional con la sentencia IF (igual que en batch), para en caso de que el
usuario no ingrese un nombre, hay que notar que tanto if como else llevan el signo dos puntos al final para
sealar las acciones (en batch se usaban opcionalmente parntesis):
#!/usr/bin/python
# Saludando a una persona
nombre = raw_input(Como te llamas? )
if nombre == :
print No me das tu nombre?... No te saludo.
else:
print Hola, nombre
print y tu nombre tiene, len(nombre), letras.
En programacin, y ms dentro de Python hay muchas maneras de resolver un mismo problema, por ejemplo las
cadenas de texto anteriores yo las separe de las variables usando comas, pero se pueden juntar con el smbolo mas
(+):
Nos podemos fijar que a len la tuve que poner dentro de str(), la cual dice que el valor de len no es para sumarse
(por los signos), sino que es una cadena de texto (string); por ejemplo las partes textuales del script de arriba al
estar encerradas entre comillas se definen como cadenas o strings, si no tuvieran las comillas se definiran como
valores y no se procesaran.
Para explicar mejor esto voy a dar un ejemplo, as que abrimos una consola de Python y en el prompt tipeamos lo
siguiente:
>>> 11 + 11
22
>>> 11 + 11
1111
La diferencia se nota en que estando sin comillas las reconoce como variables y las procesa como valores, por lo
que si en ves de nmeros fueran texto dara un error diciendo que las variables no estn definidas, en cambio en el
ultimo ejemplo al tener las comillas conserva los caracteres juntndolos sin procesarlos si no hay orden explicita.
Una funcin avanzada de Python es la de poder crear funciones, esto se hace con el comando DEF que vendra a ser
una variable capaz de almacenar grupos de comandos enteros, por ejemplo se puede poner un string determinado:
def no_saludar()
print No me das tu nombre?... No te saludo.
if nombre == :
no_saludar()
57
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
En este caso anterior definimos la funcin no_saludar() y la colocamos en el if , la funcin def es muy til cuando
hay que repetir muchas veces un segmento de cdigo extenso en un programa.
Seguramente se preguntarn para que se dejan los parntesis si no tienen nada, y en realidad esto es por
convencin, los parntesis son para pasar argumentos determinados a las funciones, aunque esto es algo ms
complicado (y este tutorial es solo introductorio).
Un ejemplo de uso de FOR es con una lista contenida en una variable, por ejemplo:
Esto mostrara:
A partir de ahora el tutorial podra extenderse con ms funciones, pero creo que para ser una pequea
introduccin con esto ser suficiente, aunque no me gustara terminar sin antes mencionarles a todos los
programadores de Batch que estn buscando migrar a este mejor lenguaje, la existencia del modulo OS.
Este modulo nos permite ejecutar comandos de sistema y programas externos, y se llama mediante el
comandoimport de la siguiente forma:
import os
#!/usr/bin/python
import os
os.system("ping http://www.google.com")
time.sleep(10)
os.system("ping http://www.yahoo.com")
Lo que hara el cdigo anterior sera mostrar el resultado de dos ping (a Google y Yahoo) con un tiempo intermedio
de espera de 10 segundos. Obviamente este cdigo no tiene una utilidad muy prctica, pero muestra bsicamente
como funciona el mdulo OS: primero importamos el mdulo y luego llamamos los comandos o programas que
precisemos mediante la sentencia os.system("comando o programa")
Un ejemplo ms concreto pero avanzado para aquellos que vienen de programar en Batch sera la realizacin de un
simil "bot" para generar visitas a lo que por ejemplo podra ser un sitio o un vdeo determinado. Este cdigo que yo
realic y coment estara orientado a abrir un vdeo en Windows usando el navegador Mozilla Firefox (siendo este
el navegador predeterminado) y reproducirlo durante 5 segundos o menos para luego cerrarlo y volverlo a abrir
durante 200 veces, lo que generara 200 reproducciones:
#!/usr/bin/python
import os # Llamamos al modulo os
58
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
# En caso de que Firefox no fuera el navegador por default, podemos usar lo siguiente:
# os.system("%ProgramFiles%\Firefox\firefox.exe http://www.youtube.com/watch?v=Bh5W_R5BwqI")
# Cerramos la instancia de firefox que tenga YouTube en el nombre de ventana (ver taskkill /?)
os.system("TASKKILL /F /IM:firefox.exe /FI "WINDOWTITLE ne YouTube" > nul")
# Se comprueba que la variable numero no halla llegado a 200 (el lmite) y en caso de hacerlo se
# pide que se renueve la direccin IP y eliminar las cookies para no ser banneados por youtubi :P
if numero == 200:
print "lmite de 200 reproducciones" && print "Renueve su IP y borre las cookies!" && break
else:
goto .volver
# En caso de que el condicional (if) no sea cierto (else), la sentencia goto vuelve a repetir el cdigo.
Un apunte importante (porque me haban preguntado al respecto) es que en python es usado el punto y coma (;)
para agrupar barios comandos en una sola lnea de cdigo, como el "&&" usado en Batch o Bash.
Podra haber puesto ms ejemplos, pero como dije antes no quisiera extender ms all a este tutorial
introductorio.
59
Tutorial de programacin Batch ms migracin a Bash e introduccin a Python nikos3194
EOF
End Of File.
Este tutorial no se termin: contina en google... Busquen!, que hallar la informacin para ampliar su
conocimiento siempre quedar en sus propios criterios de perseverancia.
Salu2 a to2
nikos3194.
https://sites.google.com/site/nikos3194rfcindex/home/batch
60