找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 39271|回复: 7

[文件操作] 批处理怎样准确删除空文件夹

[复制链接]
发表于 2008-8-2 16:52:41 | 显示全部楼层 |阅读模式
  1. @echo off&for /f "tokens=1-3 delims=" %%i in ('dir /a:d /b') do (dir /a:d "%%i%%j%%k" | findstr "0 个文件" >nul 2>nul && rmdir /q "%%i%%j%%k" >nul 2>nul)
复制代码
电脑里放VB源码的文件夹里的源码不知道怎么都没了。。。直接后果就是出现了N多空文件夹,于是这个小东西就出来了。

请高手指点。。。

[ 本帖最后由 batman 于 2008-8-2 19:55 编辑 ]
发表于 2008-8-2 18:26:39 | 显示全部楼层
  只检测到目录下没有文件就认为目录是空文件夹,这个想法非常危险:如果某个目录下只有子目录而没有任何文件,但是子目录下却有文件,难道也认为该目录是空目录吗?
  另外,通过检测返回字符串是不是有"0 个文件"来判断是不是空文件夹也是错误的——要是有个文件夹的名字就叫 "0 个文件" 的话,岂不是也要被删除?

  我觉得,最理想的操作思路是:先检测某条路径中最深层的目录,如果最深层是空目录,则删除此目录,再返回次深层,再次对删除后的路径做检测……如此循环,直到当前层。以下是以前别人写的代码,充分利用了 rd 不能删除非空目录的特点,我觉得这是最准确最简洁的方案:
  1. @echo off
  2. for /f "delims=" %%i in ('dir /ad /b /s^|sort /r') do rd /q "%%i" 2>nul
  3. pause
复制代码
 楼主| 发表于 2008-8-2 18:58:51 | 显示全部楼层

回复 2楼 的帖子

对于尘土兄说的:“只检测到目录下没有文件就认为目录是空文件夹,这个想法非常危险:如果某个目录下只有子目录而没有任何文件,但是子目录下却有文件,难道也认为该目录是空目录吗?”这个问题,我在测试的时候发现不会出现,也就是说,当一个目录下没有文件,但有子目录,那么这个目录不会被删除,至于尘土兄所指出的第二个问题:“另外,通过检测返回字符串是不是有"0 个文件"来判断是不是空文件夹也是错误的——要是有个文件夹的名字就叫 "0 个文件" 的话,岂不是也要被删除?”我倒是欠考虑了

最后还是要感谢尘土兄在百忙之中对我的指点,感谢!
发表于 2008-8-2 20:42:57 | 显示全部楼层
  对于我的第一点担忧,现在看来你的代码是没有什么问题的,因为你那个代码也用到了不加 /s 参数的 rd 不能删除非空目录的特点,当时看帖匆忙,认识有误,在此更正一下。

  另外,建议以后写代码时,尽量避免在同一行上同时写多条语句,尽量拆成多行,如果复合语句是长句,也建议拆分成多行书写,这样能更容易看清思路和代码层次,对长代码的分析和维护将大有好处。
发表于 2008-8-2 21:19:58 | 显示全部楼层

  1. for /r /d %%a in (*) do @dir/b/a "%%a"|findstr .>nul||echo %%a
复制代码

[ 本帖最后由 pusofalse 于 2008-8-2 21:30 编辑 ]
 楼主| 发表于 2008-8-3 19:23:24 | 显示全部楼层
原帖由 namejm 于 2008-8-2 20:42 发表
  对于我的第一点担忧,现在看来你的代码是没有什么问题的,因为你那个代码也用到了不加 /s 参数的 rd 不能删除非空目录的特点,当时看帖匆忙,认识有误,在此更正一下。

  另外,建议以后写代码时,尽量避免 ...


嘿。。。我都忘了跟谁学的了,写代码能用一句就不用两句,直接造成代码的可读性降低,呵,这习惯是得改改,感谢指点!
发表于 2016-4-3 00:16:14 | 显示全部楼层

  1. @Echo Off
  2. title 删除所有空目录
  3. SETLOCAL ENABLEDELAYEDEXPANSION
  4. @echo 删除所有空目录(含子目录)
  5. @echo -----------------------------
  6. @ set /p GTOperator="继续操作吗?(yes/no) "
  7. if /i "%GTOperator:~0,1%"=="y" (
  8.         goto GTCONTINUE
  9. ) else ( goto GTExit )
  10. :GTCONTINUE
  11. for /f "delims=" %%i in ('dir /ad /b /s') do call :RdEmptyDir "%%i"
  12. goto :eof
  13. :RdEmptyDir
  14. rd %1 2>nul||goto :eof
  15. set DirPath=%1
  16. for /f "delims=" %%i in (%DirPath%) do (
  17.      set DirPath="%%~dpi"
  18.      for /f "delims=" %%j in ('dir /ad /b "%%~dpi"')do rd "%%~dpi%%j" 2>nul||goto :eof
  19. )
  20. if "%DirPath:~-2,1%"=="" set DirPath="%DirPath:~1,-2%"
  21. if /i not "%cd%"==%DirPath% call :RdEmptyDir %DirPath%
  22. goto :eof

  23. :GTExit
  24. exit

复制代码
发表于 2016-4-3 15:17:23 | 显示全部楼层
就插一句话,清理空目录前,先 删除系统会自动生成的临时文件,比如,del /a/s/f/q Thumbs.db
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 04:32 , Processed in 0.019943 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表