FORFILES - Procesar archivos en bloque

Mantenido el

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
- □ ×
Ícono de la consola de comandos
Consola de comandos
Microsoft Windows [Version xx.x.xxxxx.xxx]
(c) 2026 Ribbit App Development All rights reserved.
 
C:\users\user>forfiles
”backup.cmd"
"report.txt"
"logs”
C:\users\user>

Ten en cuenta que los nombres se muestran entre comillas dobles.

Opciones principales

OpciónDescripción
/P directorioDirectorio desde el que empieza la búsqueda (por defecto, el directorio actual)
/M máscaraNombres de archivo que se procesan. Admite comodines (por defecto, todos)
/SBusca 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íasFiltra 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 @.

VariableContenido
@fileNombre del archivo (con la extensión)
@fnameNombre del archivo sin la extensión
@extExtensión (sin el punto)
@pathRuta completa del archivo
@relpathRuta relativa al directorio indicado con /P
@isdirTRUE si es un directorio, FALSE si es un archivo
@fsizeTamaño del archivo en bytes
@fdateFecha de última modificación
@ftimeHora de última modificación
forfiles /P C:\Logs /M *.log /C "cmd /c echo @path @fsize bytes"
- □ ×
Ícono de la consola de comandos
Consola de comandos
Microsoft Windows [Version xx.x.xxxxx.xxx]
(c) 2026 Ribbit App Development All rights reserved.
 
C:\users\user>forfiles /P C:\Logs /M *.log /C "cmd /c echo @path @fsize bytes"
”C:\Logs\app.log” 20480 bytes
”C:\Logs\error.log” 1024 bytes
C:\users\user>
おすすめ書籍※ 広告を含む場合があります
中小企業経営者のためのRPA入門 RPA導入を成功させる方法

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

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

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

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

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

知識・才能ゼロでもらく~に月10万円稼ぐ! よくわかるAI副業超入門

知識・才能ゼロでもらく~に月10万円稼ぐ! よくわかるAI副業超入門

@path y @file incluyen comillas dobles

@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ónSignificado
/D -30Archivos modificados por última vez hace 30 días o antes
/D -2025/01/01Archivos modificados por última vez el 1 de enero de 2025 o antes
/D 2025/01/01Archivos 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"
El número de días incluye el día límite

/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"
del no se puede deshacer

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"
- □ ×
Ícono de la consola de comandos
Consola de comandos
Microsoft Windows [Version xx.x.xxxxx.xxx]
(c) 2026 Ribbit App Development All rights reserved.
 
C:\users\user>forfiles /M *.txt /C "cmd /c echo 0x22@fname0x22"
”readme"
"memo”
C:\users\user>

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"
Cuándo usar FOR en su lugar

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ónComando
Listar nombres de archivoforfiles /M *.log
Ejecutar un comando internoforfiles /C "cmd /c echo @file"
Incluir subcarpetasforfiles /S
Extraer archivos de N días o másforfiles /D -N
Indicar el directorio de inicioforfiles /P directorio
Procesar con la ruta completa@path

Artículos relacionados

Preguntas de práctica

Problema de práctica

¿Qué comando lista los archivos modificados por última vez hace 30 días o más?

回答がサーバーに送信されることはありません
Problema de práctica

¿Por qué se añade cmd /c al ejecutar echo o del con /C en FORFILES?

回答がサーバーに送信されることはありません
Problema de práctica

¿Qué debes hacer primero, por seguridad, al eliminar archivos antiguos con FORFILES?

回答がサーバーに送信されることはありません
#Símbolo del sistema #Archivo por lotes #FORFILES #Comando #Operaciones con archivos