有没有办法使用命令行删除我的电脑中的所有空目录

时间:2014-11-04 07:29:20

标签: windows batch-file command-line windows-7

我想编写一个批处理文件,通过使用命令行删除其中的所有空目录来清理整个C盘。 它可行吗?

1 个答案:

答案 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