2016-03-22 3 views
1

Заранее: я новичок в пакетной или программировании в целом, поэтому, пожалуйста, объясните как можно больше.Пакетный/CMD-скрипт для удаления папки, но не более одного

Моей проблема:
Я хочу, чтобы удалить все папки не именем X и Y в директории Z (напр. D: \ Test \ г)

Так скажем Z содержит эти папка:

  • резервного
  • ресурсы
  • project1
  • project2
  • project3

мне было бы нужно исключить только резервную копию и ресурсы от удаления с помощью сценария.
Я искал несколько soultions для того, чтобы не удалять только один папка с определенным именем, но я не знаю, возможно ли несколько значений с Batch.

ответ

0

не тестировалось:

@echo off 

set "root_dir=C:\Z" 
set "exclude_list=backup resources" 
pushd "%root_dir%" 
for /f "tokens=* delims=" %%# in ('dir /b /a:d^| findstr /v "%exclude_list%"') do (
    echo rd /s /q "%%~f#" 
) 

если это выглядит нормально удалить echo на последней строке, чтобы активировать удаление.

Если все папки, которые вы хотите удалить, как project* вы можете попробовать также:

for /d %%a in ("project*") do rd /s /q "%%~fa" 
+0

Большое спасибо.Все прошло отлично. Не могли бы вы случайно объяснить сценарий? –

+0

Этот метод имеет две проблемы: для поиска имен папок требуется простое совпадение (это легко решить, добавив ключ '/ I' игнорировать регистр в команде' findstr'), а также исключить папки, которые частично соответствуют любому имени в список исключений. Например, он также исключает папки 'backup1',' backupA', 'backupETC'. – Aacini

0
@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 итераций начала команды. Вы можете искать «замедленное расширение» на этом форуме для дальнейшего объяснения этого момента.

+0

Спасибо за понимание и это конкретное решение. Решение, предоставленное npocmaka, делало это для моей работы, но я приспособию сценарий к тому, чтобы быть более безупречным и применимым для будущих случаев. –

Смежные вопросы