Como posso encontrar todas as pastas com um nome específico e excluir todo o conteúdo, exceto dois arquivos com um script em lote?

Como posso encontrar todas as pastas com um nome específico e excluir todo o conteúdo, exceto dois arquivos com um script em lote?

Para limpar um projeto, preciso encontrar todas as (sub)pastas nomeadas palette-librarya partir do local atual de um arquivo de script em lote e, em seguida, excluir todo o seu conteúdo, exceto uma pasta chamada penstyle-opacity texturese um arquivo chamado penstyle-opacity.plt. Eu uso o Windows 7.

Pesquisei muito no Google, mas até agora só encontrei trechos que podem pesquisar, localizar e excluir todo o conteúdo de uma pasta ou excluir tudo, exceto o arquivo específico, de um local predefinido. Porém, não consigo juntar os dois.

Responder1

Talvez não seja a maneira mais elegante, mas você pode primeiro arquivar arquivos por máscara, depois apagar sua árvore de arquivos e descompactar o arquivo com caminhos.

Por exemplo:

7z a -r my_archive penstyle-opacity.plt

ou:

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

Experimente e escolha o que combina melhor com você.

Responder2

O primeiro parâmetro é a pasta a ser excluída, o restante é uma lista de exceções de arquivo, curingas permitidos, excluirá todas as pastas e suas subpastas, exceto os arquivos que correspondem à lista. O truque é ocultar todas as exceções primeiro e exibi-las após excluí-las.

@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

informação relacionada