Как я могу перебирать каждый файл в каталоге с помощью цикла for
?
И как я могу определить, является ли определенная запись каталогом или это просто файл?
Как я могу перебирать каждый файл в каталоге с помощью цикла 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
К сожалению, я не нашел способ перебирать файлы и поддиры одновременно.
Просто используйте cygwin с его 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.
Если вы используете это в командной строке, удалите "%".
Надеюсь, что это поможет.
В 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
Я только заметил, что вы спросили о пакете, который я неправильно прочитал как bash. Поэтому этот ответ может не соответствовать вашему вопросу.
% 1 относится к первому аргументу, переданному и не может использоваться в итераторе.
Попробуйте следующее:
@echo off
for %%i in (*.*) do echo %%i
for %1 in (*.*) do echo %1
Попробуйте "ПОМОЩЬ ДЛЯ" в cmd для полного руководства
Это руководство для команд XP. http://www.ss64.com/nt/
Следующий код создает в текущем каталоге файл Named "AllFilesInCurrentDirectorylist.txt" , который содержит список всех файлов (Только файлы) в текущем каталоге. Проверьте это
dir /b /a-d > AllFilesInCurrentDirectorylist.txt
Он также может использовать команду forfiles:
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.
Попробуйте проверить, является ли файл каталогом:
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 "Файл не найден" ".
Я использую команду xcopy с параметром /L для получения имен файлов. Поэтому, если вы хотите получить либо каталог, либо все файлы в подкаталоге, вы можете сделать что-то вроде этого:
for /f "delims=" %%a IN ('xcopy "D:\*.pdf" c:\ /l') do echo %%a
Я просто использую c:\as destination, потому что он всегда существует в системах Windows, и он не копируется, поэтому это не имеет значения. если вы хотите, чтобы в подкаталогах также использовалась опция /s в конце. Вы также можете использовать другие ключи xcopy, если они вам нужны по другим причинам.
попробуйте следующее:
::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
)