windows - txt - Iterar todos los archivos en un directorio usando un bucle ''for''
obtener listado de archivos de una carpeta (15)
¿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?
% 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
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
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.
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"
)
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.
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)
Hay una diferencia sutil entre ejecutar FOR
desde la línea de comandos y desde un archivo por lotes. En un archivo por lotes, debe colocar dos caracteres de %
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
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, así que asegúrese de verificarlo primero si lo necesita. Las caretas (^) 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 el mensaje de DIR "Archivo no encontrado ".
Iterar a través de ...
- ... archivos en el directorio actual:
for %f in (./*) do @echo %f
- ... subdirectorios en dir actual:
for /D %s in (./*) do @echo %s
- ... archivos en el actual y todos los subdirectorios:
for /R %f in (./*) do @echo %f
- ... subdirectorios en el actual y todos los subdirectores:
for /R /D %s in (./*) do @echo %s
Desafortunadamente, no encontré ninguna forma de iterar sobre archivos y subdirectorios al mismo tiempo.
Simplemente use cygwin con su bash para mucha más funcionalidad.
Aparte de esto: ¿Notó que la ayuda integrada 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/en-us/library/bb490890.aspx
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"
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.
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 .
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
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.
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/