Используя команду 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