Итерировать все файлы в каталоге с помощью цикла for

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

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


person Vhaerun    schedule 26.09.2008    source источник
comment
предполагая, что вы имели в виду оболочку Windows по умолчанию, я поменял ваш пост для большей ясности   -  person David Schmitt    schedule 26.09.2008
comment
Также укажите, какую версию Windows вы используете.   -  person jop    schedule 26.09.2008
comment
Этот вопрос следует разделить на два отдельных вопроса, поскольку они не зависят друг от друга.   -  person julealgon    schedule 28.11.2016


Ответы (17)


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

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

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

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

(спасибо @agnul)

person jop    schedule 26.09.2008
comment
Это может зависеть от того, какую ОС вы используете, например, XP / Vista / 2000 может поддерживать разные аргументы командной строки. - person RickL; 26.09.2008
comment
Если вы не хотите использовать это рекурсивно, убедитесь, что вы удалили / r - person jocull; 29.11.2010
comment
Если вы хотите отображать только имена файлов (а не полный путь) с их расширениями в текущем каталоге (рекурсивно), вы можете сделать это следующим образом: for /r %i in (*) do ( echo %~nxi ). Эта ветка тоже может быть действительно полезной: stackoverflow.com/questions/112055/. - person Sk8erPeter; 22.12.2011
comment
Что, если вы хотите сделать более одного дела? Вы можете перечислить несколько вещей, которые нужно сделать? - person Vaccano; 18.10.2013
comment
@Vaccano да, после Do используйте скобки. Т.е. сделать (эхо% i & del% i). Вы также можете использовать ввод вместо & для нескольких команд. - person Jay; 09.03.2014
comment
Если вы используете такие команды, как copy / move, а не echo, убедитесь, что вы правильно указали путь. для / r %% i в (*) делать echo %% i - person Soundararajan; 24.10.2014
comment
@jocull привет - спасибо за совет. требуется ли для цикла for где-нибудь здесь ключевое слово end? - person BKSpurgeon; 17.01.2017
comment
Очевидно, вам нужно использовать однобуквенные имена переменных. - person Álvaro González; 07.11.2017

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

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

person Marco    schedule 26.09.2008
comment
%file и %subdir могут состоять только из одного символа, т. Е. %f, %s. - person Felix Dombek; 30.04.2013
comment
Подкаталоги в текущем каталоге не работают. Я получаю сообщение об ошибке: s было неожиданным в это время - person Z80; 26.02.2016

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

person Aaron Votre    schedule 10.05.2016
comment
Ах, многострочный пример. Спасибо за это! - person Nyerguds; 26.07.2016
comment
@ Аарон Вотре Как завершить цикл? - person nijogeorgep; 05.10.2016
comment
@nijogeorgep Вам не нужно заканчивать цикл. В моем примере все, что находится в круглых скобках (эхо и т. Д.), Будет запускаться один раз для каждого файла '* .txt' в каталоге. Думаю, ответ, который вы ищете, лучше объяснить здесь: stackoverflow.com/questions/1355791/ - person Aaron Votre; 05.10.2016
comment
@Aaron Votre Я пытался запустить некоторые команды maven с помощью скрипта, но он работал как бесконечный цикл, поэтому я попросил об этом. Купить сейчас Я добавил выход в свой цикл и исправил проблему - person nijogeorgep; 05.10.2016
comment
@nijogeorgep Рад, что ты это понял! - person Aaron Votre; 05.10.2016

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

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

FOR %i IN (*) DO ECHO %i

Из командного файла:

FOR %%i IN (*) DO ECHO %%i
person aphoria    schedule 26.09.2008

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

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

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

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

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

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

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

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

person Jay    schedule 07.07.2009

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

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

@echo off
for %%i in (*.*) do echo %%i
person Sam Meldrum    schedule 26.09.2008
comment
Ты прав. Я попытался в немедленном режиме проверить синтаксис FOR и вставить строку прямо в ответ, забыв о параметрах :-) - person Axeman; 26.09.2008

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

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

For /R C:\absoulte\path\ %%G IN (*.*) do (
  Echo %%G
)
person datchung    schedule 25.06.2019

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

Попробуйте "ПОМОЩЬ ДЛЯ" в cmd, чтобы получить полное руководство

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

person Axeman    schedule 26.09.2008

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

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
person jafarbtech    schedule 28.02.2019

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

dir /b /a-d > AllFilesInCurrentDirectorylist.txt
person Ankur    schedule 28.09.2010

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

forfiles /s 

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

forfiles /p c:\ /s /m *.* /c "cmd /c if @isdir==true echo @file is a directory"
person Max    schedule 11.09.2014
comment
@isdir==true должен быть @isdir==TRUE - person psyklopz; 26.02.2015

Вот мои комментарии в коде.

Я просто освежаюсь в навыках biatch, так что простите любые вопиющие ошибки.

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

Некоторые важные примечания: просто измените переменную recursive на FALSE, если вы хотите, чтобы обрабатывались только файлы и папки корневых каталогов. В противном случае он перебирает все папки и файлы.

C&C добро пожаловать ...

@echo off
title %~nx0
chcp 65001 >NUL
set "dir=c:\users\%username%\desktop"
::
:: Recursive Loop routine - First Written by Ste on - 2020.01.24 - Rev 1
::
setlocal EnableDelayedExpansion
rem THIS IS A RECURSIVE SOLUTION [ALBEIT IF YOU CHANGE THE RECURSIVE TO FALSE, NO]
rem By removing the /s switch from the first loop if you want to loop through
rem the base folder only.
set recursive=TRUE
if %recursive% equ TRUE ( set recursive=/s ) else ( set recursive= )
endlocal & set recursive=%recursive%
cd /d %dir%
echo Directory %cd%
for %%F in ("*") do (echo    → %%F)                                 %= Loop through the current directory. =%
for /f "delims==" %%D in ('dir "%dir%" /ad /b %recursive%') do (    %= Loop through the sub-directories only if the recursive variable is TRUE. =%
  echo Directory %%D
  echo %recursive% | find "/s" >NUL 2>NUL && (
    pushd %%D
    cd /d %%D
    for /f "delims==" %%F in ('dir "*" /b') do (                      %= Then loop through each pushd' folder and work on the files and folders =%
      echo %%~aF | find /v "d" >NUL 2>NUL && (                        %= This will weed out the directories by checking their attributes for the lack of 'd' with the /v switch therefore you can now work on the files only. =%
      rem You can do stuff to your files here.
      rem Below are some examples of the info you can get by expanding the %%F variable.
      rem Uncomment one at a time to see the results.
      echo    → %%~F           &rem expands %%F removing any surrounding quotes (")
      rem echo    → %%~dF          &rem expands %%F to a drive letter only
      rem echo    → %%~fF          &rem expands %%F to a fully qualified path name
      rem echo    → %%~pF          &rem expands %%A to a path only
      rem echo    → %%~nF          &rem expands %%F to a file name only
      rem echo    → %%~xF          &rem expands %%F to a file extension only
      rem echo    → %%~sF          &rem expanded path contains short names only
      rem echo    → %%~aF          &rem expands %%F to file attributes of file
      rem echo    → %%~tF          &rem expands %%F to date/time of file
      rem echo    → %%~zF          &rem expands %%F to size of file
      rem echo    → %%~dpF         &rem expands %%F to a drive letter and path only
      rem echo    → %%~nxF         &rem expands %%F to a file name and extension only
      rem echo    → %%~fsF         &rem expands %%F to a full path name with short names only
      rem echo    → %%~dp$dir:F    &rem searches the directories listed in the 'dir' environment variable and expands %%F to the fully qualified name of the first one found. If the environment variable name is not defined or the file is not found by the search, then this modifier expands to the empty string
      rem echo    → %%~ftzaF       &rem expands %%F to a DIR like output line
      )
      )
    popd
    )
  )
echo/ & pause & cls
person Ste    schedule 24.01.2020

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

person Biri    schedule 26.09.2008
comment
Я бы использовал для этого Perl. К сожалению, это не мое дело. - person Vhaerun; 26.09.2008
comment
Какое-то старое приложение? Грустные вещи. - person Biri; 26.09.2008
comment
Один идиот-разработчик увидел командные файлы и подумал, что они решат все наши проблемы. - person Vhaerun; 26.09.2008
comment
@Vhaerun Одним из преимуществ Windows Script Host (WSH) над Perl будет то, что WSH предустановлен со всеми версиями Windows, тогда как Perl нужно будет устанавливать отдельно, что может быть, а может и не быть приемлемым вариантом во всех случаях. - person Parampreet Dhatt; 23.01.2013

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

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

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

person Knoots    schedule 29.12.2012

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

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

person sugerfunk    schedule 04.01.2011

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

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

person Littlepony    schedule 02.12.2016

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

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"
)
person Sam B    schedule 26.09.2018