我有一个带有多个分区的 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
当你做过几次类似的事情时,通常只需要一两分钟就能完成手头的任务。