¿Cómo puedo encontrar todas las carpetas con un nombre específico y eliminar todo el contenido excepto dos archivos con un script por lotes?

¿Cómo puedo encontrar todas las carpetas con un nombre específico y eliminar todo el contenido excepto dos archivos con un script por lotes?

Para limpiar un proyecto, necesito encontrar todas las (sub)carpetas nombradas palette-librarya partir de la ubicación actual de un archivo de script por lotes y luego eliminar todo su contenido excepto una carpeta llamada penstyle-opacity texturesy un archivo llamado penstyle-opacity.plt. Yo uso Windows 7.

Busqué mucho en Google, pero hasta ahora solo encontré fragmentos que pueden buscar, encontrar y eliminar todo el contenido de una carpeta o eliminar todo excepto el archivo específico de una ubicación predefinida. Sin embargo, no logro juntar los dos.

Respuesta1

Quizás no sea la forma más elegante, pero primero puede archivar archivos por máscara, luego borrar su árbol de archivos y luego descomprimir el archivo con las rutas.

Por ejemplo:

7z a -r my_archive penstyle-opacity.plt

o:

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

Prueba y elige lo que más te convenga.

Respuesta2

El primer parámetro es la carpeta a eliminar, el resto es una lista de excepciones de archivos, se permiten comodines, eliminará todas las carpetas y sus subcarpetas, excepto los archivos que coincidan con la lista. El truco consiste en ocultar todas las excepciones primero y mostrarlas después de eliminarlas.

@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

información relacionada