Перебрать все файлы в каталоге, используя цикл for.

StackOverflow https://stackoverflow.com/questions/138497

Вопрос

Как я могу перебирать каждый файл в каталоге, используя for петля?

И как я могу определить, является ли определенная запись каталогом или просто файлом?

Это было полезно?

Решение

Здесь перечислены все файлы (и только файлы) в текущем каталоге:

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

Также, если вы запустите эту команду в пакетном файле, вам нужно будет удвоить знаки %.

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

(спасибо @agnul)

Другие советы

Перебрать...

  • ...файлы в текущем каталоге: for %f in (.\*) do @echo %f
  • ...подкаталоги в текущем каталоге: for /D %s in (.\*) do @echo %s
  • ...файлы в текущем и всех подкаталогах: for /R %f in (.\*) do @echo %f
  • ...подкаталоги в текущем и всех подкаталогах: for /R /D %s in (.\*) do @echo %s

К сожалению, я не нашел способа одновременно перебирать файлы и подкаталоги.

Просто используйте цигвин с его bash для гораздо большей функциональности.

Помимо этого:Заметили ли вы, что справка по сборке MS Windows является отличным источником описания синтаксиса командной строки cmd?

Также посмотрите здесь: http://technet.microsoft.com/en-us/library/bb490890.aspx

Есть тонкая разница между бегом FOR из командной строки и из командного файла.В батник нужно поместить два % символы перед каждой ссылкой на переменную.

Из командной строки:

FOR %i IN (*) DO ECHO %i

Из пакетного файла:

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

Для перебора каждого файла будет работать цикл for:

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

В моем случае мне также нужно было содержимое файла, имя и т. д.

Это привело к нескольким проблемам, и я подумал, что мой вариант использования может помочь.Вот цикл, который считывает информацию из каждого файла «.txt» в каталоге и позволяет вам что-то с ним делать (например, 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!"
)

*Ограничение:val<=%%f получит только первую строку файла.

Этот цикл for выведет список всех файлов в каталоге.

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

«delims=" полезен для отображения длинных имен файлов с пробелами....

'/b' показывает только имена, а не даты размера и т. д.

Некоторые вещи, которые нужно знать об аргументе dir /a.

  • Любое использование «/a» будет отображать все, включая скрытые и системные атрибуты.
  • «/ad» будет отображать только подкаталоги, включая скрытые и системные.
  • Аргумент «/a-d» удаляет содержимое с атрибутом «D'irectory».
  • «/a-d-h-s» покажет все, кроме записей с атрибутом «D'irectory» и «H'idden» System.

Если вы используете это в командной строке, удалите «%».

Надеюсь это поможет.

%1 относится к первому переданному аргументу и не может использоваться в итераторе.

Попробуй это:

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

Попробуйте «HELP FOR» в cmd для получения полного руководства.

Это руководство по командам XP. http://www.ss64.com/nt/

Следующий код создает файл с именем "AllFilesInCurrentDirectorylist.txt" в текущем каталоге, который содержит список всех файлов (только файлы) в текущем каталоге.Проверьте это

dir /b /a-d > AllFilesInCurrentDirectorylist.txt

Он также мог бы использовать Форфили команда:

forfiles /s 

а также проверьте, является ли это каталогом

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

Я бы использовал vbscript (Windows Scripting Host), потому что я уверен, что в пакетном режиме вы не сможете определить, является ли имя файлом или каталогом.

В vbs это может быть примерно так:

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

Проверять FileSystemObject в MSDN.

Я использую команду xcopy с параметром /L, чтобы получить имена файлов.Итак, если вы хотите получить каталог или все файлы в подкаталоге, вы можете сделать что-то вроде этого:

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

Я просто использую c:\ в качестве места назначения, потому что он всегда существует в системах Windows и не копируется, поэтому это не имеет значения.если вам нужны и подкаталоги, просто используйте параметр /s в конце.Вы также можете использовать другие переключатели xcopy, если они вам нужны по другим причинам.

Попробуйте это, чтобы проверить, является ли файл каталогом:

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

Это только скажет вам, НЕ является ли файл каталогом, что также будет верно, если файл не существует, поэтому обязательно проверьте это в первую очередь, если вам нужно.Каретки (^) используются для экранирования символов перенаправления, а вывод списка файлов перенаправляется на NUL, чтобы предотвратить его отображение, а вывод ошибок списка DIR перенаправляется на вывод, чтобы вы могли проверить сообщение DIR «Файл не найден». ".

попробуй это:

::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

он считает файлы .msi и .exe в вашем каталоге (и в подкаталоге).Таким образом, это также имеет значение между папками и файлами как исполняемыми файлами.

Просто добавьте расширение (.pptx.docx..), если вам нужно фильтровать другие файлы в цикле.

В моем случае мне пришлось удалить все файлы и папки во временной папке.Вот как я это сделал.Мне пришлось запустить два цикла: один для файла, другой для папок.Если в именах файлов или папок есть пробелы, вам нужно использовать " "

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

К перебирать все файлы и папки вы можете использовать

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

К перебирать только все папки не с файлами, то вы можете использовать

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

Где /s выдаст все результаты по всему дереву каталогов на неограниченной глубине.Вы можете пропустить /s если вы хотите перебирать содержимое этой папки, а не ее подпапки

Реализация поиска в итерации

К перебирать определенные именованные файлы и папки вы можете найти имя и выполнить итерацию, используя цикл for

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

К перебирать определенные именованные папки/каталоги, а не файлы, затем используйте /AD в той же команде

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

У меня были проблемы с тем, чтобы ответ jop работал с абсолютным путем, пока я не нашел эту ссылку: https://ss64.com/nt/for_r.html

В следующем примере циклически перебираются все файлы в каталоге, заданном абсолютным путем.

For /R C:\absoulte\path\ %%G IN (*.*) do (
  Echo %%G
)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top