it-swarm.com.ru

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

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

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

289
Vhaerun

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

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

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

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

(спасибо @agnul) 

417
jop

Итерация по ...

  • ... файлы в текущем каталоге: 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

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

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

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

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

193
Marco

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

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

FOR %i IN (*) DO ECHO %i

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

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

Для перебора каждого файла будет работать цикл 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 получит только первую строку файла.

43
Aaron Votre

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

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

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

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

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

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

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

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

40
Jay

В bash вы можете сделать что-то вроде этого:

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

Я только что заметил, что вы спросили о batch , который я неправильно прочитал как bash . Поэтому этот ответ может не соответствовать вашему вопросу.

11
Greg Hewgill

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

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

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

Попробуйте "HELP FOR" в cmd для полного руководства

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

5
Axeman

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

dir /b /a-d > AllFilesInCurrentDirectorylist.txt
3
Ankur

Я бы использовал 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 .

2
Biri

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

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

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

2
Knoots

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

::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 ..), если вам нужно отфильтровать другие файлы в цикле

2
Littlepony

Он также может использовать команду forfiles :

forfiles /s 

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

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

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

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 «Файл не найден» ».

2
sugerfunk

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

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"
)
0
Sam B

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

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
0
jafarbtech