Вы можете фильтровать имена папок точно так же, как вы делаете для файлов, а именно, используя findstr
или find
.
Кроме того, я рекомендуюперейти в текущий обрабатываемый каталог для каждой итерации цикла (используя pushd
/ popd
), поскольку dir /B
возвращает только чистые имена файлов,чтобы вы могли легко работать не в той папке.
Вот как я мог бы закодировать это:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem // Define constants here:
set "folder=C:\X"
set "excludeFile=C:\X\list.txt"
set "excludeName=2019"
rem // Change to the root directory:
pushd "%folder%" && (
rem // Loop through all directories but exclude those with certain partial names:
for /F "delims= eol=|" %%D in ('dir /B /A:D "*" ^| find /V /I "%excludeName%"') do (
rem // Change into currently iterated directory:
pushd "%%D" && (
rem // Loop through all files but exclude those listed in the list file:
for /F "delims= eol=|" %%F in ('
dir /B /A:-D "*.*" ^| findstr /V /L /I /X /G:"%excludeFile%"
') do (
rem // Actually delete a file (remove `/P` after testing!):
del /P "%%F"
)
rem // Return from currently iterated directory to root directory:
popd
)
)
rem // Return to original working directory:
popd
)
endlocal
Возможно, вы заметили измененные параметры findstr
: я добавил /L
форсировать буквальные поиски;затем я заменил /B
на /X
, чтобы он соответствовал полным именам файлов (а не только началу).
Вы можете удалить параметр /P
(подтверждение для каждого файла) из del
и добавление /F
(принудительное удаление файлов только для чтения) и опции /A
(для удаления также скрытых файлов).
Основная проблема в вашем кодеявляется то, что вы никогда не используете for
переменная %%a
;во внутреннем цикле необходимо заменить каждое вхождение %folder%
на %%~a
.