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

265

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

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

Брайан Р. Бонди
источник

Ответы:

348

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

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

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

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

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

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 char ( ^):

for /f "usebackq delims=|" %%f in (`dir /b "c:\program files" ^| findstr /i microsoft`) do echo %%f
Франси Пенов
источник
3
По крайней мере, для некоторых команд файловая переменная должна быть заключена в двойные кавычки.
Йирка
1
Зачем /fнужно после for? Согласно справочной документации, /fфлаг открывается и читает каждый файл. Это необходимо для эха или переименования файлов?
Снексе
17
/fПосле FORограничивает его файлы. Аналогично, /dограничивается каталогами (папками) и /rинструктирует его быть рекурсивным.
3
+1 Это живой ответ, к которому постоянно обращаются; большое спасибо.
Сабунку
4
Просто понял, что вы должны использовать обратные кавычки ... Вместо 'dir /b "c:\program files"'этого должно быть`dir /b "c:\program files"`
endavid
101

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

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

Команда forfiles доступна в Windows Vista и выше.

Пол Хо
источник
1
было трудно использовать пути с пробелами во 2-й оболочке cmd. В конце я настроил% PATH% env var, чтобы выполнить работу. Но спасибо. полезно
twobob
70

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

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

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

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

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

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

for %%f in (%1\*.*) do echo %%f
Гордон Белл
источник
8
не просто, но и значительно более элегантно по сравнению с оценкой dir /Bрезультата for.
syneticon-dj
5
Добавьте a / r перед% f для просмотра подкаталогов
PRMan
35

использование

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

с участием:

  • путь является начальным путем.
  • %% var - это некоторый идентификатор.
  • *. * являющаяся файловой маской ИЛИ содержимым переменной.
  • some_command - команда для выполнения с путем и var, объединенными в качестве параметров.
mstrobl
источник
2
Я получаю ошибку: %%var was unexpected at this time.Можете ли вы привести точный пример? Я попробовал кучу вариацийfor /r . %%var in (*.*) do echo %%var
hippietrail
3
По какой-то странной причине имя переменной ограничено одним символом.
ollb
2
Можем ли мы использовать разные смайлики для разных результатов?
Серебро Кветтье
8

По-другому:

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

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

скоро
источник