windows pasar - Iterar todos los archivos en un directorio usando un bucle 'for'




carpetas listar (13)

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, podría 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 desea que los subdirectorios también use la opción / s al final. También puede usar los otros conmutadores de xcopy si los necesita por otras razones.

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

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


Para iterar sobre cada archivo funcionará un bucle for:

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

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

Esto me llevó a algunos problemas y pensé que mi caso de uso podría ayudar. Aquí hay un bucle que lee la 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.


% 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

Esto lista 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, necesita duplicar los signos%.

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

(gracias @agnul)


Yo usaría vbscript (Windows Scripting Host), porque estoy seguro de que no se 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 .


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

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

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


En bash, podrías 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

Acabo de darme cuenta de que preguntaste por batch , que leí mal como bash . Por lo tanto, esta respuesta puede no ser apropiada para su pregunta.


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). Así que también hace la diferencia entre carpetas y archivos como ejecutables.

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


Este for-loop listará 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 "muestra solo nombres, no fechas de tamaño, etc.

Algunas cosas para saber sobre el argumento de dir / a.

  • Cualquier uso de "/ a" listaría todo, incluidos los atributos ocultos y del sistema.
  • "/ ad" solo mostraría subdirectorios, incluidos los ocultos y los 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 comandos, elimine un "%".

Espero que esto ayude.


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. Echale un vistazo

dir /b /a-d > AllFilesInCurrentDirectorylist.txt

También podría usar el comando forfiles :

forfiles /s 

y también comprobar si es un directorio

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

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

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"
)

Esto eliminará las carpetas y archivos y dejará la carpeta atrás.

pushd "%pathtofolder%" && (rd /s /q "%pathtofolder%" 2>nul & popd)






windows batch-file for-loop cmd