Cómo hacer algo a cada archivo en un directorio con un script por lotes

265

¿Cómo iterar sobre cada archivo en un directorio con un archivo .bat o .cmd?

Para simplificar, proporcione una respuesta que solo haga eco del nombre del archivo o la ruta del archivo.

Brian R. Bondy
fuente

Respuestas:

348

Uso de línea de comando:

for /f %f in ('dir /b c:\') do echo %f

Uso de archivos por lotes:

for /f %%f in ('dir /b c:\') do echo %%f

Actualización : si el directorio contiene archivos con espacio en los nombres, debe cambiar el delimitador que for /fusa el comando. por ejemplo, puedes usar el char de tubería.

for /f "delims=|" %%f in ('dir /b c:\') do echo %%f

Actualización 2 : (rápido un año y medio después de la respuesta original :-)) Si el nombre del directorio tiene un espacio en el nombre, puede usar la usebackqopción en for:

for /f "usebackq delims=|" %%f in (`dir /b "c:\program files"`) do echo %%f

Y si necesita usar la redirección de salida o la tubería de comando, use el escape char ( ^):

for /f "usebackq delims=|" %%f in (`dir /b "c:\program files" ^| findstr /i microsoft`) do echo %%f
Franci Penov
fuente
3
Al menos para algunos comandos, la variable del archivo debe estar entre comillas dobles.
Jirka
1
¿Por qué es /fnecesario después del for? Según los documentos de ayuda, la /fbandera se abre y lee cada archivo. ¿Es necesario hacer eco o cambiar el nombre de los archivos?
Snekse
17
El /fafter lo FORrestringe a los archivos. Del mismo modo, se /drestringe a los directorios (carpetas) y le /rindica que sea recursivo.
3
+1 Esta es una respuesta viva, atendida continuamente; muchas gracias.
Sabuncu
44
Acabo de dar cuenta que tiene que usar comillas espalda ... En lugar de 'dir /b "c:\program files"'que debería ser`dir /b "c:\program files"`
endavid
101

Alternativamente, use:

forfiles /s /m *.png /c "cmd /c echo @path"

El comando forfiles está disponible en Windows Vista y versiones posteriores.

Paul Houx
fuente
1
fue difícil usar caminos con espacios en la segunda capa de cmd. Al final, ajusté% PATH% env var para hacer el trabajo. Pero gracias. útil
twobob
70

Método más fácil:

Desde la línea de comandos, use:

for %f in (*.*) do echo %f

Desde un archivo por lotes (duplicar los signos de porcentaje):

for %%f in (*.*) do echo %%f

Desde un archivo por lotes con la carpeta especificada como primer parámetro:

for %%f in (%1\*.*) do echo %%f
Gordon Bell
fuente
8
no sólo más fácil, pero también significativamente más elegante en comparación con la evaluación de la dir /Bsalida con for.
syneticon-dj
55
Agregue a / r antes del% f a los subdirectorios recurrentes
PRMan
35

Utilizar

for /r path %%var in (*.*) do some_command %%var

con:

  • camino siendo el camino de inicio.
  • %% var es algún identificador.
  • *. * siendo una máscara de archivo O el contenido de una variable.
  • some_command es el comando para ejecutar con la ruta y var concatenado como parámetros.
mstrobl
fuente
2
Me sale el error: %%var was unexpected at this time.¿Puedes dar un ejemplo exacto? for /r . %%var in (*.*) do echo %%var
Probé
3
Por alguna extraña razón, el nombre de la variable está restringido a un carácter.
ollb
2
¿Podemos usar diferentes emoticonos para obtener diferentes resultados?
Silver Quettier
8

De otra manera:

for %f in (*.mp4) do call ffmpeg -i "%~f" -vcodec copy -acodec copy "%~nf.avi"
cardo
fuente
¿Qué significa "~ nf"?
jugador0
@JudgeDredd "%~nf"representa el nombre del archivo sin extensión, donde fes el nombre de la variable especificada en forparte. Documentos: docs.microsoft.com/en-us/previous-versions/windows/it-pro/…
Alph.Dev
-1

Tenía un malware que marcaba todos los archivos en un directorio como oculto / system / readonly. Si alguien más se encuentra en esta situación, cd en el directorio y ejecutar for /f "delims=|" %f in ('forfiles') do attrib -s -h -r %f.

Luego
fuente