Pregunta

¿Cómo puedo iterar sobre cada archivo en un directorio usando un bucle for?

¿Y cómo podría saber si cierta entrada es un directorio o si es solo un archivo?

¿Fue útil?

Solución

Esto enumera todos los archivos (y solo los archivos) en el directorio actual:

for /r %i in (*) do echo %i

Además, si ejecuta ese comando en un archivo por lotes, debe duplicar los signos%.

for /r %%i in (*) do echo %%i

(gracias @agnul)

Otros consejos

Iterar a través de ...

  • ... archivos en el directorio actual: for %f in (.\*) do @echo %f
  • ... subdire en el directorio actual: for /D %s in (.\*) do @echo %s
  • ... archivos en actual y todos los subdirectorios: for /R %f in (.\*) do @echo %f
  • ... subdires en actual y todos subdirs: for /R /D %s in (.\*) do @echo %s

Desafortunadamente no encontré ninguna forma de iterar sobre archivos y subdirecciones al mismo tiempo.

Simplemente use cygwin con su bash para mucha más funcionalidad.

Aparte de esto: ¿Notó que la ayuda de compilación de MS Windows es un gran recurso para las descripciones de la sintaxis de la línea de comandos de cmd?

También eche un vistazo aquí: http://technet.microsoft.com/ es-es / library / bb490890.aspx

Hay una sutil diferencia entre ejecutar FOR desde la línea de comando y desde un archivo por lotes. En un archivo por lotes, debe colocar dos % caracteres delante de cada referencia de variable.

Desde una línea de comando:

FOR %i IN (*) DO ECHO %i

De un archivo por lotes:

FOR %%i IN (*) DO ECHO %%i

Para iterar sobre cada archivo, un bucle for funcionará:

for %%f in (directory\path\*) do ( something_here )

En mi caso, también quería el contenido del archivo, el nombre, etc.

Esto condujo a algunos problemas y pensé que mi caso de uso podría ayudar. Aquí hay un bucle que lee información de cada archivo '.txt' en un directorio y le permite hacer algo con él (por ejemplo, setx).

@ECHO OFF
setlocal enabledelayedexpansion
for %%f in (directory\path\*.txt) do (
  set /p val=<%%f
  echo "fullname: %%f"
  echo "name: %%~nf"
  echo "contents: !val!"
)

* Limitación: val < = %% f solo obtendrá la primera línea del archivo.

Este bucle for mostrará una lista de todos los archivos en un directorio.

pushd somedir
for /f "delims=" %%f in ('dir /b /a-d-h-s') do echo %%f
popd

" delims = " es útil para mostrar nombres de archivo largos con espacios en él ...

'/ b " mostrar solo nombres, no fechas de tamaño, etc.

Algunas cosas que debe saber sobre el argumento de dir / a.

  • Cualquier uso de " / a " enumeraría todo, incluidos los atributos ocultos y del sistema.
  • " / ad " solo mostraría subdirectorios, incluidos los ocultos y los del sistema.
  • " / a-d " El argumento elimina el contenido con el atributo 'D'irectory.
  • " / a-d-h-s " mostrará todo, pero las entradas con 'D'irectory,' H'idden 'S'ystem atributo.

Si usa esto en la línea de comando, elimine un "% " ;.

Espero que esto ayude.

% 1 se refiere al primer argumento pasado y no se puede usar en un iterador.

Prueba esto:

@echo off
for %%i in (*.*) do echo %%i
for %1 in (*.*) do echo %1

Pruebe " AYUDA PARA " en cmd para una guía completa

Esta es la guía para los comandos XP. http://www.ss64.com/nt/

El siguiente código crea un archivo llamado "AllFilesInCurrentDirectorylist.txt" en el directorio actual, que contiene la lista de todos los archivos ( Solo archivos) en el directorio actual. Compruébalo

dir /b /a-d > AllFilesInCurrentDirectorylist.txt

También podría usar el comando forfiles :

forfiles /s 

y también verifique si es un directorio

forfiles /p c:\ /s /m *.* /c "cmd /c if @isdir==true echo @file is a directory"

Usaría vbscript (Windows Scripting Host), porque en lote estoy seguro de que no puedes decir que un nombre es un archivo o un directorio.

En vbs, puede ser algo como esto:

Dim fileSystemObject
Set fileSystemObject = CreateObject("Scripting.FileSystemObject")

Dim mainFolder
Set mainFolder = fileSystemObject.GetFolder(myFolder)

Dim files
Set files = mainFolder.Files

For Each file in files
...
Next

Dim subFolders
Set subFolders = mainFolder.SubFolders

For Each folder in subFolders
...
Next

Marque FileSystemObject en MSDN .

Utilizo el comando xcopy con la opción / L para obtener los nombres de los archivos. Entonces, si desea obtener un directorio o todos los archivos en el subdirectorio, puede hacer algo como esto:

for /f "delims=" %%a IN ('xcopy "D:\*.pdf" c:\ /l') do echo %%a

Solo uso c: \ como destino porque siempre existe en los sistemas Windows y no se está copiando, por lo que no importa. si quieres los subdirectorios también usa la opción / s al final. También puede usar los otros interruptores de xcopy si los necesita por otros motivos.

Pruebe esto para probar si un archivo es un directorio:

FOR /F "delims=" %I IN ('DIR /B /AD "filename" 2^>^&1 ^>NUL') DO IF "%I" == "File Not Found" ECHO Not a directory

Esto solo le dirá si un archivo NO es un directorio, lo que también será cierto si el archivo no existe, así que asegúrese de verificarlo primero si es necesario. Las marcas (^) se usan para escapar de los símbolos de redireccionamiento y la salida de la lista de archivos se redirige a NUL para evitar que se muestre, mientras que la salida de error de la lista de DIR se redirige a la salida para que pueda probar el mensaje de DIR & Quot ; Archivo no encontrado & Quot ;.

prueba esto:

::Example directory
set SetupDir=C:\Users

::Loop in the folder with "/r" to search in recursive folders, %%f being a loop ::variable 
for /r "%SetupDir%" %%f in (*.msi *.exe) do set /a counter+=1

echo there are %counter% files in your folder

cuenta archivos .msi y .exe en su directorio (y en el subdirectorio). Por lo tanto, también hace la diferencia entre carpetas y archivos como ejecutables.

Simplemente agregue una extensión (.pptx .docx ..) si necesita filtrar otros archivos en el bucle

En mi caso, tuve que eliminar todos los archivos y carpetas debajo de una carpeta temporal. Así es como terminé haciéndolo. Tuve que ejecutar dos bucles, uno para el archivo y otro para las carpetas. Si los archivos o carpetas tienen espacios en sus nombres, entonces debe usar & Quot; "

cd %USERPROFILE%\AppData\Local\Temp\
rem files only
for /r %%a in (*) do (
echo deleting file "%%a" ...
if exist "%%a" del /s /q "%%a"
)
rem folders only
for /D %%a in (*) do (
echo deleting folder "%%a" ...
if exist "%%a" rmdir /s /q "%%a"
)

Para recorrer en iteración todos los archivos y carpetas puede usar

for /F "delims=" %%a in ('dir /b /s') do echo %%a

Para iterar solo por todas las carpetas no con archivos, entonces puede usar

for /F "delims=" %%a in ('dir /a:d /b /s') do echo %%a

Donde /s dará todos los resultados en todo el árbol de directorios en profundidad ilimitada. Puede omitir /AD si desea recorrer el contenido de esa carpeta, no su subcarpeta

Implementando búsqueda en iteración

Para iterar a través de archivos y carpetas con nombre en particular puede buscar el nombre e iterar usando el bucle

for /F "delims=" %%a in ('dir "file or folder name" /b /s') do echo %%a

Para recorrer en iteración carpetas / directorios con nombre en particular y no archivos , luego use <=> en el mismo comando

for /F "delims=" %%a in ('dir "folder name" /b /AD /s') do echo %%a

Tuve problemas para obtener la respuesta de jop para trabajar con una ruta absoluta hasta que encontré esta referencia: https: / /ss64.com/nt/for_r.html

El siguiente ejemplo recorre todos los archivos en un directorio dado por la ruta absoluta.

For /R C:\absoulte\path\ %%G IN (*.*) do (
  Echo %%G
)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top