HOWTO · Batch

El bucle FOR en scripts por lotes

Use el comando FOR de Windows cmd.exe en archivos por lotes para recorrer listas, rangos numéricos, directorios, archivos, texto analizado y argumentos.

En esta página

En un archivo .bat o .cmd, use FOR con una variable de bucle de doble porcentaje, como %%I, para ejecutar un comando por cada elemento. En el símbolo del sistema interactivo se usa un único porcentaje, por ejemplo %I; esta diferencia es una causa habitual de que falle un comando FOR copiado.

FOR puede recorrer una lista literal, un rango numérico, directorios, archivos, texto analizado o los argumentos que recibe un script. Los ejemplos siguientes usan la sintaxis de cmd.exe y mantienen la salida pequeña para que pueda adaptar una forma cada vez.

Recorrer una lista o archivos coincidentes

Coloque la variable de bucle después de FOR, los elementos después de IN y el comando después de DO. Encierre una ruta entre comillas si puede contener espacios; use %%~fI cuando un comando necesite la ruta completa del elemento.

@echo off
FOR %%I IN (red green blue) DO echo %%I

Salida:

red
green
blue

Sustituya la lista literal por un comodín como ("*.txt") para procesar archivos coincidentes en el directorio actual. Los paréntesis hacen que cada ruta coincidente sea un elemento, lo que resulta más seguro con nombres que contienen espacios.

Contar con FOR /L

FOR /L usa (inicio,paso,fin). El valor final se incluye cuando el paso puede alcanzarlo. Para un rango descendente, el paso debe ser negativo; un paso positivo no puede contar hacia atrás.

@echo off
FOR /L %%I IN (5,-2,1) DO echo %%I

Salida:

5
3
1

Esta forma sirve para reintentos, archivos numerados y tareas con una secuencia numérica previsible. Compruebe la dirección y el signo del paso antes de asumir que el bucle se ejecutará.

Enumerar directorios y archivos

Use FOR /D para directorios que coinciden con un patrón. Use FOR /R raíz para buscar archivos en una raíz y sus subdirectorios. El modificador %%~nx muestra solo el nombre y la extensión, por lo que la salida no depende de la ruta absoluta actual.

@echo off
FOR /D %%D IN (demo\*) DO echo DIR %%~nxD
FOR /R demo %%F IN (*.txt) DO echo FILE %%~nxF

Salida:

DIR one
DIR two
FILE first.txt
FILE second.txt

FOR /R busca de forma recursiva, por lo que un comodín amplio puede afectar a más archivos de los previstos. Empiece con echo para revisar los nombres encontrados y sustitúyalo después por el comando que cambia archivos.

Analizar texto con FOR /F

FOR /F lee líneas de un archivo, de una cadena entre comillas o de la salida de otro comando. Sus delimitadores predeterminados son espacios y tabulaciones, así que indique tokens y delims cuando la entrada tenga un separador conocido. Aquí los dos primeros campos separados por comas se convierten en %%A y %%B.

@echo off
FOR /F "tokens=1,2 delims=," %%A IN (names.txt) DO echo %%A %%B

Salida:

Ada Lovelace
Grace Hopper

No use un criterio inventado como "age=23" como opción de FOR /F. Pruebe la cláusula de análisis con entradas representativas y recuerde que las líneas vacías se omiten de forma predeterminada.

Procesar argumentos y anidar bucles

%* representa todos los argumentos enviados al archivo por lotes. Un bucle FOR anidado puede combinar dos conjuntos, pero use una variable distinta en cada nivel. Si modifica una variable de entorno dentro de paréntesis, habilite la expansión retardada y léala con !name! en lugar de %name%.

@echo off
FOR %%A IN (%*) DO echo ARG %%A
FOR %%I IN (1 2) DO FOR %%J IN (A B) DO echo PAIR %%I-%%J

Salida al ejecutar example.bat first second:

ARG first
ARG second
PAIR 1-A
PAIR 1-B
PAIR 2-A
PAIR 2-B

Los archivos por lotes son prácticos para pequeñas tareas de automatización en Windows. Para estructuras de datos complejas, manejo de errores robusto o trabajo multiplataforma, PowerShell suele ser más fácil de mantener; en ambas herramientas, empiece con un bucle echo inofensivo antes de renombrar, copiar o eliminar archivos.