Iterar todos los archivos en un directorio usando un bucle ‘for’

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

¿Y cómo podría decir si una determinada entrada es un directorio o si solo es un archivo?

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)

Iterato a través de …

  • … archivos en el directorio actual: for %f in (.\*) do @echo %f
  • … subdivide en el directorio actual: for /D %s in (.\*) do @echo %s
  • … archivos en el directorio actual y todos los subdirectores: for /R %f in (.\*) do @echo %f
  • … subdivide en la stream y todos los subdires: for /R /D %s in (.\*) do @echo %s

Lamentablemente, no encontré ninguna forma de iterar sobre los archivos y subdivisiones al mismo tiempo.

Solo usa cygwin con su bash para mucha más funcionalidad.

Además de esto: ¿Notaron que la ayuda de buildin de MS Windows es un gran recurso para las descripciones de la syntax de línea de comandos de cmd?

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

Hay una diferencia sutil entre ejecutar FOR desde la línea de comando y desde un archivo por lotes. En un archivo de proceso por lotes, debe poner dos % caracteres al frente 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 

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

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

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

‘/ b “muestra solo nombres, no fechas de tallas, etc.

Algunas cosas que debes saber sobre el argumento dir / a.

  • Cualquier uso de “/ a” mostraría todo, incluidos los atributos ocultos y del sistema.
  • “/ ad” solo mostraría subdirectorios, incluidos los ocultos y del sistema.
  • El argumento “/ ad” elimina el contenido con el atributo ‘D’irectory.
  • “/ adhs” mostrará todo, pero las entradas con el atributo ‘D’irectory’, H’idden ‘S’ystem.

Si usa esto en la línea de comando, elimine un “%”.

Espero que esto ayude.

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 (setx, por ejemplo).

 @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.

En bash, puedes hacer algo como esto:

 for fn in *; do if [ -d $fn ]; then echo "$fn is a directory" fi if [ -f $fn ]; then echo "$fn is a file" fi done 

Me di cuenta de que preguntaste sobre el lote , lo cual malinterpreté como bash . Por lo tanto, esta respuesta puede no ser apropiada para su pregunta.

% 1 se refiere al primer argumento pasado y no puede ser utilizado 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 obtener una guía completa

Esta es la guía para los comandos de 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 (Sólo archivos) en el Directorio actual. Echale un vistazo

 dir /b /ad > AllFilesInCurrentDirectorylist.txt 

Usaría vbscript (Windows Scripting Host), porque en el lote estoy seguro de que no puede 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 

Compruebe FileSystemObject en MSDN .

Uso el comando xcopy con la opción / L para obtener los nombres de los archivos. Entonces, si quieres obtener un directorio o todos los archivos en el subdirectorio, puedes 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 de Windows y no está copiando, así que no importa. si también quieres los subdirectorios, usa la opción / s al final. También puede usar los otros interruptores de xcopy si los necesita por otros motivos.

Intenta 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, por lo que debe verificarlo primero si es necesario. Las referencias (^) se utilizan 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 DIR se redirige a la salida para que pueda probar contra el mensaje de DIR “Archivo no encontrado “.

También podría usar el comando forfiles :

 forfiles /s 

y también verificar si es un directorio

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

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 los archivos .msi y .exe en su directorio (y en el subdirectorio). Por lo tanto, también hace la diferencia entre las carpetas y los archivos como ejecutables.

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