Перебрать все файлы в каталоге, используя цикл for.
-
02-07-2019 - |
Вопрос
Как я могу перебирать каждый файл в каталоге, используя for
петля?
И как я могу определить, является ли определенная запись каталогом или просто файлом?
Решение
Здесь перечислены все файлы (и только файлы) в текущем каталоге:
for /r %i in (*) do echo %i
Также, если вы запустите эту команду в пакетном файле, вам нужно будет удвоить знаки %.
for /r %%i in (*) do echo %%i
(спасибо @agnul)
Другие советы
Перебрать...
- ...файлы в текущем каталоге:
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
К сожалению, я не нашел способа одновременно перебирать файлы и подкаталоги.
Просто используйте цигвин с его bash для гораздо большей функциональности.
Помимо этого:Заметили ли вы, что справка по сборке MS Windows является отличным источником описания синтаксиса командной строки cmd?
Также посмотрите здесь: http://technet.microsoft.com/en-us/library/bb490890.aspx
Есть тонкая разница между бегом FOR
из командной строки и из командного файла.В батник нужно поместить два %
символы перед каждой ссылкой на переменную.
Из командной строки:
FOR %i IN (*) DO ECHO %i
Из пакетного файла:
FOR %%i IN (*) DO ECHO %%i
Для перебора каждого файла будет работать цикл 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 получит только первую строку файла.
Этот цикл for выведет список всех файлов в каталоге.
pushd somedir
for /f "delims=" %%f in ('dir /b /a-d-h-s') do echo %%f
popd
«delims=" полезен для отображения длинных имен файлов с пробелами....
'/b' показывает только имена, а не даты размера и т. д.
Некоторые вещи, которые нужно знать об аргументе dir /a.
- Любое использование «/a» будет отображать все, включая скрытые и системные атрибуты.
- «/ad» будет отображать только подкаталоги, включая скрытые и системные.
- Аргумент «/a-d» удаляет содержимое с атрибутом «D'irectory».
- «/a-d-h-s» покажет все, кроме записей с атрибутом «D'irectory» и «H'idden» System.
Если вы используете это в командной строке, удалите «%».
Надеюсь это поможет.
%1 относится к первому переданному аргументу и не может использоваться в итераторе.
Попробуй это:
@echo off
for %%i in (*.*) do echo %%i
for %1 in (*.*) do echo %1
Попробуйте «HELP FOR» в cmd для получения полного руководства.
Это руководство по командам XP. http://www.ss64.com/nt/
Следующий код создает файл с именем "AllFilesInCurrentDirectorylist.txt" в текущем каталоге, который содержит список всех файлов (только файлы) в текущем каталоге.Проверьте это
dir /b /a-d > AllFilesInCurrentDirectorylist.txt
Он также мог бы использовать Форфили команда:
forfiles /s
а также проверьте, является ли это каталогом
forfiles /p c:\ /s /m *.* /c "cmd /c if @isdir==true echo @file is a directory"
Я бы использовал 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.
Я использую команду xcopy с параметром /L, чтобы получить имена файлов.Итак, если вы хотите получить каталог или все файлы в подкаталоге, вы можете сделать что-то вроде этого:
for /f "delims=" %%a IN ('xcopy "D:\*.pdf" c:\ /l') do echo %%a
Я просто использую c:\ в качестве места назначения, потому что он всегда существует в системах Windows и не копируется, поэтому это не имеет значения.если вам нужны и подкаталоги, просто используйте параметр /s в конце.Вы также можете использовать другие переключатели xcopy, если они вам нужны по другим причинам.
Попробуйте это, чтобы проверить, является ли файл каталогом:
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 «Файл не найден». ".
попробуй это:
::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..), если вам нужно фильтровать другие файлы в цикле.
В моем случае мне пришлось удалить все файлы и папки во временной папке.Вот как я это сделал.Мне пришлось запустить два цикла: один для файла, другой для папок.Если в именах файлов или папок есть пробелы, вам нужно использовать " "
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"
)
К перебирать все файлы и папки вы можете использовать
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
У меня были проблемы с тем, чтобы ответ jop работал с абсолютным путем, пока я не нашел эту ссылку: https://ss64.com/nt/for_r.html
В следующем примере циклически перебираются все файлы в каталоге, заданном абсолютным путем.
For /R C:\absoulte\path\ %%G IN (*.*) do (
Echo %%G
)