Para limpiar un proyecto, necesito encontrar todas las (sub)carpetas nombradas palette-library
a 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 textures
y 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