Bucles FOR con batch
Los bucles for en Batch son una herramienta poderosa para automatizar tareas repetitivas en sistemas Windows. A continuación, vamos a ver cómo funcionan, sus diferentes variantes y algunos ejemplos prácticos para que puedas utilizarlos eficazmente en tus scripts.
Sintaxis Básica del Bucle for
forEl comando for en Batch permite iterar sobre una serie de elementos, como archivos, cadenas de texto o resultados de comandos. La sintaxis general es la siguiente:
FOR %%variable IN (conjunto_de_elementos) DO comandoNotas Importantes:
%%variable: En scripts Batch, las variables dentro de los buclesforse representan con doble porcentaje (%%). Si ejecutas el comando directamente en la línea de comandos (CMD), usarías un solo%.conjunto_de_elementos: Puede ser una lista de archivos, números, palabras, etc.comando: La acción que deseas realizar en cada iteración.
Tipos de Bucles for en Batch
for en BatchBucle for Básico (Iterar sobre archivos o elementos)
for Básico (Iterar sobre archivos o elementos)Este tipo de bucle es útil para procesar una lista de archivos o elementos especificados.
Ejemplo: Iterar sobre archivos .txt en un directorio
@echo off
FOR %%f IN (*.txt) DO (
echo Procesando el archivo %%f
REM Ahora podemos agregar comandos para manipular %%f, por ejemplo:
type %%f
)Explicación:
%%f: Variable que representa cada archivo.txtencontrado en el directorio actual.*.txt: Patrón que coincide con todos los archivos con extensión.txt.echo Procesando el archivo %%f: Muestra un mensaje por cada archivo procesado.
Bucle for /f (Iterar sobre líneas de un archivo o salida de un comando)
for /f (Iterar sobre líneas de un archivo o salida de un comando)La opción /f permite procesar el contenido de archivos, cadenas de texto o la salida de comandos.
Sintaxis:
Ejemplo: Leer y mostrar cada línea de un archivo de texto
Explicación:
"tokens=*": Indica que se debe leer la línea completa sin dividirla en tokens.%%l: Variable que representa cada línea leída del archivoarchivo.txt.echo Línea leída: %%l: Muestra cada línea del archivo.
Ejemplo: Iterar sobre la salida de un comando
Ten en cuenta que este comando solo funcionará en CMD tradicional, no en powershell.
Explicación:
'dir /b *.txt': Comando cuyo resultado será iterado.dir /blista los archivos en formato sencillo.%%i: Variable que representa cada archivo listado por el comandodir.echo Archivo encontrado: %%i: Muestra cada archivo encontrado.
Bucle for /l (Iterar sobre un rango de números)
for /l (Iterar sobre un rango de números)La opción /l permite iterar sobre un rango de números especificando un inicio, un incremento y un fin.
Sintaxis:
Ejemplo: Contar del 1 al 5
Explicación:
(1,1,5): Inicia en 1, incrementa de 1 en 1, hasta llegar a 5.%%i: Variable que representa el valor actual del contador.echo Contador: %%i: Muestra el valor del contador en cada iteración.
Bucle for /d (Iterar sobre directorios)
for /d (Iterar sobre directorios)La opción /d permite iterar exclusivamente sobre directorios en lugar de archivos.
Ejemplo: Listar todos los subdirectorios en el directorio actual
Explicación:
%%d: Variable que representa cada subdirectorio encontrado.(*): Patrón que coincide con todos los directorios en el directorio actual.echo Directorio encontrado: %%d: Muestra cada directorio encontrado.
Modificadores de Variables
Dentro de los bucles for, puedes usar modificadores para obtener partes específicas de las variables. Algunos de los más comunes son:
%%~nF: Nombre del archivo sin la extensión.%%~xF: Extensión del archivo.%%~dpF: Ruta completa del archivo.%%~fF: Ruta completa y nombre del archivo.
Ejemplo: Renombrar archivos añadiendo un prefijo
Explicación:
%prefix%: Variable que contiene el prefijo a añadir.%%~nxf: Nombre y extensión del archivo actual.REN "%%f" "%prefix%%%~nxf": Renombra cada archivo añadiendo el prefijo definido.
Expansión de variables
Cuando Windows ejecuta un archivo .bat, cada línea pasa por dos fases:
Fase de lectura (parsing) El intérprete lee el bloque de código (por ejemplo, lo que está entre paréntesis). En este momento sustituye todas las variables
%variable%por su valor actual.Fase de ejecución (runtime) Luego ejecuta las líneas que ya tiene "preparadas" en memoria.
Esto es como si el intérprete dijera “Primero leo todo el bloque y sustituyo las variables actuales; después ejecuto las órdenes.” por lo que las variables se mantienen con el valor dado a pesar de los bucles. Mira este ejemplo:
Tú esperarías:
Pero en realidad obtienes:
Ya que cuando el intérprete lee el bucle, sustituye %contador% por su valor actual (0) una sola vez,
antes de que empiece a ejecutar las iteraciones.
Como solución existe el comando setlocal enabledelayedexpansion que le dice al intérprete:
“No expandas las variables
%...%en la fase de lectura, sino cuando la línea se esté ejecutando dentro del bucle.”
Entonces puedes usar !variable! (en lugar de %variable%) para hacerlas dinámicas de forma que el siguiente código:
Ahora si nos mostrará el resultado esperado. Ten en cuenta que:
Solo se necesita delayed expansion dentro de bloques
(...)(buclefor, condicionalif, etc.).Fuera de ellos,
%variable%funciona normalmente.Cuando terminas el bloque, puedes desactivarlo con
endlocal.
Usos prácticos de bucle FOR
Ejemplo 1: Crear archivos con un rango de números en el nombre
Si deseas crear archivos llamados archivo1.txt, archivo2.txt, ..., archivo10.txt, puedes usar el bucle FOR /L para iterar sobre un rango numérico.
Explicación:
/L: Itera sobre un rango de números.(1,1,10): Empieza en 1, incrementa de 1 en 1, hasta llegar a 10.echo Este es el contenido del archivo %%i > archivo%%i.txt: Crea un archivo llamadoarchivo%%i.txtcon contenido específico.archivo%%i.txt: Los nombres de los archivos tendrán números iterativos (archivo1.txt,archivo2.txt, ...).
Ejemplo 2: Crear archivos con nombres personalizados
Si necesitas usar una lista de nombres específicos, puedes usar un bucle FOR con un conjunto de valores predefinidos.
Explicación:
(rojo verde azul amarillo): Lista de valores que serán iterados.%%i: Representa cada valor de la lista.echo Este es el archivo %%i > %%i.txt: Crea un archivo con el nombre basado en cada valor de la lista (rojo.txt,verde.txt, etc.).
Ejemplo 3: Crear archivos con prefijo y números
Si deseas combinar un prefijo con números, puedes definir un prefijo como variable.
Explicación:
SET prefix=Reporte_: Define un prefijo para los nombres de los archivos.%prefix%%%i.txt: Combina el prefijo con el número iterativo (Reporte_1.txt,Reporte_2.txt, etc.).
Ejemplo 4: Crear archivos en diferentes carpetas
Puedes usar el bucle FOR para crear archivos dentro de subdirectorios.
Explicación:
/D: Itera sobre directorios en lugar de archivos.%%i\archivo.txt: Crea un archivo llamadoarchivo.txtdentro de cada subdirectorio encontrado.
Ejemplo 5: Crear archivos con nombres basados en la fecha actual
Si quieres nombres únicos basados en la fecha y hora, puedes usar variables de entorno.
Explicación:
%date%y%time%: Variables de entorno que contienen la fecha y hora actuales.!fecha!y!hora!: Variables con expansión retrasada (SETLOCAL ENABLEDELAYEDEXPANSION).archivo_%%i_!fecha!-!hora!.txt: Crea archivos con nombres únicos comoarchivo_1_2024-11-15-10-30.txt.
Última actualización