Как что-то сделать с каждым файлом в каталоге с помощью пакетного скрипта

Как вы перебираете каждый файл в каталоге с файлом .bat или .cmd?

Для простоты предоставьте ответ, который просто повторяет имя файла или путь к файлу.


person Brian R. Bondy    schedule 07.10.2008    source источник


Ответы (6)


Использование командной строки:

for /f %f in ('dir /b c:\') do echo %f

Использование пакетного файла:

for /f %%f in ('dir /b c:\') do echo %%f

Обновление: если в каталоге есть файлы с пробелами в именах, вам необходимо изменить разделитель, используемый командой for /f. например, вы можете использовать символ вертикальной черты.

for /f "delims=|" %%f in ('dir /b c:\') do echo %%f

Обновление 2: (быстро через полтора года после исходного ответа :-)) Если в самом имени каталога есть пробел, вы можете использовать параметр usebackq в for:

for /f "usebackq delims=|" %%f in (`dir /b "c:\program files"`) do echo %%f

А если вам нужно использовать перенаправление вывода или конвейерную передачу команд, используйте escape-символ (^):

for /f "usebackq delims=|" %%f in (`dir /b "c:\program files" ^| findstr /i microsoft`) do echo %%f
person Franci Penov    schedule 07.10.2008
comment
Я попытался перечислить файлы в текущем каталоге с помощью этой команды [for / f %% f in ('dir / b.') Do echo %% f]. К сожалению, имена файлов с пробелами были напечатаны до их первого пробела ..? Спасибо - person lb.; 07.12.2009
comment
По крайней мере, для некоторых команд файловая переменная должна быть заключена в двойные кавычки. - person Jirka; 03.01.2011
comment
Это также полезно: как выполнить несколько действий с каждым файлом в каталоге с помощью пакетного скрипта stackoverflow.com/questions/2304867/ < / а> - person Snekse; 25.06.2012
comment
Зачем нужен /f после for? Согласно справочной документации, флаг /f открывает и читает каждый файл. Это нужно для отображения или переименования файлов? - person Snekse; 25.06.2012
comment
/f после FOR ограничивает его файлами. Точно так же /d ограничивает каталогами (папками), а /r указывает, что это будет рекурсивно. - person ; 07.08.2012
comment
+1 Это живой ответ, которому постоянно уделяют внимание; огромное спасибо. - person Sabuncu; 21.07.2014
comment
Почему бы просто не использовать tokens = * вместо delims = | для пробелов? - person Jared Allard; 22.07.2014
comment
Я запустил это: C:\Program Files>for /f "usebackq delims=|" %%f in ('dir /b "c:\program files"') do echo %%f, но всегда получаю сообщение %% f было неожиданным в это время .. Почему? Что случилось? - person Dai; 05.04.2015
comment
%% используется в скриптах. если вы просто запускаете команду в cmd, используйте вместо этого% f - person meteorainer; 07.07.2015
comment
Привет, я думаю, вам следует дополнить свой ответ, добавив рекомендацию изменить каталог (cd) в папку с файлами. Это связано с тем, что% f не имеет полного пути, и поэтому к операциям с файлами нельзя получить доступ из любого места. - person Pedro Reis; 30.10.2015
comment
Это правда. dir /b возвращает только имя файла. Однако использовать конкатенацию для добавления имени каталога в операцию после do тривиально. Не нужно переходить в каталог. - person Franci Penov; 30.10.2015
comment
что, если вы хотите, чтобы командный файл перебирал файлы .dwg в ​​каталоге, где и в каталоге, и в имени файла есть пробелы. Это моя попытка: ----- ›for / f usebackq delims = | %% f in ('dir / b c: \ program files * .DWG') do echo %% f ------- ›это сработает? - person BKSpurgeon; 04.02.2016
comment
for /f "usebackq delims=|" %%f in ('dir /b "c:\program files\*.DWG"') do echo %%f - ›это должно сработать, хотя сейчас у меня нет компьютера с Windows для проверки. - person Franci Penov; 04.02.2016
comment
Когда я запускаю скрипт Update2 из командного файла, он отображает только dir /b "c:\program files", а не фактический список файлов :( - person endavid; 08.08.2016
comment
Только что понял, что нужно использовать обратные кавычки ... Вместо 'dir /b "c:\program files"' должно быть `dir /b "c:\program files"` - person endavid; 08.08.2016
comment
@endavid: Я отредактировал ответ, чтобы исправить обратные кавычки. Спасибо, что уловили это. У меня была такая же проблема. - person GuitarPicker; 15.09.2016
comment
@GuitarPicker: обратные кавычки используются только в том случае, если у вас есть опция usebackq, в противном случае вы используете одинарные кавычки. Таким образом, он работает для примеров в Edit 2, но нарушает исходный ответ. - person DavidR; 10.05.2017
comment
Было забавно наблюдать за годами, как люди будут бороться, будь то обратные кавычки или прямые одинарные кавычки. :-) - person Franci Penov; 10.05.2017
comment
`=› Система не может найти файл `dir. - person Quentin 2; 12.06.2018
comment
Для полных путей в подкаталогах используйте 'dir / b / s' - person Quentin 2; 12.06.2018
comment
BTW Для пути с пробелами вы можете просто заключить путь в двойные кавычки, и тогда нет необходимости в обратных кавычках - person yoel halb; 08.05.2019
comment
Хорошая работа. Единственное предложение - добавить кавычки вокруг %% f т.е.do echo "%%f`". Если у вас нет кавычек, вы попытаетесь выполнить команду с пробелом. Например, start "hello world.bat" - допустимая команда, а start hello world.bat - нет. - person Jacob Ward; 07.03.2021

В качестве альтернативы используйте:

forfiles /s /m *.png /c "cmd /c echo @path"

Команда forfiles доступна в Windows Vista и более поздних версиях.

person Paul Houx    schedule 18.10.2012
comment
Было сложно использовать пути с пробелами во 2-й оболочке cmd. В конце концов, я скорректировал% PATH% env var, чтобы выполнить свою работу. Но спасибо. полезный - person twobob; 01.05.2017
comment
работает очень хорошо, например: forfiles / s / m * .bak / c cmd / c 7za.exe a @ path.7z @path - person Bludau Media; 12.08.2020

Самый простой способ:

В командной строке используйте:

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

Из пакетного файла (удвойте знаки процента):

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

Из пакетного файла с папкой, указанной как 1-й параметр:

for %%f in (%1\*.*) do echo %%f
person Gordon Bell    schedule 08.11.2013
comment
не только самый простой, но и значительно более элегантный по сравнению с оценкой вывода dir /B с помощью for. - person syneticon-dj; 22.01.2014
comment
Добавьте / r перед% f для рекурсивных подкаталогов - person PRMan; 06.08.2015

Использовать

for /r path %%var in (*.*) do some_command %%var

с участием:

  • path является начальным путем.
  • %% var - некоторый идентификатор.
  • *. * - маска файла ИЛИ содержимое переменной.
  • some_command - это команда, которую нужно выполнить с путём и var, объединенными в качестве параметров.
person mstrobl    schedule 07.10.2008
comment
Получаю ошибку: %%var was unexpected at this time. Можете привести точный пример? Перепробовал кучу вариантов for /r . %%var in (*.*) do echo %%var - person hippietrail; 20.11.2012
comment
По какой-то странной причине имя переменной ограничено одним символом. - person ollb; 16.12.2012
comment
Можно ли использовать разные смайлы для разных результатов? - person Silver Quettier; 04.08.2014

Другой путь:

for %f in (*.mp4) do call ffmpeg -i "%~f" -vcodec copy -acodec copy "%~nf.avi"
person thistleknot    schedule 17.04.2016
comment
что означает ~ nf? - person player0; 25.04.2018
comment
@JudgeDredd "%~nf" - имя файла без расширения, где f - имя переменной, указанной в части for. Документы: docs.microsoft.com/en-us/previous-versions/windows/it-pro/ - person Slava; 27.04.2018

У меня была вредоносная программа, которая пометила все файлы в каталоге как скрытые / system / readonly. Если кто-то еще окажется в такой ситуации, перейдите в каталог и запустите for /f "delims=|" %f in ('forfiles') do attrib -s -h -r %f.

person Anon    schedule 14.05.2013
comment
Пожалуйста, не публикуйте только код в качестве ответа, но также объясните, что делает ваш код и как он решает проблему вопроса. Ответы с объяснением обычно более полезны и качественнее, и с большей вероятностью получат положительные отзывы. - person SherylHohman; 06.09.2020