刪除除特定資料夾和子資料夾之外的所有資料夾

刪除除特定資料夾和子資料夾之外的所有資料夾

我有一個帶有多個分割區的 SSD。我需要在 J:\ 工作,並且需要刪除 J: 中的所有內容,但以下資料夾除外:

J:\System Volume Information
J:\$RECYCLE.BIN
J:\New
J:\Old Stuff

以及以下子資料夾:

J:\Papers\Folder
J:\Room\Main Documents
J:\Year\Origin\Part
J:\Year\Origin\Part Two

經過大量搜尋和閱讀後,我編寫了以下程式碼:

@ECHO OFF
SETLOCAL
SET "sourcedir=J:\"
SET "keepdir=System Volume Information"
SET "keepdir=$RECYCLE.BIN"
SET "keepdir=New"
SET "keepdir=Old Stuff"
SET "keepdir=Papers\Folder"
SET "keepdir=Room\Main Documents"
SET "keepdir=Year\Origin\Part"
SET "keepdir=Year\Origin\Part Two"
FOR /d %%a IN ("%sourcedir%\*") DO IF /i NOT "%%~nxa"=="%keepdir%" RD /S /Q "%%a"
GOTO :EOF

不幸的是,上面的程式碼不起作用(它刪除了 J: 中的所有內容)。

答案1

@echo off & cd /d J:\ || goto :eOf 

for /f ^delims^= %%i in =;('@dir /ogn /b /s /a:d
    ')do =;( type "%~f0" | 1>nul find /i "%%~fi" 
           );= || 1>nul 2>&1 rmdir /q /s "%%~fi"

goto :eof

:: Keep the list in the lines below the
:: full path of the folders that remained!

J:\New
J:\Old Stuff
J:\$RECYCLE.BIN
J:\Papers\Folder
J:\Year\Origin\Part
J:\Room\Main Documents
J:\Year\Origin\Part Two
J:\System Volume Information

1.使用帶有您要保留的資料夾清單的批次:

J:\New
J:\Old Stuff
J:\$RECYCLE.BIN
J:\Papers\Folder
J:\Year\Origin\Part
J:\Room\Main Documents
J:\Year\Origin\Part Two
J:\System Volume Information

2.使用循環列出您的資料夾樹

for /f ^delims^= %%i in =;('@dir /ogn /b /s /a:d
    ')do

3.對於循環中的每個資料夾,使用 bat 本身的類型並檢查資料夾/路徑是否出現在此處:

type "%~f0" | 1>nul find /i "%%~fi"

4.||如果在您的浴室中找不到資料夾/路徑 ( ),請將其刪除:

type ...  find .. || rmdir /q /s "%%~fi"

5.完成循環,退出文件:

goto :eOf

一些進一步閱讀:

答案2

建議:

  1. J:\> dir /s /b /ad >DirsToRemove.bat
    清單全部J:(目前磁碟機)上的 DIRS 到 DirsToRemove.bat 檔案中。
  2. 編輯該文件,
    記事本可以(不是寫字板),但更高級的文本編輯器是首選。
  3. 在每一行的rmdir /s /q目錄名之前添加,如果名稱中有空格字符,
    則將名稱括在- 引號中, 對所有名稱使用引號也可以。 =>"
    rmdir /s /q "name"
    更高級的文字編輯器允許使用巨集;使用巨集可能就像開始錄製、編輯一行、停止錄製一樣簡單 - 然後使用快捷鍵根據需要多次啟動巨集。
  4. 請記得刪除包含您希望保留的目錄的行。
  5. 儲存一下,然後...
  6. J:\> .\DirsToRemove.bat

當您多次完成類似的事情時,通常只需要一兩分鐘即可完成手邊的任務。

相關內容