バッチ スクリプトを使用して、特定の名前を持つすべてのフォルダーを検索し、2 つのファイルを除くすべてのコンテンツを削除するにはどうすればよいですか?

バッチ スクリプトを使用して、特定の名前を持つすべてのフォルダーを検索し、2 つのファイルを除くすべてのコンテンツを削除するにはどうすればよいですか?

プロジェクトをクリーンアップするには、palette-libraryバッチ スクリプト ファイルの現在の場所から始まる という名前のすべての (サブ) フォルダーを見つけて、 というフォルダーpenstyle-opacity texturesと というファイルを除くすべてのコンテンツを削除する必要がありますpenstyle-opacity.plt。私は Windows 7 を使用しています。

Google でいろいろ検索しましたが、今のところ、フォルダー内のすべてのコンテンツを検索、発見、削除するか、事前に定義された場所から特定のファイル以外のすべてを削除するスニペットしか見つかりません。しかし、この 2 つを組み合わせることができません。

答え1

最もエレガントな方法ではないかもしれませんが、最初にマスクでファイルをアーカイブし、次にファイル ツリーを消去し、最後にパスを使用してアーカイブを解凍することができます。

例えば:

7z a -r my_archive penstyle-opacity.plt

または:

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

試してみて、自分に合ったものを選んでみてください。

答え2

最初のパラメータは削除するフォルダで、残りはファイル例外のリストです。ワイルドカードが許可されており、リストに一致するファイルを除くすべてのフォルダとそのサブフォルダを削除します。コツは、最初にすべての例外を非表示にして、削除後に非表示を解除することです。

@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

関連情報