FORFILES - Procesar archivos en bloque
A veces quieres eliminar solo los archivos de registro con más de 30 días, o aplicar la misma operación a todos los archivos con cierta extensión.
El comando FORFILES selecciona los archivos que cumplen tus condiciones y ejecuta un comando en cada uno. Como puede filtrar por fecha de última modificación, es ideal para limpiar archivos antiguos.
Uso básico
FORFILES [/P directorio] [/M máscara] [/S] [/C "comando"] [/D [+|-]fecha_o_días]
Todas las opciones son opcionales. Si omites todas, se muestran los nombres de todos los archivos y carpetas del directorio actual.
forfiles
Ten en cuenta que los nombres se muestran entre comillas dobles.
Opciones principales
| Opción | Descripción |
|---|---|
/P directorio | Directorio desde el que empieza la búsqueda (por defecto, el directorio actual) |
/M máscara | Nombres de archivo que se procesan. Admite comodines (por defecto, todos) |
/S | Busca de forma recursiva en los subdirectorios |
/C "comando" | Comando que se ejecuta en cada archivo (por defecto, cmd /c echo @file) |
/D fecha_o_días | Filtra por fecha de última modificación. Se explica en detalle más abajo |
Procesar archivos por extensión
Usa /M para acotar los archivos y /C para indicar el comando que se ejecuta.
forfiles /M *.log /C "cmd /c echo @file"
Dentro del comando de /C puedes consultar información del archivo que se está procesando mediante las variables @.
| Variable | Contenido |
|---|---|
@file | Nombre del archivo (con la extensión) |
@fname | Nombre del archivo sin la extensión |
@ext | Extensión (sin el punto) |
@path | Ruta completa del archivo |
@relpath | Ruta relativa al directorio indicado con /P |
@isdir | TRUE si es un directorio, FALSE si es un archivo |
@fsize | Tamaño del archivo en bytes |
@fdate | Fecha de última modificación |
@ftime | Hora de última modificación |
forfiles /P C:\Logs /M *.log /C "cmd /c echo @path @fsize bytes"

中小企業経営者のためのRPA入門 RPA導入を成功させる方法

60分でわかる! AIエージェント 超 入門

コマンドラインの黒い画面が怖いんです。

知識・才能ゼロでもらく~に月10万円稼ぐ! よくわかるAI副業超入門
@file y @path se expanden con comillas dobles alrededor del valor. Por eso puedes pasarlos tal cual, como en del @path, y las rutas con espacios funcionan correctamente. No necesitas añadir tus propias comillas, como en "@path".
Ejecutar comandos internos con cmd /c
FORFILES inicia el comando indicado en /C como un proceso aparte. Los comandos internos integrados en el Símbolo del sistema, como echo y del, no son archivos ejecutables independientes, por lo que debes llamarlos con cmd /c.
forfiles /M *.txt /C "echo @file"
forfiles /M *.txt /C "cmd /c echo @file"
Por esta misma razón el valor predeterminado de /C es cmd /c echo @file.
Los comandos externos, como los archivos .exe, se ejecutan sin cmd /c. Por ejemplo: forfiles /M *.txt /C "notepad @file".
Filtrar por fecha de modificación (/D)
La opción /D filtra los archivos por su fecha de última modificación. Puedes indicar un número de días o una fecha.
| Especificación | Significado |
|---|---|
/D -30 | Archivos modificados por última vez hace 30 días o antes |
/D -2025/01/01 | Archivos modificados por última vez el 1 de enero de 2025 o antes |
/D 2025/01/01 | Archivos modificados por última vez el 1 de enero de 2025 o después |
Si omites el signo, se asume +. El formato de la fecha depende de la configuración regional del sistema (yyyy/MM/dd en sistemas japoneses; la documentación de Microsoft indica MM/DD/YYYY). El formato de salida de @fdate también sigue la configuración regional. Si indicas un número de días, no tienes que preocuparte por el formato.
forfiles /P C:\Logs /M *.log /D -7 /C "cmd /c echo @file @fdate"
/D -30 procesa los archivos cuya fecha de modificación es igual a la de hace 30 días o anterior. Se incluyen los archivos modificados exactamente hace 30 días.
Eliminar archivos antiguos de forma segura
Borrar periódicamente los registros es un uso típico de FORFILES. Sin embargo, la eliminación no se puede deshacer, así que sigue siempre estos dos pasos.
Paso 1: muestra los archivos afectados sin borrarlos y revísalos
forfiles /P C:\Logs /M *.log /S /D -30 /C "cmd /c if @isdir==FALSE echo @path"
Paso 2: si los archivos son los esperados, sustituye echo por del
/M *.log también coincide con las carpetas, por lo que if @isdir==FALSE limita el proceso a los archivos. Usa la misma condición en la vista previa y en la eliminación.
forfiles /P C:\Logs /M *.log /S /D -30 /C "cmd /c if @isdir==FALSE del @path"
Los archivos eliminados con del no van a la Papelera de reciclaje. Si te equivocas en la ruta de /P, podrías borrar archivos que no querías. Comprueba siempre los archivos afectados en el paso 1 antes de ejecutar la eliminación.
Incluir subcarpetas (/S)
Con /S, también se procesan todas las subcarpetas del directorio indicado con /P.
forfiles /P C:\Docs /S /M *.txt /C "cmd /c echo @relpath"
@relpath devuelve una ruta relativa al directorio indicado con /P, como ".\sub\note.txt".
Procesar solo carpetas
Con @isdir puedes distinguir entre archivos y carpetas.
forfiles /P C:\Docs /C "cmd /c if @isdir==TRUE echo @file"
Especificar caracteres especiales
Si quieres usar caracteres como las comillas dobles dentro de /C, puedes indicar un código hexadecimal con el formato 0xHH.
forfiles /M *.txt /C "cmd /c echo 0x22@fname0x22"
0x22 representa unas comillas dobles (").
Consejos para archivos por lotes
Cuando no se encuentra ningún archivo
Si ningún archivo cumple las condiciones, FORFILES muestra un mensaje de error y establece ERRORLEVEL en un valor distinto de cero. Puedes aprovecharlo para detectar en un archivo por lotes que “no hay archivos”. Sin embargo, otros errores, como una ruta incorrecta, también devuelven 1, por lo que no sirve para comprobaciones estrictas.
@echo off
forfiles /P C:\Logs /M *.log /D -30 >nul 2>&1
if errorlevel 1 (
echo No hay registros que eliminar.
) else (
echo Se encontraron registros con más de 30 días.
)
Sobre el % en archivos por lotes
Las variables @ de FORFILES empiezan por @, por lo que no necesitas duplicar ningún % en un archivo por lotes. En cambio, cuando uses una variable como %LOG_DIR% en una ruta, enciérrala entre comillas dobles por si contiene espacios.
@echo off
set LOG_DIR=C:\My Logs
set DAYS=30
forfiles /P "%LOG_DIR%" /M *.log /S /D -%DAYS% /C "cmd /c echo @path"
Si solo necesitas repetir una operación sobre una lista de nombres de archivo, el comando FOR también puede hacerlo. Sin embargo, FOR no compara fácilmente las fechas de modificación, así que FORFILES resulta útil cuando necesitas una condición de fecha.
Resumen
| Operación | Comando |
|---|---|
| Listar nombres de archivo | forfiles /M *.log |
| Ejecutar un comando interno | forfiles /C "cmd /c echo @file" |
| Incluir subcarpetas | forfiles /S |
| Extraer archivos de N días o más | forfiles /D -N |
| Indicar el directorio de inicio | forfiles /P directorio |
| Procesar con la ruta completa | @path |