Leer ficheros de un directorio con for en batch
Crear un script en windows es crear un archivo bat y utilizarlo para obtener resultados de forma fácil, por ejemplo leer los ficheros de un directorio en Windows, y para cada fichero encontrado hacer una acción.
Crear archivo bat con el comando FOR
El comando FOR sirve para ejecutar bucles de instrucciones, y suele ser común en todos los lenguajes de programación.
Un bucle son varias repeticiones de algunas instrucciones.
Sintaxis bat comandos comando FOR
Hay que distinguir si el comando se ejecuta en línea de comandos directamente o bien se ejecuta dentro de un fichero batch o .bat
Ejecutar línea de comandos
Se puede utilizar el símbolo % para las variables
FOR %var IN (lista) DO (
comando
comando
...
)
Ejecutar dentro de un BAT
La diferencia con la línea de comandos, es que hay que utilizar doble signo %% para que funcione bien.
también indicar que el nombre de la variable debe ser solo una letra
FOR %%v IN (lista) DO (
comando
comando
...
)
Recursividad
FOR /R [ruta] %V IN (lista) DO comando
Directorios
FOR /D %%f in (*) do echo %f
Contador de lista
FOR /L %V IN (inicio, incremento, fin) DO comando
Recorrido de tokens en líneas de texto
FOR /F ["tokens=... delims=..."] %V IN (archivo | 'comando' | "cadena") DO comando
Se pueden combinar los parámetros de opción separados por espacio
FOR /R /D [ruta] %V IN (lista) DO comando
Ejemplos para utilizar el comando FOR
Con estos ejemplos se aprecia que utilizarlo es relativamente fácil, aunque se puede complicar en la medida que se necesite obtener ciertos resultados y ejecutar acciones para cada iteración.
Ejemplo mostrar lista
Un primer ejemplo básico para entender cómo funciona el FOR. Mostrar palabras que figuran entra paréntesis, por cada valor del paréntesis imprime en pantalla el mismo.
FOR %%a IN (valor1 valor2 valor3 valor4) DO (
echo %%a
)
Salida:
valor1
valor2
valor3
valor4
Ejemplo mostrar ficheros de un directorio
Otro ejemplo básico, que muestre los ficheros que hay dentro de un directorio donde se ejecuta el fichero .bat
for %%f in (*) do (
echo %%f
)
Salida:
fichero1.txt
fichero2.doc
fichero3.xls
Filtro mostrar solo algunas extensiones
Se puede colocar entre paréntesis la extensión o extensiones de ficheros que se desea filtrar
for %%f in (*.txt *.xls) do (
echo %%f
)
Salida:
fichero1.txt
fichero3.xls
Ejemplo mostrar ficheros de un directorio y subdirectorios de forma recursiva
Utilizar el parámetro /R para que se haga de forma recursiva.
En el ejemplo parte del directorio donde se ejecuta el fichero .bat
for /R %%f in (*) do (
echo %%f
)
Pero también se puede indicar el directorio
for c:\ /R %%f in (*) do (
echo %%f
)
Incluso pasar por parámetro al fichero .bat el directorio donde buscar
set "folder=%1"
for %%f in (%folder%\*) do @echo %%f
Llamando por línea de comandos al fichero.bat espacio y path o ruta del directorio
>fichero.bat c:\path\elegido
Ejemplo mostrar solo directorios y subdirectorios
Utilizar la opción /D para listar solo directorios
for /D /R %%f in (*) do (
echo %f
)
Ejemplo práctico enviar ficheros de un directorio por email
En este ejemplo se va a utilizar el programa SendSMTP para enviar los ficheros por email. A este programa se le pasa parámetros tal cual su documentación. También se pueden utilizar otros como CHEFSENDER
En el .bat de ejemplo está el FOR que recoge los ficheros y llama al .bat del programa sendsmtp
set "folder=%1"
for %%f in (%folder%\*) do CALL SENDSMTP.bat %%f
Ejecutar bat desde cmd
Llamar al bat con el parámetro de la ruta del directorio como parámetro
>fichero.bat "c:\directorio"
también se puede usar el cmd start
Por cada fichero que se encuentre lo enviará con email según la configuración del SendSMTP o programa que se utilice.
Dependiendo de las necesidades se puede ir agregando opciones vistas anteriormente como filtros de ficheros, etc.
Otros ejemplos prácticos
Otros ejemplos que ayudan a comprender el uso del FOR pueden ser los siguientes:
Contador con saltos de intervalos
Bucle contador de 1 hasta 10 con intervalos de 2 en 2
Paréntesis (x, y, z)
x, es el valor inicial que toma la variable %%f
y, es el incremento
z, es el valor máximo
for /L %%f in (1, 2, 10) do echo %%f
Crear ficheros
Pide al usuario el nombre de fichero y cantidad a crear, lo guarda en variables y crea cada fichero poniendo un número al final para diferenciarlos según el contador.
set/p nombre=Indica el nombre:
set/p num=Cantidad:
for /L %%x in (1, 1, %num%) do (
echo 2> nombre-%%x%.txt
)
Iterar dentro de ficheros
Leer un fichero y mostrar la primera palabra de cada línea
Para ello el FOR recorre cada línea y cada palabra es un "tokens". Entonces muestra el primer token.
for /F %%x in (fichero1.txt) do echo %%x
Iterar dentro de ficheros con varios tokens
Con la cláusula tokens= se utiliza el parámetro /F y se puede seleccionar varios y se pueden guardar para utilizarlos en la iteración. Las variables a partir de la primera se crean automáticamente, es decir, no hay que declararlas.
Tokens fijos
Mostrar las palabras o tokens 1, 3 y 6
for /F "tokens=1,3,6" %%a in (fichero1.txt) do echo %%a %%b %%c
Tokens por rangos
Mostrar tokens del 1 al 3 y además el 6. El rango se utiliza el guion para indicar desde hasta.
for /F "tokens=1-3,6" %%a in (fichero1.txt) do echo %%a %%b %%c %%d
Tokens a partir de una posición
Mostrar línea completa
for /F "tokens=*" %%a in (fichero1.txt) do echo %%a
Mostrar línea completa a partir de la palabra o token 3
for /F "tokens=3*" %%a in (fichero1.txt) do echo %%a
Iterar dentro de ficheros con DELIMS o delimitadores
Adicionalmente a los tokens /F se puede utilizar la cláusula "delims" o delimitador entre tokens. Por defecto y si no se indica ninguno, toma delimitadores los espacios o tabuladores
Quitar delimitadores
Indicando "delims=" (igual a nada)
for /F "delims=" %%a in (fichero1.txt) do echo %%a
Indicar delimitadores
Indicando varios delimitadores "delims=.,;:"
for /F "delims=.,;:" %%a in (fichero1.txt) do echo %%a
Mostrar línea hasta delimitador
for /F "tokens=7* delims=,." %%a in (fichero1.txt) do echo %%a
Otras cláusulas para usar
skip=n , Saltar las n primeras líneas del fichero. La iteración comienza en la siguiente línea (n+1)
eol=caracter , las líneas que comienzan por ese caracter eol, las salta como si fuera comentarios
usebackq, usar la palabra entre comillas simples como una cadena literal o, para nombres de archivo largos que contengan espacios utilizar comillas dobles.
FOR /F "usebackq delims==" %i IN (`conjunto`) DO @echo %i
Iterar variables comandos y cadenas
Sustituir la lista de valores que tiene que tomar la variable por la ejecución de un comando.
El carácter de escape ^ necesario para que funcione dentro del comando.
for /F "tokens=15 delims=:" %%a in (ipconfig ^| find IP) do ( echo %%a )
Fechas
Extraer partes de una fecha delimitando la barra slug /
for /F "tokens=1-3 delims=/:" %%a in (%date%) do (
echo Dia %%a mes %%b año %%c
)
Múltiples variables
Para poder usar múltiples variables hay que indicar una sentencia al comienzo del fichero
setlocal enabledelayedexpansion
y acceder al valor de variables con símbolo de admiración "!" en vez de utilizar el habitual símbolo de porcentaje "%"
setlocal enabledelayedexpansion
rem En la variable num guardo que tabla de multiplicar quiero ver
set /p num=Introduce tabla de multiplicar:
echo Tabla del %num%
for /L %%a in (1,1,10) do (
set /a result=%num%*%%a
echo %num% * %%a = !result!
)
FOR anidados
En el ejemplo anterior de la tabla de multiplicar se puede poner el FOR de iteración del 1 al 10 y dentro el FOR de mostrar la tabla que toca.
@echo off
cls
setlocal enabledelayedexpansion
for /L %%i in (1,1,10) do (
echo Tabla del %%i
for /L %%a in (1,1,10) do (
set /a result=%%i*%%a
echo %%i * %%a = !result!
)
pause
cls
)
Hay muchas opciones y combinaciones para dar solución a cada necesidad, pero en este post hemos intentado mostrar lo más habitual y mostrarte el funcionamiento básico de un script del comando FOR dentro de un fichero BATCH.
Deja una respuesta