@echo off
setlocal EnableDelayedExpansion
rem Define working variables
set "dir=D:\Test\z"
set "exclude=/backup/resources/"
rem Change current dir to working dir
cd /D "%dir%"
rem Process all folders in this dir
for /D %%f in (*) do (
rem If current folder is not in "exclude" var
if "!exclude:/%%f/=!" equ "%exclude%" (
rem Delete it
ECHO rd /s /q "%%f"
)
)
Этот метод используют внутренний cmd.exe только команды, поэтому он работает быстрее, чем другие методы, которые могут использовать внешние .exe (например, findstr.exe
).
Способ обнаружение, если имя в переменном исключении пытается удалить такое название из него: "%exclude:/%%f/=%"
: если результат равен исходное переменного содержимое, папка была не там. Этот метод очень прост и эффективен и не имеет значения для букв, поэтому он не требует никакого /I
игнорировать переключатель корпуса в команде if
.
Имена ограничены слэшами, чтобы избежать каких-либо проблем, вызванных совпадением частичного имени; по этой причине часть %%f
заключена в косые черты в команде if
.
Обратите внимание, что значение %%f
изменяется на на каждой итерации команды for
. По этой причине переменная exclude
окружена восклицательными знаками вместо процентов, а команда setlocal EnableDelayedExpansion
приведена в начале; в противном случае,% расширения% будет сделано только один раз, до for
итераций начала команды. Вы можете искать «замедленное расширение» на этом форуме для дальнейшего объяснения этого момента.
Большое спасибо.Все прошло отлично. Не могли бы вы случайно объяснить сценарий? –
Этот метод имеет две проблемы: для поиска имен папок требуется простое совпадение (это легко решить, добавив ключ '/ I' игнорировать регистр в команде' findstr'), а также исключить папки, которые частично соответствуют любому имени в список исключений. Например, он также исключает папки 'backup1',' backupA', 'backupETC'. – Aacini