[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

  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 编辑 ]

  只检测到目录下没有文件就认为目录是空文件夹,这个想法非常危险:如果某个目录下只有子目录而没有任何文件,但是子目录下却有文件,难道也认为该目录是空目录吗?
  另外,通过检测返回字符串是不是有"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
复制代码
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

回复 2楼 的帖子

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

最后还是要感谢尘土兄在百忙之中对我的指点,感谢!

TOP

  对于我的第一点担忧,现在看来你的代码是没有什么问题的,因为你那个代码也用到了不加 /s 参数的 rd 不能删除非空目录的特点,当时看帖匆忙,认识有误,在此更正一下。

  另外,建议以后写代码时,尽量避免在同一行上同时写多条语句,尽量拆成多行,如果复合语句是长句,也建议拆分成多行书写,这样能更容易看清思路和代码层次,对长代码的分析和维护将大有好处。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

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

[ 本帖最后由 pusofalse 于 2008-8-2 21:30 编辑 ]
心绪平和,眼藏静谧。

TOP

原帖由 namejm 于 2008-8-2 20:42 发表
  对于我的第一点担忧,现在看来你的代码是没有什么问题的,因为你那个代码也用到了不加 /s 参数的 rd 不能删除非空目录的特点,当时看帖匆忙,认识有误,在此更正一下。

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


嘿。。。我都忘了跟谁学的了,写代码能用一句就不用两句,直接造成代码的可读性降低,呵,这习惯是得改改,感谢指点!

TOP

  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
复制代码

TOP

就插一句话,清理空目录前,先 删除系统会自动生成的临时文件,比如,del /a/s/f/q Thumbs.db
目的,学习批处理

TOP

返回列表