Как использовать вложенный цикл. для всех директ дел для всех файлов дел - PullRequest
0 голосов
/ 08 мая 2019

Для запуска пакетного файла, который будет выполнять поиск во всех папках, которые находятся в R: \, за исключением папок в exculde_dir.txt, а затем удаляет все файлы, которые не соответствуют расширениям в exclude_FILE.txt

Я имел в виду рабочий ответ:

Выполните итерацию всех файлов в каталоге, используя цикл 'for' Слегка изменено ниже:

for %%f in (R:\*) do ( something_here ^| findstr /I /V /L /G:"R:\exclude_FILE.txt")

вместес другим ответом:

Команда Windows findstr: исключить результаты, содержащие определенную строку

for /F "delims=" %%D in ('dir /B /S /A:D "R:" ^| findstr /I /V /L /G:"R:\exclude_DIR.txt"') do echo/%%D

Рассмотрим следующую теоретическую структуру:

R:\DIR1\file.jpg
R:\DIR1\file.mkv
R:\DIR1\file.txt

R:\DIR2\file.jpg
R:\DIR2\file.mkv
R:\DIR2\file.txt

R:\DIR3\file.jpg
R:\DIR3\file.mkv
R:\DIR3\file.txt

R:\$RECYCLE.BIN

где содержимое файла exclude_FILE.txt

.mkv
.avi
.m4v

и exculde_DIR.txt

$RECYCLE.BIN
DIR2

, но не удалось получить правильный синтаксис.Я ожидаю, что только файлы .mkv останутся в DIR1 и DIR3, и любой другой каталог, не исключенный, и исключенный DIR2 и корзина останутся нетронутыми.Спасибо!

1 Ответ

0 голосов
/ 08 мая 2019

Используя команду findstr , нет необходимости отделять каталоги от файлов, вы можете указать их в одном исключающем файле, скажем, exclude.txt, используя регулярные выражения (/R), а не чем буквенные строки (/L), и которые могут выглядеть следующим образом (# и все, что находится позади, не является частью содержимого файла; убедитесь, что нет пробелов в конце):

\\DIR2\\           # directory names in file paths must be given within literal `\`;
                   # this avoids partial directory names to match, like `myDIR2`, for instance;
\\$RECYCLE\.BIN\\  # literal `\` must be stated as `\\`, literal `.` as `\.`;
                   # also `[` and `]` needed to be escaped like `\[` and `\]`, respectively;
\.mkv$             # the trailing `$` symbol anchors the extension to the end of a file path;
\.avi$
\.m4v$

Подходящий код для этого здесь:

rem // Note that the exclusion file must be placed in the same directory as this script!
for /F "delims=" %%I in ('
    dir /S /B /A:-D "R:\*.*" ^| findstr /I /R /V /G:"%~dp0exclude.txt"
') do (
    ECHO del "%%I"
)

После проверки кода удалите команду ECHO в верхнем регистре, чтобы фактически удалить файлы.

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

rem // Note that the exclusion file must be placed in the same directory as this script!
rem // Assign path the exclusion file to a variable:
set "EXCLUDE=%~dp0exclude.txt"
rem // Convert path of this script to a regular expression suitable for `findstr`:
call :CONVERT BATCH "%~f0"
rem // Convert path of exclusion file to a regular expression suitable for `findstr`:
call :CONVERT EXCLF "%EXCLUDE%"

for /F "delims=" %%I in ('
    dir /S /B /A:-D "R:\*.*" ^| ^
        findstr /I /R /V /G:"%EXCLUDE%" /C:"^%BATCH%$" /C:"^%EXCLF%$"
') do (
    ECHO del "%%I"
)
exit /B

:CONVERT
    rem // The first command line argument is a variable name;
    rem // Assign second command line argument to a variable:
    set "STR=%~2"
    rem // Escape certain characters that have special meaning to `findstr`:
    set "STR=%STR:\=\\%"
    set "STR=%STR:.=\.%"
    set "STR=%STR:[=\[%"
    set "STR=%STR:]=\]%"
    rem // Assign result to given variable:
    set "%~1=%STR%"
    exit /B
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...