Как найти все папки с определенным именем и удалить все их содержимое, за исключением двух файлов, с помощью пакетного скрипта?

Как найти все папки с определенным именем и удалить все их содержимое, за исключением двух файлов, с помощью пакетного скрипта?

Чтобы очистить проект, мне нужно найти все (под)папки, именованные palette-libraryначиная с текущего местоположения файла пакетного скрипта, а затем удалить все его содержимое, за исключением папки с именем penstyle-opacity texturesи файла с именем penstyle-opacity.plt. Я использую Windows 7.

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

решение1

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

Например:

7z a -r my_archive penstyle-opacity.plt

или:

7z a -r my_archive "palette-library\penstyle-opacity textures\penstyle-opacity.plt"

Попробуйте и выберите то, что вам больше подходит.

решение2

Первый параметр — папка для удаления, остальное — список исключений файлов, подстановочные знаки разрешены, удалит все папки и их подпапки, кроме файлов, соответствующих списку. Хитрость в том, чтобы сначала скрыть все исключения, а затем отобразить их после удаления.

@echo off

rem test routine
call :DELDIREXCEPT "c:\testfolder" "pru 2" "must leave.docx" *.jpg *.png *.exe


GOTO :FIN

REM   * * * *  SUBROUTINES FROM HERE  * * * *
REM

:DELDIREXCEPT
  rem deletes folder except a list of files
    rem  ~ removes quotes
  set delDir=%~1
  if not exist "%delDir%" goto :FIN
  pushd %delDir% 2>nul || goto :FIN
    rem get rest of params
  shift
  rem https://stackoverflow.com/questions/357315/how-to-get-list-of-arguments/34920539#34920539
  rem Delayed expansion disabled in order not to interpret "!" in param values;
  rem however, if a param isn't quoted, chars like "^", "&", "|" get interpreted
  setlocal disabledelayedexpansion
  set param_0=0
  :repeat
    set "lastparam=%~1"
    set /a param_0+=1
    if defined lastparam (
      set "param_%param_0%=%lastparam%"
      echo Hide: "%lastparam%"
      attrib "%lastparam%" +h /s /d 2>nul
      shift
      goto :repeat
    ) else set /a param_0-=1

  setlocal enabledelayedexpansion
  echo .. deleting %delDir%
  del /s /q /a-h *.* 2> NUL
  echo ...
  :: unhide arguments
  for /l %%Z in (1 1 %param_0%) do (
    echo/ unHide: "!param_%%Z!"
    attrib /s /d "!param_%%Z!" -h 2>nul
  )
  popd
goto :FIN
REM END DELDIREXCEPT


:FIN

Связанный контент