Як я можу повторювати кожен файл у каталозі за допомогою for
циклу?
І як я міг зрозуміти, чи певний запис - це каталог чи це лише файл?
Як я можу повторювати кожен файл у каталозі за допомогою for
циклу?
І як я міг зрозуміти, чи певний запис - це каталог чи це лише файл?
Відповіді:
У цьому списку перераховані всі файли (та лише файли) у поточному каталозі:
for /r %i in (*) do echo %i
Також якщо ви запускаєте цю команду в пакетному файлі, вам потрібно подвоїти знаки%.
for /r %%i in (*) do echo %%i
(спасибі @agnul)
for /r %i in (*) do ( echo %~nxi )
. Цей потік теж може бути дуже корисним: stackoverflow.com/questions/112055/… .
Ітерація через ...
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
%file
і %subdir
може бути тільки один персонаж довго, тобто %f
, %s
.
Для повторення кожного файлу працюватиме цикл 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's / аргумент.
Якщо ви використовуєте це в командному рядку, видаліть "%".
Сподіваюсь, це допомагає.
% 1 відноситься до першого переданого аргументу і не може бути використаний в ітераторі.
Спробуйте це:
@echo off
for %%i in (*.*) do echo %%i
for %1 in (*.*) do echo %1
Спробуйте "ДОПОМОГА" в cmd для повного керівництва
Це посібник для команд XP. http://www.ss64.com/nt/
Щоб повторити всі файли та папки, які ви можете використовувати
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 /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
)
Я б використовував 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
Це лише скаже вам, чи файл НЕ є каталогом, що також буде правдою, якщо файл не існує, тому обов'язково перевірте це, якщо потрібно. Carets (^) використовується для виходу із символів переспрямування, а вихідний файл файлів переспрямовується на 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"
)
Ось моя поїздка з коментарями в коді.
Я просто зачісую навички бітча, тому пробачте всі кричущі помилки.
Я спробував написати все в одне рішення якнайкраще, можу з невеликою модифікацією, де цього вимагає користувач.
Деякі важливі зауваження. Просто змініть змінну recursive
на, FALSE
якщо ви хочете обробляти лише файли та папки кореневих каталогів. В іншому випадку він проходить через усі папки та файли.
C & C вітаємо ...
@echo off
title %~nx0
chcp 65001 >NUL
set "dir=c:\users\%username%\desktop"
::
:: Recursive Loop routine - First Written by Ste on - 2020.01.24 - Rev 1
::
setlocal EnableDelayedExpansion
rem THIS IS A RECURSIVE SOLUTION [ALBEIT IF YOU CHANGE THE RECURSIVE TO FALSE, NO]
rem By removing the /s switch from the first loop if you want to loop through
rem the base folder only.
set recursive=TRUE
if %recursive% equ TRUE ( set recursive=/s ) else ( set recursive= )
endlocal & set recursive=%recursive%
cd /d %dir%
echo Directory %cd%
for %%F in ("*") do (echo → %%F) %= Loop through the current directory. =%
for /f "delims==" %%D in ('dir "%dir%" /ad /b %recursive%') do ( %= Loop through the sub-directories only if the recursive variable is TRUE. =%
echo Directory %%D
echo %recursive% | find "/s" >NUL 2>NUL && (
pushd %%D
cd /d %%D
for /f "delims==" %%F in ('dir "*" /b') do ( %= Then loop through each pushd' folder and work on the files and folders =%
echo %%~aF | find /v "d" >NUL 2>NUL && ( %= This will weed out the directories by checking their attributes for the lack of 'd' with the /v switch therefore you can now work on the files only. =%
rem You can do stuff to your files here.
rem Below are some examples of the info you can get by expanding the %%F variable.
rem Uncomment one at a time to see the results.
echo → %%~F &rem expands %%F removing any surrounding quotes (")
rem echo → %%~dF &rem expands %%F to a drive letter only
rem echo → %%~fF &rem expands %%F to a fully qualified path name
rem echo → %%~pF &rem expands %%A to a path only
rem echo → %%~nF &rem expands %%F to a file name only
rem echo → %%~xF &rem expands %%F to a file extension only
rem echo → %%~sF &rem expanded path contains short names only
rem echo → %%~aF &rem expands %%F to file attributes of file
rem echo → %%~tF &rem expands %%F to date/time of file
rem echo → %%~zF &rem expands %%F to size of file
rem echo → %%~dpF &rem expands %%F to a drive letter and path only
rem echo → %%~nxF &rem expands %%F to a file name and extension only
rem echo → %%~fsF &rem expands %%F to a full path name with short names only
rem echo → %%~dp$dir:F &rem searches the directories listed in the 'dir' environment variable and expands %%F to the fully qualified name of the first one found. If the environment variable name is not defined or the file is not found by the search, then this modifier expands to the empty string
rem echo → %%~ftzaF &rem expands %%F to a DIR like output line
)
)
popd
)
)
echo/ & pause & cls