Hoy aprenderemos hacer ese famoso archivo.bat el cual tu y yo sabemos que solo estas aquí por eso y si no es por eso igualmente eres bienvenido a leer esta guía. Solo falta comenzar como lo de siempre.. ¿No? En fin, ¿Que es batch?
Batch es un lenguaje de lotes en otras palabras.. Su procesamiento se hace en lotes de tarjetas perforadas y en otras palabras mas entendibles es un lenguaje que sigue ordenes MS-DOS con extensión.bat el cual automatiza estas ordenes en un archivo. Ahora que sabemos que es vamos a profundizar un poco el bla, bla, bla.
Lo único que necesitamos es; Windows, CMD, o un bloc de notas u IDE. Usaremos el bloc de notas, por ahora. Para acceder al bloc de notas solamente deben ir al explorador de archivos
Luego iremos a esta ruta: C:\Windows\System32, ya cuando estemos en esa ruta busca “notepad” y listo!
Ahora que estemos en el bloc de notas copien y peguen esto:
1
2
3
4
@echo off
echo Hola Mundo
pause
exit
Una ves que copiamos y pegamos el codigo en el bloc de notas vamos a guardar el archivo como archivo.bat (Archivo es opcional pueden poner cualquier cosa, pero siempre debe tener a lo ultimo .bat)
Sino sabes guardar archivos con extensiones como estas;
Archivo > Guardar como > Apretamos en “tipo” > Todas las extensiones y en nombre del archivo ponen el que os mencione arriba archivo.bat
. Cuando tengamos el archivo solamente le damos doble click para ejecutarlo.
c
Si, si, mucho hype, ahora, explicare como funciona el código. @Echo off sirve para que no aparezca el eco en el programa. También esta @echo on que es lo contrario de echo off ya que no esconde lo que va ejecutando el programa.
Pueden probar por ustedes mismo y notar la diferencia. Desde ahora tratare de no pasar mucho capturas de lo que hace el comando lo dejare como tarea para que vayan probando y no solo leyendo.
El comando “echo” sirve para poner en la pantalla texto como vimos anteriormente y el comando pause hace que el programa no se cierre al ejecutarse (Prueben el código sin el pause y miren lo que pasara para que entiendan mejor) una ves que pause es ejecuta la función de exit es cerrar la ventana acabando el programa divertido, ¿No?
Podemos probar echo. (Nótese el punto ”.”) para hacer espacios en el programa cuando queramos imprimir texto ya que puede verse el código todo pegado y se horrible.
1
2
3
4
5
6
@echo off
echo Hola %USERNAME%
echo.
echo ¿Como estas?
pause
exit
Intenta ejecutarlo y una ves que lo hayas hecho quitar el echo. y mirad la diferencia. Oh, me acabo de dar cuenta que he puesto la variable %username% si ejecutaron el comando se dieron cuenta que dice Hola “NombreDelUsuario” ya que usamos esta “variable” la cual su funcionalidad es mostrar el nick del usuario de la pc en pantalla.. Se puede usar de otras maneras, por ejemplo, nosotros queramos ir a “x” ruta, pero no sabemos cual es el nombre del usuario para acceder entonces solo pones: C:\carpeta\%USERNAME%\archivo.txt
Pero esto es un ejemplo, probablemente si intentaste poner eso en el archivo.bat no te funcionara ya que es una ruta example.
Antes de seguir avanzando con la guía como consejo podemos dejar de usar pause y usar mejor pause > nul ya que “pause” nos muestra un mensaje molesto siempre que termina el programa de si queremos continuar. Pause > nul hace lo contrario a esto.
Nota: Recuerda que batch trabaja de linea en linea, es decir, que el codigo va ejecutandose desde la primer linea hasta la ultima
Ejemplo
Piensa que estamos en una carrera y que el inicio de la carrera es @echo off y una ves que disparen nosotros empezamos a correr el cual seria el código que nosotros queremos que sea ejecutado de forma progresiva, 1, 2, 3, 4, etc. Un paso, dos pasos, y así. Cuando terminemos la carrera seria el exit el cual es el “FIN de la meta”
Copiar, Mover, y borrar archivos.
Podemos usar el comando “Copy”, “XCOPY” o “RoboCopy” para copiar un archivo. Si quieres ver sus diferencias puedes mirar esta web.
Aprendamos primero usar Robocopy que es uno de las mas completos para tareas de copiar y pegar
1
Robocopy C:\%USERNAME%\Documentos D:\Backup\DestinoCarpeta /E
Este comando nos permitirá copiar carpetas con subdirectorios, aunque, estén vacíos.
1
robocopy C:\%USERNAME%\example1 C:\%USERNAME%\example2 /COPYALL /E /R:0
COPYALL
copia toda la información del archivo, equivalente a /COPY:DATSOU
(D=Datos, A=Atributos, T=Fecha, S=Seguridad=ACL de NTFS, O=Información del propietario, U=Información de auditoría) y usamos R:0 para que el comando no haga reintentos si hay uno que otro archivo bloqueado en la carpeta.
1
Robocopy C:\%USERNAME%\Documentos D:\Backup\DestinoCarpeta /S
Es igual que E, pero excluye contendió o carpetas vacías
1
Robocopy C:\%USERNAME%\Documentos D:\Backup\DestinoCarpeta /move
Copia y mueve los archivos al destino eliminando después los archivos de la fuente principal.
1
robocopy c:\greyhat c:\standby Lisbeth.txt
Copiamos y movemos el archivo Lisbeth.txt a standby2 (Standby2 y greyhat son carpetas)
Les dejo los demás comandos para que puedan probarlos:
Sintaxis de robocopy
1
robocopy <Origen> <Destino> [<archivo>[ ...]] [<Opciones>]
Parámetros
Parámetro | Descripción |
---|---|
<Source> |
Especifica la ruta al directorio de origen. |
<Destino> |
Especifica la ruta al directorio de destino. |
<archivo> |
Especifica el archivo o archivos a copiar. Puede usar caracteres comodín ( * o ? ) , Si lo desea. Si no se especifica el parámetro Archivo , se usa *. \ * Como valor predeterminado. |
<Opciones> |
Especifica las opciones que se utilizarán con el comando robocopy. |
Opciones de copia
Parámetro | Descripción | |||
---|---|---|---|---|
/s |
Copias de subdirectorios. Tenga en cuenta que esta opción excluye directorios vacíos. | |||
/e |
Copias de subdirectorios. Tenga en cuenta que esta opción incluye directorios vacíos. Para información adicional, ver Comentarios. | |||
/lev:<N> |
Copia solo los niveles N superiores del árbol de directorios de origen | |||
/z |
Copia archivos en modo reiniciable. | |||
/b |
Copia archivos en modo Copia de seguridad. | |||
/zb |
Utiliza el modo reiniciable. Si se deniega el acceso, esta opción utiliza el modo de copia de seguridad. | |||
/efsraw |
Copia todos los archivos cifrados en modo EFS RAW. | |||
/copy:<CopyFlags> |
Especifica las propiedades del archivo a copiar. Los siguientes son los valores válidos para esta opción: D Datos, A Atributos, T Marcas de tiempo, S Lista de control de acceso (ACL) NTFS, - O Información del propietario, U Información de auditoria, El valor predeterminado para CopyFlags es DAT (datos, atributos y sellos de tiempo). | |||
/dcopy:<copyflags> |
Define qué copiar para directorios. El valor predeterminado es DA. Las opciones son D = datos, A = atributos y T = marcas de tiempo. | |||
/sec |
Copia archivos con seguridad (equivalente a / copy: DATS ). | |||
/copyall |
Copia toda la información del archivo (equivalente a / copy: DATSOU ) | |||
/nocopy |
No copia información del archivo (útil con / purge ) | |||
/secfix |
Corrige la seguridad de los archivos en todos los archivos, incluso los omitidos. | |||
/timfix |
Corrige los tiempos de archivo en todos los archivos, incluso los omitidos. | |||
/purga |
Borra los archivos y directorios de destino que ya no existen en la fuente. Para información adicional, ver Comentarios. | /mir |
Refleja un árbol de directorios (equivalente a / e plus / purge ). Para información adicional, ver Comentarios. | |
/mov |
Mueve archivos y los elimina de la fuente después de que se copian. | |||
/a+:[RASHCNET] |
Agrega los atributos especificados a los archivos copiados. | |||
/a-:[RASHCNET] |
Elimina los atributos especificados de los archivos copiados. | |||
/create |
Crea un árbol de directorios y solo archivos de longitud cero. | |||
/fat |
Crea archivos de destino usando solo nombres de archivos FAT de longitud de 8,3 caracteres. | |||
/256 |
Desactiva el soporte para rutas muy largas (más de 256 caracteres). | |||
/mon:<N> |
Supervisa la fuente y se ejecuta de nuevo cuando se detectan más de N cambios. | |||
/mot:<M> |
Crea copias multihilo con N hilos. N debe ser un número entero entre 1 y 128. El valor predeterminado para N es 8. El parámetro /MT no se puede usar con los parámetros / IPG y / EFSRAW . Redirigir la salida usando la opción / LOG para un mejor rendimiento. | |||
/rh:hhmm-hhmm |
Especifica los tiempos de ejecución cuando se pueden iniciar nuevas copias. | |||
/pf |
Verifica los tiempos de ejecución por archivo (no por paso). | |||
/ipg:n |
Especifica la brecha entre paquetes para liberar ancho de banda en líneas lentas. | |||
/sl |
Sigue el enlace simbólico y copia el objetivo. | |||
/move |
Mueve archivos y directorios, y los elimina de la fuente después de que se copian. |
Nota: El parámetro / MT se aplica a Windows Server 2008 R2 y Windows 7.
Colores
Número | Color |
---|---|
0 | Negro |
1 | Azul |
2 | Verde |
3 | Agua |
4 | Rojo |
5 | Púrpura |
6 | Amarillo |
7 | Blanco |
8 | Gris |
9 | Azul claro |
A | Verde claro |
B | Agua ligero |
C | Rojo claro |
D | Púrpura claro |
E | Amarillo claro |
F | Blanco brillante |
Sintaxis
1
COLOR [ fondo ] [ primer plano ]
La sintaxis es simple, se pone la letra que quieras como fondo y si quieres por así decirlo combinarlos se usan dos números de los números hexadecimales de arriba juntos, o sea pegados. Un ejemplo:
1
2
3
4
5
@echo off
COLOR fb
echo.
pause>nul
exit
En el caso de que el comando COLOR no funcione es porque tienes la extensiones de comandos deshabilitadas, no te preocupes no es nada grave o algo por preocuparte solamente viene así por defecto solo toca activarlas con el siguiente código:
1
CMD /e:on or CMD /e:off or run SETLOCAL EnableExtensions
Ahora puedes jugar con las combinaciones de colores y tener tu terminal “bonita”. Si el color de fondo y el primer plano son los mismo, por ejemplo, COLOR ff dará error, si el color se cambio con éxito; %ERRORLEVEL% = 0
Todo código debe estar limpio en su ejecución, digamos que vamos a imprimir muchas cosas en pantalla, o que hacemos un menu y al elegir una opción se nos ejecutara “x” cosa dependiendo de cual hayamos elegido, pero en este caso digamos que solo es texto y te das cuenta de una cosa, al elegir la opción vemos que el menu aun sigue arriba y la consola por así decirlo esta con mucha “basura” que ya no nos interesa, solo el texto que la opción que elegimos nos arrojo, ¿Ya vas entendiendo a donde quiero llegar con todo esto? Se ve bastante feo, ¿No? para los que si les preocupa esto y quieren tener la consola o terminal limpia se puede usar “cls” que a continuación explicare su uso, y las siguientes funciones que veras en el código de abajo.
Ejecutar código siguiente para entender mejor
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
@echo off
TITLE Bienvenid@ %USERNAME% a @lm_blog menu
MODE con:cols=80 lines=40
:inicio
SET var=0
cls
echo ------------------------------------------------------------------------------
echo %DATE% ^| %TIME%
echo ------------------------------------------------------------------------------
echo 1 Opcion 1
echo 2 Opcion 2
echo 3 Opcion 3
echo 4 Salir
echo ------------------------------------------------------------------------------
echo.
SET /p variable= ^> Seleccione una opción del 1 al 4:
if "%variable%"=="0" goto inicio
if "%variable%"=="1" goto op1
if "%variable%"=="2" goto op2
if "%variable%"=="3" goto op3
if "%variable%"=="4" goto salir
::Mensaje de error, validación cuando se selecciona una opción fuera de rango
echo. El numero "%var%" no es una opción, sea seri@, por favor.
echo.
pause
echo.
goto:inicio
:op1
echo.
echo. Opción 1: Calculadora.
echo.
echo --> "Calculadora"
echo.
set resultado= 0
set/p numero1=introduce el primer numero:
cls
echo ------------------------------------------------------------------------------
echo Elija alguno de estos operadores:
echo ------------------------------------------------------------------------------
echo.
echo Suma: +
echo Dividir: -
echo Multiplicar: *
echo Dividir: /
echo.
echo ------------------------------------------------------------------------------
set/p operacion=Introduce la operación:
cls
set/p numero2=Introduce el segundo numero:
cls
if %operacion%==+ set/a resultado=%numero1% + %numero2%
if %operacion%==- set/a resultado=%numero1% - %numero2%
if %operacion%==* set/a resultado=%numero1% * %numero2%
if %operacion%==/ set/a resultado=%numero1% / %numero2%
echo Resultado %numero1% %operacion% %numero2% = %resultado%
echo.
pause>nul
goto:inicio
:op2
echo.
echo. Opción 2: Frases.
echo.
echo --> "Frases."
echo.
echo ¿Rendirme? ¿Crees que esta A es de Francia? (Capitán América)
echo.
echo No son los dioses los que deciden si el hombre existe; son los hombres los que deciden si los dioses existen.(Thor)
echo.
echo —Comisario, hay huelga de nihilistas. —¿Qué reclaman? —Nada. —Me cago en mi padre, por qué siempre me tocan a mí estas mierdas.
echo.
echo.
pause>nul
goto:inicio
:op3
echo.
echo. Opción 3: Texto.
echo.
echo --> "Texto"
echo.
echo Texto, texto, texto, texto, texto, texto, texto
echo Texto, texto, texto, texto, texto, texto, texto
echo Texto, texto, texto, texto, texto, texto, texto
echo Texto, texto, texto, texto, texto, texto, texto
echo Texto, texto, texto, texto, texto, texto, texto
echo Texto, texto, texto, texto, texto, texto, texto
echo Texto, texto, texto, texto, texto, texto, texto
echo Texto, texto, texto, texto, texto, texto, texto
echo.
pause>nul
goto:inicio
:salir
@cls&exit
EL comando cls sirve para borrar todo lo que esta arriba de el, en otras palabras limpia la pantalla.
1
2
3
4
5
6
7
8
@echo off
COLOR fb
echo Hola amigos ustedes son pareja?
pause>nul
cls
echo Zzzz
pause>nul
exit
En el código nos pregunta “Ustedes son pareja?”, pero no podemos responder porque solo estamos imprimiendo texto en la terminal o pantalla. Para hacer esto posible tenemos que usar variables (Para los que no sepan y sean nuevos en esto, una variable son espacios con valores almacenados en la memoria, valores que pueden ser cambiados a lo largo de la ejecución del programa.) si queremos almacenar dicha información que nos pregunta en “x” variable debemos usar set:
1
set nombrevariable=valorqueledamos
Si queremos invocar por así decirlo esa variable debemos usar los símbolos %%
como hicimos arriba para saber el nombre del usuario. Si tengo pareja y se llama %nombrevariable%
1
2
3
4
5
6
7
8
9
@echo of
set nombre=Pepe
echo Hola amigo ¿Como te llamas?
echo.
pause>nul
cls
echo Hola, mi nombre es, %nombre%!!
pause>nul
exit
Ahora como verán la variable cuyo valor es “Pepe” sera invocada y a lo ultimo de la ejecución del programa pondrá “Hola, mi pareja nombre es, Pepe.”, aun no hemos hecho lo que queremos hacer lo cual es poder responder la pregunta sin tener que escribirlo en el código, es decir, que al usar el programa podamos asignarle un valor a la variable. Hacer esto es sencillo solo debemos usar set/p para poder lograrlo.
1
2
3
4
5
6
@echo off
set/p variable1= Elije un numero:
echo.
echo el numero que pusiste fue: %varaible1%
pause>nul
exit
Sencillo, ¿No? Nos saldrá en pantalla el numero que pusiste al comienzo, según nuestra respuesta sera mostrada en pantalla ya que almacenamos el numero en la variable1 para después invocarla en “x” parte del programa usando lo signos %%
. Si queremos hacer esto aplicando matemáticas se usaría set/a, ya seria para cosas un poco mas complejas. Os dejo una tabla de ss64 para que entiendan como se usarían los operadores con set/a.
Operador | Explicación | Uso |
---|---|---|
+ |
Sumar | set /a "_num=_num+5" |
+= |
Sumarse entre si con un valor dado | set /a "_num+=5" |
- |
Restar | set /a "_num=_num-5" |
-= |
Restarse entre si con un valor dado | set /a "_num-=5" |
* |
Multiplicar | set /a "_num=_num*5" |
*= |
Multiplicarse entre si con un valor dado | set /a "_num*=5" |
/ |
Dividir | set /a "_num=_num/5" |
/= |
Dividirse entre si con un valor dado | set /a "_num/=5" |
%% |
Modulo | set /a "_num=17%%5" |
%%= |
Modulo | set /a "_num%%=5" |
! |
Negacion logica | 0 (FALSO) ⇨ 1 (VERDADERO) y cualquier valor distinto de cero (VERDADERO) ⇨ 0 (FALSO) |
~ |
Bitwise invert | |
& |
AND (Y) | set /a "_num=5&3" 0101 AND 0011 = 0001 (decimal 1) |
&= |
AND (Y) variable | set /a "_num&=3" |
| |
OR (O) | set /a "_num=5|3" 0101 OR 0011 = 0111 (decimal 7) |
|= |
OR (o) variable | set /a "_num|=3" |
^ |
XOR | set /a "_num=5^3" 0101 XOR 0011 = 0110 (decimal 6) |
^= |
XOR variable | set /a "_num=^3" |
<< |
Shift izquierdo. | (bit de signo ⇨ 0) Un cambio aritmético |
>> |
Shift derecha. | (Rellena el bit de signo de modo que un número negativo siempre permanezca negativo). Ni ShiftRight ni ShiftLeft detectarán desbordamiento. |
<<= |
Variable de desplazamiento a la izquierda | set /a "_num<<=2" |
>>= |
Variable a la derecha | set /a "_num>>=2" |
( ) |
Conjunto de expresiones de grupo de paréntesis | set /a “_num=(2+3)*5” |
For
El ciclo for nos ayuda a crear secuencias repetidamente de una o varias lineas de código hasta que nuestra condición asignada deja de cumplirse. Existen otros tipos de bucles, pero por ahora nos enfocaremos en for.
Una sintaxis normal del comando en batch seria:
1
2
3
For %%v IN (lista) Do (
Comandos
)
Si tienes buen ojo y ya has usado for en otros lenguajes te darás cuenta que algo a cambiando, y sino pues, hemos puesto dos símbolos %%
y una letra para la variable que usaremos. En Batch solo debemos poner una letra y siempre con los dos símbolos, por ejemplo, %%s
, &&l
, %%k
, etc.
Parámetro /L
Un ejemplo simple de for:
1
2
3
For %%s IN ( 1,2,3,4,56,7,8,9) Do (
echo %%s
)
Es muy simple lo que hace este codigo, pero podrán entender un poco como funciona for. Lo que mostrara este codigo en pantalla serán las palabras que pusimos, separadas linea a linea. Llamando la variable desde echo.
Podemos cambiar esto por algo mejor..
1
2
3
For /l %%s IN (1,1,9) Do (
echo %%s
)
Lo que hara esta vez el codigo es contar de 1 en 1 hasta el 9 (1 2 3 4 5…), mejorando la tecnica usando /l, pueden probar de otras, por ejemplo, que cuente de 2 en 2 hasta 9
1
2
3
For /l %%s IN (1,2,9) Do (
echo %%s
)
O mejor de 9 disminuyendo hasta llegar a 1 (9 8 7 6..).
1
2
3
For /l %%s IN (9,-1,1) Do (
echo %%s
)
Similar a una cuenta regresiva.
Parámetro R.
Sintaxis: FOR /R [[drive:]path] %%parameter IN (set) DO command
El parámetro R nos servira para recorrer recursivamente directorios o archivos, de la siguiente forma:
1
2
3
For /R c:\ %%s IN (*) Do (
echo %%s
)
Aquí estaremos recorriendo todos los archivos de la unidad C: desde su directorio raíz hasta pasar por todos los directorios. También podemos cambiar un poquito el código siendo mas específicos para lo que queremos encontrar, por ejemplo, en vez de poner () podemos poner (.txt, *.exe, *.png)
Parámetro D.
Sintaxis: FOR /D %%parameter IN (folder_set) DO command
Con el parámetro /D nos servirá para listar los directorios.
1
2
3
For /D c:\ %%s IN (*) Do (
echo %%s
)
Si lo queremos hacer recursivamente solo añadiremos el parámetro R. Recomiendo que vayan probando cada cosa que digo :) Paginas webs que recomiendo para seguir aprendiendo For y me inspiraron para hacer esto:
Otras sintaxis (Web para aprender de las otras funciones) Profesor Emilio Jose Barco.