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

#windows #file #loops #batch-file #cmd

Вопрос:

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

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

Ответ №1:

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

 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
 

Комментарии:

1. По крайней мере, для некоторых команд переменная файла должна быть заключена в двойные кавычки.

2. Зачем это /f нужно после for того, как ? Согласно справочным документам, /f флаг открывает и считывает каждый файл. Это необходимо для эха или переименования файлов?

3. /f После FOR ограничивает его файлами. Аналогично, /d ограничивает каталоги (папки) и /r предписывает ему быть рекурсивным.

4. 1 Это живой ответ, которому постоянно уделяют внимание; большое спасибо.

5. Только что понял, что вам нужно использовать обратные кавычки… Вместо 'dir /b "c:program files"' этого должно быть `dir /b "c:program files"`

Ответ №2:

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

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

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

Комментарии:

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

2. работает очень хорошо, например: forfiles /s /m *.bak /c «cmd /c 7za.exe a @путь.7z @путь»

Ответ №3:

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

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

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

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

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

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

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

Комментарии:

1. не просто проще, но и значительно элегантнее по сравнению с оценкой dir /B результатов с for помощью .

2. Добавьте a /r перед %f в подкаталоги рекурсии

Ответ №4:

Воспользуйся

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

с:

  • путь-это начальный путь.
  • %%var-это какой-то идентификатор.
  • *.* будучи файловой маской ИЛИ содержимым переменной.
  • some_command-это команда для выполнения с путем и var, объединенными в качестве параметров.

Комментарии:

1. Я получаю ошибку: %%var was unexpected at this time. можете ли вы привести точный пример? Я перепробовал кучу вариантов for /r . %%var in (*.*) do echo %%var

2. По какой-то странной причине имя переменной ограничено одним символом.

3. Можем ли мы использовать разные смайлики для разных результатов?

Ответ №5:

Другой способ:

 for %f in (*.mp4) do call ffmpeg -i "%~f" -vcodec copy -acodec copy "%~nf.avi"
 

Комментарии:

1. что означает «~nf»?

2. @JudgeDredd "%~nf" означает имя файла без расширения, где f частично указано имя переменной for . Документы: docs.microsoft.com/en-us/previous-versions/windows/it-pro/…

Ответ №6:

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

Комментарии:

1. Пожалуйста, не публикуйте только код в качестве ответа, но также предоставьте объяснение того, что делает ваш код и как он решает проблему вопроса. Ответы с объяснением, как правило, более полезны и более качественны, и с большей вероятностью привлекут внимание.

2. Ваш ответ на самом деле не очень хорошо отвечает на вопрос, если они не понимают контекста данной строки. В любом случае вам не нужно было этого делать, так как у ATTRIB есть флаги командной строки для запуска во вложенных каталогах и обработки всех файлов. ATTRIB -S -H -R /S /D *.* (/S Обрабатывает файлы в подкаталогах, /D также обрабатывает папки)