我想编写一个批处理文件,通过使用命令行删除其中的所有空目录来清理整个C盘。 它可行吗?
答案 0 :(得分:1)
已编辑以添加评论(过滤“有问题的”文件夹),因为当我调整它时,我意识到有一个更好的解决方案(旧解决方案仍然保留在最后)
@echo off
setlocal enableextensions disabledelayedexpansion
rem Configure where to start searching for empty folders
set "root=c:\"
rem We will use a temp file to store the full list of folders
set "folderList=%temp%\%~nx0.%random%.tmp"
rem Retrieve the full list of folders (except the problematic ones)
rem and store it, sorted, inside the temporary file
( dir /s /b /ad "%root%" ^
| findstr /v /l /i /b /c:"%programFiles:\=\\%" /c:"%systemRoot:\=\\%" ^
| sort /r
) > "%folderList%"
rem Process the temporary file with the list of folders
rem "trying" to remove everything
for /f "usebackq delims=" %%a in ("%folderList%") do (
rd /q "%%~fa" >nul 2>nul && echo "%%~fa" removed
)
rem Remove the temporary file
del /q "%folderList%" >nul 2>nul
要处理系统驱动器中的完整文件夹列表,列表可能很大。并且for /f
从正在运行的进程中检索数据存在一个已知问题,因此,我已将代码更改为使用临时文件。不是很好,但它可以更快。
临时文件中会存储什么?指定起点下的完整文件夹列表。该列表已过滤(findstr
),以从列表中删除%programFolders%
和%systemRoot%
文件夹。低于它的任何东西都将被忽略。
列表按相反顺序排序。由于子文件夹具有完整父路径的前缀,因此在对列表进行反向排序时,子项将显示在其父项之前。如果删除了所有子项并且父项变为空,则它也将被删除。
生成列表后,将使用for /f
命令重新启动,并为其中的每个元素执行rd
命令。没检查。只需rd
。如果文件夹不为空,则无法删除,无需检查文件夹内容。
完成后,临时文件将被删除。
OLD回答。代码更少但效率更低,更复杂。更好地使用以前的代码
@echo off
setlocal enableextensions disabledelayedexpansion
set "root=%cd%"
for /f "delims=" %%a in ('dir /s /b /ad "%root%" ^| sort /r') do (
dir /a /b "%%~fa" 2>nul |(set /p ".=" || echo rd /q "%%~fa" )
)
for /f
命令将执行递归dir
以检索指定起点下的完整文件夹列表(根据需要更改root
变量),并反向排序此列表为了使文件夹列表可以从底部到根处理。此步骤是必要的,以确保在处理父项之前执行删除空子项,以便删除父项的所有后代也将被删除(如果为空或当然)
对于找到的每个文件夹,执行dir
命令并将其输出通过管道传送到set /p
命令。
如果dir
命令生成数据(文件夹不为空),set /p
将从管道读取信息,并且不会设置errorlevel。
但是如果正在处理的文件夹为空,dir
将不生成输出,set
将无法检索数据,将设置errorlevel并执行rd
命令。
目录删除操作仅回显到控制台,如果输出正确,请删除echo