我有一個帶有多個分割區的 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
建議:
- 做
J:\> dir /s /b /ad >DirsToRemove.bat
清單全部J:(目前磁碟機)上的 DIRS 到 DirsToRemove.bat 檔案中。 - 編輯該文件,
記事本可以(不是寫字板),但更高級的文本編輯器是首選。 - 在每一行的
rmdir /s /q
目錄名之前添加,如果名稱中有空格字符,
則將名稱括在- 引號中, 對所有名稱使用引號也可以。 =>"
rmdir /s /q "name"
更高級的文字編輯器允許使用巨集;使用巨集可能就像開始錄製、編輯一行、停止錄製一樣簡單 - 然後使用快捷鍵根據需要多次啟動巨集。 - 請記得刪除包含您希望保留的目錄的行。
- 儲存一下,然後...
- 做
J:\> .\DirsToRemove.bat
當您多次完成類似的事情時,通常只需要一兩分鐘即可完成手邊的任務。