Перебрать все файлы в каталоге с помощью " для " петли



Как я могу перебирать каждый файл в каталог с помощью for петли?



и как я могу сказать, является ли определенная запись каталогом или это просто файл?

712   15  

15 ответов:

здесь перечислены все файлы (и только файлы) в текущей директории:

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

к сожалению, я не нашел каких-либо способ, чтобы перебрать файлы и подкаталоги в то же время.

просто использовать программа С Баша гораздо больше функциональность.

кроме того: вы заметили, что buildin help 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-loop будут перечислены все файлы в каталоге.

pushd somedir
for /f "delims=" %%f in ('dir /b /a-d-h-s') do echo %%f
popd

"delims=" полезно показывать длинные имена файлов с пробелами....

'/б" показать только имена, не нужные размер и т. д..

некоторые вещи, которые нужно знать о аргументе dir /a.

  • любое использование "/a " будет перечислять все, включая скрытые и системные атрибуты.
  • " / ad " будет показывать только подкаталоги, в том числе скрытые и системные.
  • " /a-d" аргумент устраняет содержимое с атрибутом ' D'Directory.
  • "/a-d-h-s" покажет все, но записи с атрибутом 'D'Directory, 'h'idden 's'ystem.

Если вы используете это в командной строке, удалить "%".

надеюсь, что это помогает.

для итерации по каждому файлу будет работать цикл 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

в bash, вы можете сделать что-то вроде этого:

for fn in *; do
    if [ -d $fn ]; then
        echo "$fn is a directory"
    fi
    if [ -f $fn ]; then
        echo "$fn is a file"
    fi
done

Я только что заметил, что вы спросили о batch, который я истолковала как Баш. Поэтому этот ответ может не подходить к вашему вопросу.

%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

Я бы использовал 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 "File Not Найдено."

Он также может использовать forfiles:

forfiles /s 

и также проверить, если это каталог

forfiles /p c:\ /s /m *.* /c "cmd /c if @isdir==true echo @file is a directory"

попробуйте это:

::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 И.исполняемые файлы в директории (и поддиректориях). Таким образом, это также делает разницу между папками и файлами в качестве исполняемых файлов.

просто добавить расширение (.pptx .docx ..) если нужно фильтровать другие файлы в цикле

в моем случае мне пришлось удалить все файлы и папки под папки Temp. Так вот как я это сделал. Мне пришлось запустить два цикла один для файла и один для папок. Если файлы или папки имеют пробелы в их именах, то вы должны использовать ""

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"
)

Comments

    Ничего не найдено.