Um ein Projekt zu bereinigen, muss ich alle (Unter-)Ordner mit dem Namen palette-library
beginnend vom aktuellen Speicherort einer Batch-Skriptdatei finden und dann den gesamten Inhalt außer einem Ordner mit dem Namen penstyle-opacity textures
und einer Datei mit dem Namen löschen penstyle-opacity.plt
. Ich verwende Windows 7.
Ich habe viel gegoogelt, aber bisher habe ich nur Snippets gefunden, die entweder den gesamten Inhalt eines Ordners suchen, finden und löschen oder alles außer der bestimmten Datei aus einem vordefinierten Speicherort löschen können. Ich schaffe es jedoch nicht, die beiden zusammenzubringen.
Antwort1
Vielleicht ist es nicht die eleganteste Methode, aber Sie können die Dateien zunächst nach Maske archivieren, dann Ihren Dateibaum löschen und das Archiv anschließend mit Pfaden entpacken.
Zum Beispiel:
7z a -r my_archive penstyle-opacity.plt
oder:
7z a -r my_archive "palette-library\penstyle-opacity textures\penstyle-opacity.plt"
Versuchen Sie, das auszuwählen, was besser zu Ihnen passt.
Antwort2
Der erste Parameter ist der zu löschende Ordner, der Rest ist eine Liste von Dateiausnahmen, Platzhalter sind erlaubt. Es werden alle Ordner und Unterordner gelöscht, außer den Dateien, die der Liste entsprechen. Der Trick besteht darin, zuerst alle Ausnahmen auszublenden und sie nach dem Löschen wieder einzublenden.
@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