【发布时间】:2014-11-04 07:29:20
【问题描述】:
我想编写一个批处理文件来清理我的整个 C 盘,方法是使用命令行删除其中的所有空目录。 可行吗?
【问题讨论】:
-
请注意,这是一个坏主意。其中一些空目录可能对操作系统或应用程序的正常运行至关重要。
标签: windows batch-file command-line windows-7
我想编写一个批处理文件来清理我的整个 C 盘,方法是使用命令行删除其中的所有空目录。 可行吗?
【问题讨论】:
标签: windows batch-file command-line windows-7
编辑以添加到 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
【讨论】:
dir 命令将在其所有后代之前返回父文件夹。由于所有后代共享相同的父前缀,因此按降序对列表进行排序(sort /r 所做的)可确保更深的(子)文件夹在其父文件夹之前包含在列表中。因此,如果子删除生成一个空的父级,则父级也将被删除。是的,您必须根据需要更改变量,例如set "root=c:\"(C 驱动器)或set "root=%temp%"(临时文件夹)。但正如 npocmaka 在其回答中指出的那样,请小心删除系统驱动器中的文件夹。