Wie kann ich mit einem Batch-Skript alle Ordner mit einem bestimmten Namen finden und den gesamten Inhalt bis auf zwei Dateien löschen?

Wie kann ich mit einem Batch-Skript alle Ordner mit einem bestimmten Namen finden und den gesamten Inhalt bis auf zwei Dateien löschen?

Um ein Projekt zu bereinigen, muss ich alle (Unter-)Ordner mit dem Namen palette-librarybeginnend vom aktuellen Speicherort einer Batch-Skriptdatei finden und dann den gesamten Inhalt außer einem Ordner mit dem Namen penstyle-opacity texturesund 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

verwandte Informationen