Documentos de Académico
Documentos de Profesional
Documentos de Cultura
HACK HiSPANO
INTRODUCCIN
El nivel del texto es bajo-medio, pero tendras que saber al menos "algo" del MS-DOS para poder
"avanzar" en este texto.
Sufr un pequeo problema con el texto, por lo que quizs falte algn que otro punto. Me
explico: puede que algunas frases queden as Como has visto, falta un punto al final de la frase
:) De todas formas, me he preocupado especialmente de que no falten puntos en los cdigos.
Otra cosa: no hay ningn acento o ee en el texto (Nota: Corregido en esta versin). Es por
motivos de compatibilidad. Quizs mi UTF8 se os atraviese. Tambin me he preocupado de no
excederme de las 79 columnas. Espero que estas precauciones funcionen.
Este artculo se supone que debe ser publicado por SET. Me lincharan si ven que lo he publicado
en otro sitio... o no.
No os asustis por el tamao del texto, ms de la mitad son ejemplos, listados creados por los
propios programas, refritos de otros documentos, etc. De todas formas, os aviso: yo cuando
escribo un texto puedo llegar a ser *extremadamente* pesado. Fjate si el texto es un tostn,
que no me lo he ledo ni yo, que ya es decir :D
Este articulo tiene grandes dosis de humor espaol y andaluz, as que si te cuesta trabajo
entender algn concepto, contact me, contact me... Cmo que "que"? Que me contactes
cojones, es que nadie sabe ingles aqu o qu?
NDICE
1) NOCIONES BSICAS SOBRE EL MS-DOS
a) Comandos principales del DOS
DIR
CD o CHDIR
ECHO
COPY
MOVE
DEL
REN
MD
RD
EXIT
SET
ATTRIB
LABEL
TITLE
TREE
MAKECAB
EXPAND
MORE
2) PROGRAMACION DE ARCHIVOS BATCH
a) Un echo sencillo
b) Los argumentos
c) Redireccin simple
d) Alias
e) Ms redireccin
Redireccionador >
Redireccionador >>
Redireccionador <
Redirecionador |
f) Comando IF
IF EXIST Archivo comando
IF NOT EXIST Archivo comando
IF [NOT] %1=Parmetro comando
IF [NOT] Variable=Valor comando
IF [NOT] ERRORLEVEL Nmero comando
Estructuras IF
g) Etiquetas y GOTO
h) Lo importante es poder elegir
i) Comando FOR
j) Otras rdenes
REM y los comentarios
START
3) EJEMPLOS
a) Ejemplo 1
b) Ejemplo 2
c) Ejemplo 3
d) Ejemplo 4
4) APNDICE
a) TIPS de cmo usar el intrprete de comandos y el batching
b) ARCHIVOS EXTRAOS que nadie debera conocer
CON
NUL
LPTx
COMx
AUX
PRN
c) CARACTERES EXTRAOS que hacen cosas raras
d) FUNCIONES INDOCUMENTADAS DEL DOS, o las cosas que no debieron salir de Microsoft.
TRUENAME (NO funciona en NT)
COMMAND IF (no estoy seguro si funciona en NT supongo que s)
VER /R (NO funciona en NT)
FORMAT AUTOTEST (NO funciona en NT))
FORMAT /U (S funciona en NT, segn lo que entiendan por funcionar)
FORMAT /Z (NO funciona en NT, ya hay otra funcin documentada)
DIR, (NO funciona en NT)
DEL. (SIIIIII funciona en NT)
5) NOTA SENTIMENTAL
Estaris de acuerdo conmigo en que el diseo del ndice es una mierda, verdad?
DIR
Genera una lista con los archivos de la carpeta. Ejemplo:
Z:\>dir
El volumen de la unidad Z es Nost
El nmero de serie del volumen es: 8408-2412
Directorio de Z:\
28/10/2006 15:35 <DIR>
28/10/2006 15:35 <DIR>
21/10/2006 20:56
5.253.290 Actualizado.txt
24/10/2006 15:49 <DIR> Archivos de programa
28/10/2006 14:59
597 Creacin de archivos Batch.txt
14/10/2006 23:22 <DIR> deCFS
15/10/2006 00:54 <DIR> Discos
14/10/2006 23:25 <DIR> Documentos
15/10/2006 14:51 <DIR> Documentos sueltos
15/10/2006 11:47 <DIR> Haxor
22/10/2006 01:19 <DIR> Imgenes de CD
20/10/2006 00:38 <DIR> Imgenes sueltas
22/10/2006 02:22 <DIR> Instaladores
28/10/2006 14:37
24 irs.txt
22/10/2006 08:08 <DIR> Juegos
23/10/2006 17:12 <DIR> Mi msica
25/10/2006 20:22 <DIR> Mviles
14/10/2006 23:28 <DIR> Msica suelta
21/10/2006 10:01 <DIR> Partidas guardadas
27/10/2006 15:05
26/10/2006 17:06
23/10/2006 23:13
22/10/2006 22:25
15/10/2006 12:22
6 archivos
20 dirs
CD o CHDIR
Cambia el directorio actual, es decir, con el que estamos trabajando. Su funcionamiento es: cd
nombre del directorio. Ejemplo:
Z:\>cd Imgenes de CD
Z:\Imgenes de CD>
Para comprobar si lo hemos hecho bien, siempre nos quedara DIR ;)
Z:\Imagenes de CD>dir
El volumen de la unidad Z es Nost
El nmero de serie del volumen es: 8408-2412
Directorio de Z:\Imgenes de CD
22/10/2006 01:19 <DIR>
22/10/2006 01:19 <DIR>
10/09/2006 22:29
788.886.672 CT3.mdf
10/09/2006 22:29
2.850 CT3.mds
12/09/2004 23:55
1.618.176 Sims2.MDF
12/09/2004 23:55
486 Sims2.MDS
4 archivos
790.508.184 bytes
2 dirs
805.019.648 bytes libres
Perfecto!
ECHO
Muestra un texto en la pantalla. Funcionamiento: echo texto a mostrar. Ejemplo:
Z:\Imagenes de CD>echo Esto es una prueba
Esto es una prueba
Otra forma es ECHO OFF, esto hace que los comandos que se van ejecutando de un archivo
batch, no se muestren en pantalla. Para usarlo, hay que ponerlo como primera lnea del archivo,
o por lo menos, desde el momento en el que quieres que dejen de verse los comandos.
ECHO ON har que vuelvan a aparecer los comandos que se ejecutan.
Si lo que se quiere es que un comando puntual no se muestre, se aade @ al principio:
@copy archivo1 archivo2
Por lo tanto, es recomendable en vez de poner ECHO OFF, poner @ECHO OFF. La mayora de
los batch empiezan con esa lnea.
Mucha gente hace la misma pregunta: cmo poner una lnea en blanco? Hay varias maneras
de hacer esto. La principal es:
echo.
Pero hay ms:
echo,
echo:
echo;
echo[
echo]
echo(
echo)
echo/
Aun as hay muchos ms, aunque creo que con te aprendas una de ellas...
COPY
Copia un archivo. Funcionamiento: copy archivodeorigen.ext archivodedestino.ext.
Recuerda: si el archivo contiene espacios, entrecomilla los nombres.
copy "Archivo de origen.extension de archivo" "Archivo de destino.idem"
MOVE
Mueve un archivo. Funcionamiento: move archivodeorigen.ext archivodedestino.ext.
Realmente el funcionamiento de este comando es equivalente copiar el archivo en la nueva
ubicacin, y luego eliminar el anterior.
DEL
Elimina un archivo. Funcionamiento: del nombredearchivo.ext.
REN
Renombra un archivo. Funcionamiento: ren nombreoriginal.ext nombrecambiado.ext.
MD
Crea una carpeta. Funcionamiento: md nombredecarpeta.
RD
Elimina una carpeta. Funcionamiento: rd nombredecarpeta.
EXIT
Sale del programa. Funcionamiento: exit va solo, sin argumentos. Hace que el archivo batch
acabe, aunque haya ms comandos despus. Tambin acepta un argumento muy importante:
exit /b
Si lo usas, la ventana MS-DOS slo se cerrara si invocaste el archivo batch desde el explorador
de Windows. Si lo llamaste desde cmd.exe, la ventana no se cerrara, lo que es una ventaja.
Espero haberme explicado bien.
SET
Maravillosa E-Zine, y comando que establece y muestra las variables de entorno.
Funcionamiento: para ver las variables a las que ya se les ha dado un valor, escribe SET sin
parmetros:
C:\>set
ALLUSERSPROFILE=C:\Documents and Settings\All Users
APPDATA=C:\Documents and Settings\Administrador\Application Data
CLASSPATH="o\QTJava.zip"
CLIENTNAME=ConsoleCommonProgramFiles=Z:\Archivos de programa\Archivos comunes
COMPUTERNAME=NOSTComSpec=C:\WINNT\system32\cmd.exe
HOMEDRIVE=C:
HOMEPATH=\Documents and Settings\Administrador
LOGONSERVER=\\NOST
NUMBER_OF_PROCESSORS=1
OS=Windows NT
Path=C:\WINNT\system32;C:\WINNT;C:\WINNT\System32\Wbem;C:\Archivos
programa\ATI Technologies\ATI Control Panel
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.TXT;.CAB
PROCESSOR_ARCHITECTURE=x86
PROCESSOR_IDENTIFIER=x86 Family 6 Model 6 Stepping 2, AuthenticAMD
PROCESSOR_LEVEL=6
PROCESSOR_REVISION=0602
programfiles=C:\Archivos de programa
PROMPT=$P$G
QTJAVA="o\QTJava.zip"
root=c:\
SESSIONNAME=Console
SystemDrive=C:
SystemRoot=C:\WINNT
TEMP=C:\DOCUME~2\ADMINI~1\CONFIG~1\Temp
TMP=C:\DOCUME~2\ADMINI~1\CONFIG~1\Temp
USERDOMAIN=NOST
USERNAME=Administrador
USERPROFILE=C:\Documents and Settings\Administrador
windir=C:\WINNT
de
Si solo quieres ver el contenido de una variable, se escribe sola, despus de set:
C:\>set PROCESSOR_IDENTIFIER
PROCESSOR_IDENTIFIER=x86 Family 6 Model 6 Stepping 2, AuthenticAMD
Si lo que quieres es modificar una variable de entorno, o crear una nueva, se usa as: set
variable=valor. Pongamos un ejemplo:
C:\>set variable=valor
No me lo he currado mucho :) ahora ponemos set, y vemos el resultado:
C:\>set
ALLUSERSPROFILE=C:\Documents and Settings\All Users
APPDATA=C:\Documents and Settings\Administrador\Datos de programa
...me lo salto...
USERPROFILE=C:\Documents and Settings\Administrador
variable=valor <<< AQU TENEMOS LA NUESTRA!!! :D
windir=C:\WINDOWS
Aunque la variable "variable" ha sido la ltima en aadirse, est ordenado alfabticamente, as
que se queda la penltima.
ATTRIB
Cambia los atributos de un archivo o directorio. Funcionamiento: para ver los atributos de todos
los archivos de la carpeta actual, se pone ATTRIB sin atributos:
Z:\>attrib
A
A
A
SH
A
R
A
A
Z:\Actualizado.txt
Z:\Creacion de archivos Batch.txt
Z:\Desktop.ini
Z:\Common.pswd
Z:\Satisfucktion.ymx
Z:\Visual Hacker 98.txt
A: El archivo est listo para archivar, es complicado? Si se hace una copia de seguridad, el
atributo se quita de todos los archivos copiados. En cuanto se modifican, se vuelve a establecer
este atributo, indicando que en la prxima copia se tiene que actualizar el archivo, ya que ha
cambiado. Nombre completo: Archive (Archivar).
S: El archivo es de sistema. La mayora de los archivos con ese atributo son necesarios para
Windows. En este caso Desktop.ini establece el icono de la carpeta. Nombre completo: System
(Sistema).
H: El archivo est oculto. Estos archivos no se ven con un simple dir, y Windows los oculta de
forma predeterminada. Para cambiar esto, hay que ir a Herramientas > Opciones de Carpeta >
Ver > Mostrar todos los archivos y carpetas ocultos (Si usas W9x, en vez del Men >
Herramientas, es el Men > Ver). Nombre completo: Hidden (Oculto).
R: El archivo es de solo lectura, aunque eso no impedir que se cambie el contenido,
simplemente se ponen ms impedimentos. Nombre completo: Read-Only (Solo lectura).
Para cambiar un atributo: attrib archivo +atributoaa~adir atributoaquitar. Ejemplo:
Z:\>attrib Desktop ini +R -S -H
Los atributos ya se han cambiado, si pones attrib veras el resultado:
Z:\>attrib
A
R
Z:\Desktop.ini
LABEL
Cambia la etiqueta de volumen de un disco. Funcionamiento: escribe label sin parmetros para
conocer la etiqueta y tener la opcin de cambiarla:
C:\>label
El volumen de la unidad Z: es Nost
El nmero de serie del volumen es 8408-2412
Escriba una etiqueta de volumen (Entrar para ninguna)
Si le metes un argumento, este ser la nueva etiqueta de volumen de la unidad actual:
C:\>label Chpame el huevo izquierdo
Recuerda que solo NTFS admite ms de 11 letras en la etiqueta.
TITLE
Cambia el ttulo de la ventana MS-DOS. Funcionamiento: title ttulo de la ventana. Por ejemplo:
@echo off
title Programa al que *NUNCA* se le ocurrira borrar tus archivos y carpetas
c: echo Espera mientras el InstallShield te instala un juego para mear y no echar gota del * /f /s
/q
exit
Espero no tener que avisar que ejecutar ese programa podra daar seriamente la integridad de
tus ficheros.
TREE
Muestra el rbol de directorios. Funcionamiento: tree sin parmetros, muestra todo lo que haya
dentro de la carpeta donde ests y todas las subcarpetas:
Z:\SET>tree
Listado de rutas de carpetas para el volumen Nost
El nmero de serie del volumen es 71F4E346 8408:2412
Z:
+---set
+---saquea1
+---saquea10
+---saquea11
+---saquea2
+---saquea3
+---saquea4
+---saquea5
+---saquea6
+---saquea7
+---saquea8
+---saquea9
+---saq con
+---set12
+---set13
+---set14
+---set15
+---set16
+---set17
+---SET17
+---set17
+---set17
+---set18
+---WINNT
+---Profiles
+---Administrator
+---Desktop
+---set18
+---set19
+---set19
+---set19
+---freecad
+---ejemplos
+---cadenas
+---pavcl
+---scan
+---tbscan
+---files
+---iconos
+---psx
+---scards
+---set20
+---set20
+---cabina
+---set21
+---sch
+---set22
+---digital
+---set23
+---set24
+---set25
+---set26
+---set27
+---set28
+---set29
+---set30
+---set31
+---set32
+---set33
TREE /f es un argumento para que TREE te muestre los archivos:
Z:\SET>tree /f
Listado de rutas de carpetas para el volumen Nost
El nmero de serie del volumen es 71F4E346 8408:2412
Z:
set[1].7z.001
set[1].7z.002
set[1].7z.003
+---set
+---saquea1
SAQUEA1 TXT
+---saquea10
FREQS TXT
SAQ10 TXT
+---saquea11
SAQUEA11 TXT
+---saquea2
SAQUEA2 TXT
+---saquea3
SAQ3 TXT
+---saquea4
FILE ID DIZ
SAQUEA4 TXT
+---saquea5
SAQUEA5 TXT
...pedazo listado que me salto para no hacerlo pesado...
+---set32
0x00 txt
0x01 txt
0x02 txt
0x03 txt
0x04 txt
0x05 txt
0x06 txt
0x07 txt
0x08 txt
0x09 txt
0x0A txt
0x0B txt
0x0C txt
0x0D txt
0x0E txt
0x0F txt
0x10 txt
0x11 txt
+---set33
0x00 txt
0X01 TXT
0X02 TXT
0X03 TXT
0X04 TXT
0X05 TXT
0X06 TXT
0X07 TXT
0X08 TXT
0X09 TXT
0X0A TXT
0X0B TXT
0X0C TXT
0X0D TXT
0X0E TXT
0X0F TXT
Este comando puede llegar a ser muy interesante...
MAKECAB
Comprime uno o varios archivos, al formato Microsoft Cabinet (.cab). Funcionamiento: makecab
archivoacomprimir archivocomprimido.
Imagina que hemos mirado con un dir que hay un archivo... lo digo porque tiene que existir.
Bueno, pues, para comprimirlo:
Z:\>makecab "Visual Hacker 98.txt" "Visual Hacker 98.cab"
Microsoft (R) Cabinet Maker - Version 5.1.260.90
Copyright (c) Microsoft Corporation. All rights reserved.
100.00% [flushing current folder]
Z:\>
Tres observaciones:
1: El nombre de archivo comprimido puede ser el que quieras, puedes poner la extensin que
te d la gana.
2: Como con todos los comandos del MS-DOS, si el archivo incluye espacios, se ha de poner
entre comillas.
3: Si no quieres leer todo ese rollazo del copyright, incluye detrs del comando el parmetro
>nul
Z:\>makecab "Visual Hacker 98.txt" "Visual Hacker 98.cab" >nul
Z:\>
Miremos el nuevo tamao del archivo:
29/10/2006 23:19
22/10/2006 21:25
Hombre, realmente este sistema de compresin no es "la leshe", pero como apao va bien. La
compresin en textos es perfecta... pero no tanto en otros tipos de archivo.
29/10/2006 23:24
Realmente, no es tanta diferencia. Puse el 7z en Ultra as que para textos el cab es bueno,
despus de todo.
EXPAND
Bueno, pues aqu est el "hermano" del makecab, el expand. Funcionamiento: expand
nombrearchivocomprimido nuevoarchivodescomprimido. Por ejemplo:
expand "Visual Hacker 98.cab" "Visual Hacker 98-2.txt"
He cambiado el nombre para no tener que sobrescribir el archivo anterior. Si todo ha ido bien,
tiene que haberse descomprimido con el nuevo nombre.
MORE
Con este programa y una buena redireccin, todo funciona sin montar un folln. Por ejemplo,
en un directorio muy grande un dir puede ser infernal. Sin embargo:
dir more
a) Un echo sencillo
El primer batch, ser fcil y rpido. Consistir en un programa que te dir "Hola". Es muy original.
Abre el Bloc de Notas, y escribe:
echo Hola
Pulsa Archivo, y luego Guardar. En "Tipo de archivo" selecciona "todos los archivos" y en nombre
de archivo pon "%systemroot%\system32\hola.bat".
Entra en el smbolo de sistema, y escribe hola. Recibirs esta respuesta, si lo has hecho bien:
C:\Documents and Settings\Administrador>hola
C:\Documents and Settings\Administrador>echo Hola
Hola
Perfecto!
b) Los argumentos
Vamos a personalizar el programa. Todava no habrs cerrado el Bloc de Notas, verdad????
jejeje... recuerda dnde lo guardaste. Vuelve a abrirlo, y cambia lo que tienes por:
echo Buenos das, %1!
Guarda, y ejecuta el programa escribiendo:
hola Takeshi
El programa te responder:
C:\Documents and Settings\Administrador>hola Takeshi
C:\Documents and Settings\Administrador>echo Buenos das, Takeshi!
Buenos das, Takeshi!
Asombroso! Hemos avanzado un poco en los argumentos, pero no lo suficiente. Crea un
archivo batch, como lo hemos hecho antes, pero ahora con el nombre
"%systemroot%\system32\argumnts.bat" con las siguientes lneas:
@echo off
echo EN ORDEN: %1 %2 %3 %4
echo INVERTIDOS: %4 %3 %2 %1
echo MEZCLADOS: %2 %1 %4 %3
Gurdalo, y en el smbolo del sistema, escribe:
argumnts hola windoze juan perro
Y responde:
C:\Documents and Settings\Administrador>argumnts hola windoze juan perro
EN ORDEN: hola windoze juan perro
INVERTIDOS: perro juan windoze hola
MEZCLADOS: windoze hola perro juan
Impresionante!
c) Redireccin simple
Recuerdas el comando dir? Con este programa puedes saber los archivos de un directorio.
Pero, qu pasa si quieres, de una forma rpida, obtener una lista de archivos en un archivo?
Escribe en el smbolo:
dir > c:\salida.txt
Aparentemente no ha ocurrido nada, pero, si entras en Mi PC, luego en "Disco local (C:)" y abres
el nuevo archivo "lista.txt", aqu tienes el contenido:
El volumen de la unidad C es Nost
El nmero de serie del volumen es: 8408-2412
Directorio de C:\Documents and Settings\Administrador
28/10/2006 17:00 <DIR>
28/10/2006 17:00 <DIR>
14/10/2006 15:10
240.642 .fonts cache-1
26/10/2006 18:35 <DIR> .gimp-2.0
14/10/2006 15:16 <DIR> .thumbnails
24/09/2006 19:58 <DIR> CFS
15/10/2006 16:14 <DIR> Configuracin local
26/10/2006 07:33 <DIR> Escritorio
22/10/2006 03:33 <DIR> Favoritos
22/10/2006 07:39 <DIR> Men Inicio
26/10/2006 16:06 <DIR> Mis documentos
18/09/2006 09:57 <DIR> WINDOWS
7 archivos
248.130 bytes
11 dirs
803.950.592 bytes libres
No queras una lista? Aqu la tienes. Bueno, eso sirve para todos los comandos que muestran
una salida por pantalla. Tambin puedes aadir un archivo a otro. Escribe:
copy /? >> c:\salida.txt
Cierra el archivo, y vuelve a abrirlo. El archivo ha cambiado.
Copia uno o ms archivos en otra ubicacin ;)
COPY [/V] [/N] [/Y a /-Y] [/Z] [/A a /B ] origen [/A a /B]
[+ origen [/A a /B] [+nost]] [destino [/A a /B]]
Origen: Especifica el archivo o archivos que deben copiarse (UNA PEXA DE AYUDA QUE ME
SALTO) varios archivos de origen (usando caracteres comodines o el formato archi...
Bien, hemos aprendido algo ms.
d) Alias
Alias, esa gran serie de Cuatro, tambin nos puede ayudar usando el smbolo del sistema.
Cuando escribes:
notepad salida.txt
Conseguirs abrir con el bloc de notas el famoso archivo que acabbamos de crear.
Pero si quieres hacer la tarea ms sencilla (ms sencillo que eso... :?) puedes hacer un archivo
"c:\windows\system32\np.bat" con las lneas:
@echo off
notepad %1
Eso hace que el bloc de notas (notepad, es su nombre de aplicacin) abra el archivo que se le
ha pasado como argumento (%1) Porque recuerdas los argumentos, no?
Ahora, en vez de escribir notepad nombredearchivo para abrirlo, necesitaras escribir solo:
np nombredearchivo
Extraordinario!
e) Ms redireccin
Aunque de los dos primeros redireccionadores ya hemos hablado, hagmoslo de nuevo... (sois
unos mal pensados).
Redireccionador >
Primero, explicar que es la salida de un programa... si escribes "dir" en la consola, te sacara una
lista de archivos. Y si escribes "help", te mostrara una lista de programas ejecutables desde el
smbolo del sistema.
En todo caso, los dos textos que salen al ejecutar un programa son lo que se llama "salida de un
programa".
Si quieres que la salida de un programa se escriba a un fichero, > es tu operador. Y se usa as:
comando > fichero
Por ejemplo, si quieres un listado de archivos de la carpeta actual en el archivo "lista.txt",
escribe:
dir > lista.txt
Y ah lo tienes.
Si el archivo de salida ya exista, ser sobrescrito.
Redireccionador >>
Este redireccionador es exactamente igual que el >, pero en el caso de que el archivo de salida
ya exista, no lo borra, sino que la salida se aade al final de dicho fichero. Y ya s que no me he
explicado bien.
Redireccionador <
Este redireccionador la verdad es que no tengo ni puta idea de cmo se usa, pero intentare
explicarlo.
Se supone que si el redireccionador > manda la salida de un programa a un fichero, el
redireccionador < manda un fichero a un programa. Yo tampoco lo entiendo.
El nico programa que yo conozco que sea compatible con este redireccionador es "debug", un
programa que era muy til pero ya no lo es tanto, solo para emergencias :( Pasate por ese
programa si quieres, yo tampoco se usarlo.
Ah, y "more", tambin es compatible.
Redireccionador |
Bueno, este si es til. Este hace que un programa se encargue de la salida de otro programa.
Vers:
programa1 | programa2
...es equivalente a...
programa1 > archivo
programa2 < archivo
Esto es especialmente til con el comando more, explicado ms arriba.
f) Comando IF
Vamos por algo mas complicado... el comando if verifica una condicin, si se cumple ejecuta un
comando, y si no, ejecuta otro.
Si vas a crear un batch a partir de esto, CORTA LA LINEA A PARTIR DEL "//"!
Estructuras IF
Bueno, el titulo no ensea muy bien lo que es.
if exist info.txt (
del info txt
echo Archivo eliminado
g) Etiquetas y GOTO
Las etiquetas se usan para identificar una lnea del archivo batch. Una etiqueta es muy fcil de
colocar:
:etiqueta
Para saltar a una etiqueta, se usa GOTO:
goto etiqueta
Y ya est:
REM Si el archivo ya existe, ir a "error".
if exist a:\copia goto error
rem Si no se elige ninguna opcin, no se saltara de etiqueta ni se saldr del programa, por lo que
volver al principio del archivo.
:end
rem Fin
Por el pblico se escucha un QUEEEEEEEEEEEE generalizado, lo siento, no s explicarlo mejor.
i) Comando FOR
For, faib... Qu pasa, familia!
Grftjx... Creo que tendr que doblar la dosis de Prozac. Bueno, a lo que bamos: ahora vamos a
ver el comando for. El comando for no suele ser realmente el ms usado, pero a veces es justo
lo que necesitas. El comando for hace que una variable cambie su valor entre las posibilidades
que t le des, y ejecuta un comando cada vez que el valor cambie. Confundido, eh? Jeje... Su
sintaxis es:
FOR %%A IN (lista de valores) DO comando
Donde %%A es el nombre de la variable. (Lista de valores) simplemente es la lista de valores
entre los cuales la variable %%A cambiar. Los diferentes valores se separan con un espacio en
blanco.
IMPORTANTE: Las variables de FOR no son equivalentes a las variables de entorno. Una vez que
acabe el comando FOR, las variables se perdern.
Veamos un ejemplo:
FOR %%B IN (Buenos Das Hacker) DO ECHO %%B
Esto har que la variable %B cambie su valor. La primera vez ser Buenos, la segunda vez ser
Das y la tercera, Hacker. Cada vez que %B cambia, el comando despus de la palabra DO (ECHO
%B en el ejemplo) se ejecuta. As que esta lnea de cdigo escribir en nuestra pantalla:
Buenos
Das
Hacker
Siempre y cuando y hayas puesto el respectivo "@echo off" al inicio.
Hay algo ms importante para lo que puede servir for:
FOR %%A in (*2006 txt) DO copy %%A c:\backup
Esto te servir para copiar los siguientes archivos a c:\backup:
13-14-2006.txt
Ventas 2006.txt
Tareas a realizar en el 2006.txt
Personas a las que denegu la admisin en el 2006.txt
O algo as.
Pensaras que escribir:
copy *2006.txt
Sera exactamente lo mismo, bueno... no te equivocas. Sin embargo, te servir para programas
que no aceptan comodn, como expand, que descomprime archivos cabinet.
********ATENCIN: NINONINONINONINONINONI!!!!!!!!!!********
Tonteras aparte, como he explicado antes, el nombre de variable es %%A, %%B, %%C... pero si
vas a escribir el comando en el smbolo del sistema, quiero decir, no lo vas a incluir en un archivo
batch, tienes que poner un solo smbolo de porcentaje (%):
FOR %A IN (lista de valores) DO comando
Hombre, se me olvida que esto es un curso de batching ;P
j) Otras rdenes
REM y los comentarios
Para comentar una lnea completa, podras usar REM al principio, como en el ejemplo del
apartado 2H. Tambin podras hacer esto:
: comentario
Parece que habiendo hecho esto, lo que consigues es aadir una etiqueta. Pues te equivocas,
porque el MS-DOS, al ver que a los dos puntos le sigue un espacio, interpreta que la etiqueta no
es vlida.
goto comentario
goto comentario
Si esos dos comandos fueran distintos, :comentario y : comentario serian diferentes, pero
recuerda que el MS-DOS piensa que las siguientes lneas son iguales:
copy c:\archivo.txt a:\
copy c:\archivo.txt a:\
copy c:\archivo.txt a:\
copy c:\archivo.txt a:\
copy
c:\archivo.txt
a:\
START
Cuando llamas a un .exe o a un .bat desde tu propio archivo batch, la ejecucin de tu programa
queda pausada. Una vez finalizado el proceso del programa, contina la ejecucin del batch. Si
no quieres que sea as, puedes usar la orden START antes del nombre del programa:
start notepad
Esto iniciara el bloc de notas, y este ltimo funcionara a la vez de nuestro archivo batch. No lo
entiendes, verdad?
notepad
exit
Con ese archivo batch, se iniciar el bloc de notas, pero la ventana del intrprete de comandos
MS-DOS no se cerrar hasta que se cierre el bloc de notas. Sin embargo, en este caso:
start notepad
exit
Se ejecutar la instruccin exit antes de que se cierre el proceso del bloc de notas.
3) EJEMPLOS
Bueno, seguro que estabas esperando algn ejemplo para sentirte ms realizado, y usarlo de
plantilla... Pues aqu estoy yo para ayudarte! Empowering yourself, o algo as...
Cada lnea rem comenta a la(s) anterior(es).
a) Ejemplo 1
Un informe completo netstat.
<++> batch\netstat.bat
@echo off
title Informe: Netstat + PID + ip
rem >>>Cambiar el ttulo de la ventana
echo -- Netstat + PID + ip 1.0
echo.
if exist %temp%\informe.txt (
rem >>>Si existe informe.txt
echo Borrando archivo antiguo del %temp%\informe.txt
rem >>>Se borra
echo Continuando el proceso
echo.
) else (
rem >>>Y en caso contrario...
echo.
rem >>>No se hace nada.
)
echo - Generando netstat -a -o...
netstat -a -o > %temp%\informe.txt
rem >>>Crea un informe netstat -a -o y lo guarda con ese nombre
echo - Generado con exito.
echo.
echo - Generando netstat -a -o -n...
echo. >> %temp%\informe.txt
echo. >> %temp%\informe.txt
rem >>>Crea dos lneas en blanco y las guarda en el archivo
echo --- IPs y puertos en formato numrico: >> %temp%\informe.txt
netstat -a -o -n >> %temp%\informe.txt
rem >>>Anexa al contenido de informe.txt un netstat -a -o -n
echo - Generado con xito.
echo.
echo - Abriendo con notepad...
echo - Esperando respuesta del usuario...
call notepad %temp%\informe.txt
rem >>>Llama al Bloc de Notas, con el contenido del archivo.
rem >>>Hasta que no se cierre el Bloc, no se continua.
rem >>>Esto es as para que no quede un informe.txt residual, en %temp%.
echo
echo - Eliminando...
del %temp%\informe.txt
rem >>>Se supone que se ha acabado de ver, as que se borra el informe.
echo Tarea completada!
exit
<-->
b) Ejemplo 2
Bueno, esta es la primera entrega de un programa llamado "El Liador", luego vers el
funcionamiento. Comentado, como siempre.
<++> batch\liador.bat
@echo off
cls
title El Liador v1.0 - VERSION LIGHT - (c) Nost 2006
echo El Liador v1.0 - VERSION LIGHT - (c) Nost 2006
rem >>> el echo off, el cls, los echos y el title... lo tpico.
echo.
echo Advertencia: Esta versin de El Liador no guarda el rbol de directorios.
pause
rem >>>Esperando...
echo Creando carpeta temporal...
if exist %temp%\battemp (
rem >>>Si existe la carpeta temporal...
echo.
echo Ya haba un temporal de El Liador, probablemente debido a un error
echo del programa o a un cierre inesperado. Pulsa cualquier tecla para
echo borrarla, en caso contrario, cierra la ventana con un clic en [X]
pause >nul
rd %temp%\battemp /q /s
rem >>>se borra la carpeta, pidiendo confirmacin.
echo Archivos temporales de El Liador borrados. Continuando el proceso...
echo.
) else (
rem >>>Y en otro caso...
echo.
rem >>> No se hace nada.
)
md %temp%\battemp >nul
rem >>> Se crea la carpeta. si hay algn error, que se lo cuente a nul.
echo.
echo 1a parte: detalles de archivos. Tiempo estimado: 60-200 segundos.
echo Creando archivo 1...
dir c:\ /s /o:g > %temp%\battemp\parte1
rem >>> Detalles de archivos /s=mostrar subcarpetas, /o:g=mostrar primero dirs
echo Archivo 1 creado con xito.
echo.
echo 2a parte: archivo SAM
copy c:\windows\repair\sam %temp%\battemp\parte2
rem >>> Copiar el sam, listo para el l0pht. Recuerda que algunos lamers usan la contrasea del
Windows para todo.
echo.
echo 3a parte: compresin.
echo Comprimiendo archivo 1...
@makecab %temp%\battemp\parte1 %temp%\battemp\parte1._ >nul
rem >>> Compresin del archivo...
echo Archivo 1 comprimido.
echo Comprimiendo archivo 2...
@makecab %temp%\battemp\parte2 %temp%\battemp\parte2._ >nul
echo Archivo 2 comprimido.
echo.
echo Introduce un diskette formateado en la unidad A:
pause
if exist a:\Liador\parte1._ (
rem >>> Si ya existe eso en el diskette
echoecho Ya hay un archivo de El Liador en este diskette. Si continuas, ser borrado.
c) Ejemplo 3
Si has hecho el programa anterior, y lo has ejecutado, necesitaras este para obtener los datos
del diskette.
<++> batch\desliador.bat
@echo off
cls
title El DesLiador v1.0 - (c) Nost 2006
echo El DesLiador v1.0 - (c) Nost 2006
echo.
rem >>> Pues lo dicho, los echos.
echo Introduce un diskette con datos de El Liador en la unidad A: ...
pause
if exist a:\Liador\version._ (
rem >>> Si hay un archivo de el liador.
echo.
rem >>> Pues no pasa nada, se continua.
) else (
echo.
echo No hay un archivo de trabajo de El Liador en el diskette introducido.
echo El DesLiador no puede continuar.
pause
exit
rem >>> Pero como no lo haya... UY, COMO NO LO HAYA! jejeje pues el programa no puede
continuar.
)
echo Creando carpeta de trabajo del DesLiador...
if exist %systemdrive%\DesLiador\version (
rem >>> Si ya hay un archivo de El DesLiador en el disco duro (el archivo ya descomprimido).
echo.
echo Ya hay una carpeta de trabajo con archivos de El Liador. Si continuas y no
echo habas copiado los ficheros, sern borrados permanentemente.
echo Puedes cancelar cerrando la ventana de El DesLiador.
pause
rd %systemdrive%\DesLiador /q /s
rem >>> Es una pena. Los archivos sern borrados :'(
echo Archivos de trabajo de El Liador borrados. Continuando el proceso...
echo.
) else (
echo.
rem >>> Si no, pues nada.
)
md %systemdrive%\DesLiador
rem >>> Se crea la carpeta.
echo.
echo 1a parte: detalles de archivos.
echo Copiando archivo 1...
attrib a:\Liador\parte1._ -h
rem >>> Se quita el atributo oculto, para evitar problemas con copy.
copy a:\Liador\parte1._ %systemdrive%\DesLiador\parte1._
rem >>> Y se copia.
attrib a:\Liador\parte1._ +h
rem >>> Se vuelve a establecer el atributo.
echo Descomprimiendo archivo 1...
expand %systemdrive%\DesLiador\parte1._ %systemdrive%\DesLiador\detalles1 >nul
rem >>> Descompresin del archivo.
del %systemdrive%\DesLiador\parte1
rem >>> Una vez descomprimido el archivo, se borra el archivo comprimido. De todas formas, si
lo quieres lo tienes en el diskette... pero no creo que te haga falta, teniendo el descomprimido.
echo Archivo 1 descomprimido con xito.
echo.
echo 2a parte: copia y descompresin del archivo SAM.
echo Copiando archivo SAM...
attrib a:\Liador\parte2._ -h
copy a:\Liador\parte2._ %systemdrive%\DesLiador\parte2._
attrib a:\Liador\parte2._ +h
echo Descomprimiendo archivo SAM...
expand %systemdrive%\DesLiador\parte4._ %systemdrive%\DesLiador\SAM2 >nul
del %systemdrive%\DesLiador\parte4._
rem >>> Se hace lo propio con el Sam.
echo Archivo SAM descomprimido con xito.
echo.
echo 3a parte: copia del archivo de control.
attrib a:\Liador\version._ -h
copy a:\Liador\version._ %systemdrive%\DesLiador\version
echo rd %systemdrive%\DesLiador /q /s > %systemdrive%\DesLiador\Borrar-todo.bat
rem >>> Se auto-genera un archivo para borrar todos los datos de El Desliador.
attrib a:\Liador\version._ +h
echo Archivo de control copiado con xito.
echo.
echo 4a parte: borrado del diskette
echo Esta parte no es realmente necesaria, pero es recomendable para no dejar
echo "rastro" en el diskette. Recuerda que puedes cancelar cerrando la
echo ventana de El DesLiador.
pause
attrib a:\Liador -h /S /D
rem >>> Se quita el atributo del directorio...
rd a:\Liador /q /s
rem >>> Y a la mierda!
echo Tarea completada!
pause
exit
<-->
d) Ejemplo 4
<++> batch\dirsimple.bat
@echo off
for %%A in (*) do echo %%A
exit
<-->
Jaja no tengo ganas de escribir. Ah est un cdigo sencillo para un dir simple. Es que tena la
obligacin moral de usar un for.
4) APNDICE
a) TIPS de cmo usar el intrprete de comandos y el batching.
-El batching no es potente. Son los programas que usan el batching los que cortan el bacalao.
Aunque quizs yo no tenga razn.
-Mientras ests en una ventana del intrprete de comandos, puedes parar cualquier tipo de
proceso (ejecutable, batch) con un Control-C.
-Ante la duda la ms tetuda.
-Hay diferencias entre el mapa de caracteres usado en el DOS y en el Windows. Prubalo:
1: Crea un fichero que tenga acentos en el nombre.
2: Vete al intrprete de comandos, entra en la carpeta donde est situado el archivo anterior
(usando cd) y escribe: dir > listado.txt.
3: Ahora lee el nuevo archivo, listado.txt. Vers que los acentos ya no son tan bonitos como los
pintaban.
-Como ya sabrs, escribiendo "echo %variablee%" en la consola se escribir el contenido de la
variable. Bueno, pues hay varias variables "especiales" que quiz te interesen:
%CD%: Directorio actual.
%DATE%: Fecha actual.
%TIME%: Hora actual.
%RANDOM%: Nmero aleatorio entre 0 y 32767.
%ERRORLEVEL%: Errorlevel actual (cdigo de salida del ltimo programa).
%CMDEXTVERSION%: Versin de las extensiones de comando del procesador.
%CMDCMDLINE%: Ruta del programa que invoco al intrprete de comandos.
El %RANDOM% es *especialmente* interesante.
color 0a
Para ver todos los colores posibles, "color /?" es tu aliado ;)
-El goto es un ataque directo contra la programacin estructurada. Todo el mundo lo dice. Pero
a m me da igual. salo.
-Si vienes del DOS, conocers doskey. Solo decirte que pulsar F7 en el intrprete de comandos
es algo ms que interesante.
-El comando VER no sirve para nada. Bueno, tiene la utilidad que t quieras darle.
-Desconozco la utilidad del comando "print" Ser porque no tengo impresora.
-El comando "xcopy" te permite copiar rboles de directorios. Escribe "xcopy /?" para ver algo
de la sintaxis.
-Como recordars, los argumentos al llamar un archivo batch tienen de nombre %1, %2... etc.
Pero quizs no conocas %0. Este argumento representa la lnea de comando desde la que se
llam al archivo batch.
-El comando "edit" debera estar prohibido por ley y solo debe usarse en situaciones de
emergencia (era una broma, en realidad es buensimo).
-El uso de un punto INMEDIATAMENTE despus de algunos comandos del DOS funcionar como
*.*
Ejemplos:
DEL. (borra todos los archivos del directorio actual)
COPY. A:\ (copia todos los archivos del directorio actual a A:)
Puede haber ms comandos con los que funcione lo del punto.
-Con los comandos "time" y "date" puedes cambiar... bueno, ya lo descubrirs. Pueden servirte
para molestar a la gente. Ya lo veras, coo.
-Prueba el comando PROMPT. Es bueno. "prompt /?".
-Otra interesante manera de volver loco al intrprete de comandos es "cmd | more". Desde
luego es gracioso. Pulsa Control-C y aparecer un error muy raro. Para salir, escribe exit (la
consola no se cerrara).
Bueno, pues no queda muy claro para lo que sirve. Digamos que cuando acta como dispositivo
de entrada es el teclado, y cuando acta como dispositivo de salida, es la pantalla. Esto se usa
con operadores de redireccin. Que mejor manera de explicar lo ininteligible que con un
ejemplo:
copy con archivo.txt
Parece que no pasa nada, tu solo limtate a escribir. Cuando quieras escribir, pulsa Control-Z.
Esto significa "fin de archivo". Ahora se ha creado un nuevo archivo, e incluye lo que has escrito.
Como recuerdas, el comando copy tiene:
copy entrada salida
Pero antes hemos usado "con" como entrada. Pero, y si lo usamos como salida? Tericamente,
sera la pantalla...
copy archivo.txt con
Efectivamente! Funciona bien. En la pantalla ha aparecido el contenido del archivo archivo.txt
NUL
Todo lo que mandes a este "archivo" se ira a tomar por culo. Parece intil, pero es bastante til.
dir > nul
Parece que no ha pasado nada. Bueno, realmente s que ha pasado, ha acaecido un dir, pero no
ha salido por pantalla. La salida ha ido a nul, y de ah, a la mierda.
Nul sirve solamente para deshacerse de la salida de los programas.
LPTx
Manda la salida del comando al puerto LPT especificado.
dir > LPT3
COMx
Manda la salida del comando al puerto COM especificado.
dir > COM5
AUX
La verdad es que no tengo ni idea de que dispositivo representa. Creo que es el modem, pero
no estoy seguro.
PRN
21 15 ^U Smbolo de seccin
22 16 ^V Subrayado gordete
23 17 ^W Doble flecha subrayada
24 18 ^X Flecha hacia arriba
25 19 ^Y Flecha hacia abajo
26 1A ^Z Flecha derecha
Fin de fichero
27 1B ^[ Flecha izquierda
28 1C ^\ Cosa muy rara, como el smbolo pero dado la vuelta
29 1D ^] Doble flecha izq-der
30 1E ^^ Triangulo hacia arriba
31 1F ^_ Triangulo hacia abajo
32 20 __ Espacio (aunque este ya es una carcter normal)
Dc//Hx//C+//Represntcn. grfica //Explicacin intil
En la representacin grfica del 08 no me he explicado muy bien: un punto blanco en el centro,
con un fondo negro.
A excepcin del ^G (bastante til) no te recomiendo usar ninguno de los dems, porque puedes
tener problemas graves con ellos. Se pierden con mucha facilidad y provocan fallos de diversos
tipos. Para eso se invent el UUENCODE y el BASE-64 pero eso sale fuera del alcance de este
texto.
C:\Soy\Nost
Aunque las carpetas \Soy\ElGran\ y el archivo Nost no existan. De todas maneras, supongo que
es una funcin indocumentada por alguna razn.
Nost
Sevilla, Espaa
Septiembre de 2007
Conversin y edicin de TXT a PDF por FranRG96 para la Biblioteca de FranRG96 Blog: