#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 также обрабатывает папки)