【问题标题】:Is There a Way to Delete All Empty Directories in My PC Using Command Line有没有办法使用命令行删除我的电脑中的所有空目录
【发布时间】:2014-11-04 07:29:20
【问题描述】:

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

【问题讨论】:

  • 请注意,这是一个坏主意。其中一些空目录可能对操作系统或应用程序的正常运行至关重要。

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


【解决方案1】:

编辑以添加到 cmets(过滤“有问题的”文件夹),因为当我调整它时,我意识到有更好的解决方案(最后仍然保留旧解决方案)

@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。如果文件夹不为空则无法删除,无需查看文件夹内容。

完成后,临时文件将被删除。


旧答案。更少的代码,但效率更低,更复杂。最好使用之前的代码

@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 将无法检索数据,将设置错误级别并执行rd 命令。

目录删除操作只回显到控制台,如果输出正确,删除echo

【讨论】:

  • 似乎我无法正确理解这一点,您将这个列表按相反顺序排序是什么意思?我还需要在 "root=%mydirectory%" 指定我的目录吗?对不起,我对批处理文件很陌生
  • @Giancarlo,递归 dir 命令将在其所有后代之前返回父文件夹。由于所有后代共享相同的父前缀,因此按降序对列表进行排序(sort /r 所做的)可确保更深的(子)文件夹在其父文件夹之前包含在列表中。因此,如果子删除生成一个空的父级,则父级也将被删除。是的,您必须根据需要更改变量,例如set "root=c:\"C 驱动器)或set "root=%temp%"(临时文件夹)。但正如 npocmaka 在其回答中指出的那样,请小心删除系统驱动器中的文件夹。
  • 谢谢,能否在此代码中添加一个排除“Windows”文件夹的内容?
  • 简直是天才,正是我想要的。这也非常快。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-13
  • 1970-01-01
  • 2012-11-12
  • 2021-10-10
  • 2016-02-04
  • 2011-06-14
  • 1970-01-01
相关资源
最近更新 更多