Leer ficheros de un directorio con for en batch

comando for en bat

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.

Índice
  1. Crear archivo bat con el comando FOR
  2. Sintaxis bat comandos comando FOR
  3. Ejemplos para utilizar el comando FOR
  4. Otros ejemplos prácticos

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

ejecutar bat en linea de comandos con parametro

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

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir