Повторите все файлы в каталоге, используя цикл " for
Как я могу перебирать каждый файл в каталог с помощью for
петли?
и как я могу сказать, является ли определенная запись каталогом или это просто файл?
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
к сожалению, я не нашел каких-либо способ, чтобы перебрать файлы и подкаталоги в то же время.
просто использовать cygwin С Баша гораздо больше функциональность.
помимо этого: вы заметили, что встроенная справка 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=" полезно показывать длинные имена файлов с пробелами....
'/b " показывать только имена, а не даты размера и т. д..
некоторые вещи, которые нужно знать о аргументе /a dir.
- любое использование "/a " будет перечислять все, включая скрытые и системные атрибуты.
- " / ad"будет показывать только подкаталоги, включая скрытые и системные.
- " / a-d" аргумент исключает содержимое с атрибутом ' D'irectory.
- "/a-d-h-s" покажет все, но записи с атрибутом 'd'Directory, 'h'idden 's'System.
Если вы используете это в командной строке, удалить "%".
надеюсь, что это помогает.
для итерации по каждому файлу будет работать цикл 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
Я только что заметил, что вы спросили о пакета, который я неправильно понял как Баш. Поэтому этот ответ может не соответствовать вашему вопросу.
%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 " файл не Найдено."
Он также может использовать 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 и .исполняемые файлы в директории (и поддиректориях). Таким образом, это также делает разницу между папками и файлами в качестве исполняемых файлов.
просто добавить расширение (.рртх .файлы 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"
)