Board logo

标题: [文件操作] [分享]批处理清理空文件夹(与网上的不同) [打印本页]

作者: bluewing009    时间: 2009-11-30 17:50     标题: [分享]批处理清理空文件夹(与网上的不同)

原创,  请管理员移至原创区(目前本人权限不足)

清理空文件夹,节省资源
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. mode con cols=80 lines=25
  4. title 空文件夹清理 -
  5. color 3F
  6. echo ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
  7. echo ☆                                                                          ☆
  8. echo ★                       空文件夹清理工具                                   ★
  9. echo ☆                                                                          ☆
  10. echo ★                                         BY :  九影蓝翼(bluewing009)   ★
  11. echo ☆                                                                          ☆
  12. echo ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
  13. set /a sum=0
  14. echo.
  15. echo.
  16. echo 说明此工具会删除当前所在目录及其子目录下的空文件夹,以节省空间。
  17. echo.
  18. echo       当前工作目录为: %cd%
  19. echo.
  20. echo                                                   任意键   开始删除空文件夹
  21. pause>nul
  22. echo -----------------------------------------------------------------------------
  23. for /f "delims=" %%i in ('dir /ad /b /s') do (
  24. dir /b "%%i"|findstr .>nul||rd "%%i"&&echo 成功删除空文件夹:%%i&&set /a sum=sum+1
  25. )
  26. echo -----------------------------------------------------------------------------
  27. echo      共删除%cd%目录下 空文件夹个数:%sum%
  28. pause>nul
  29. set sum=
  30. exit
复制代码
修正:可以删除带空格的文件夹。

[ 本帖最后由 bluewing009 于 2009-12-4 09:32 编辑 ]
作者: Batcher    时间: 2009-11-30 22:13

直接贴源代码更加方便他人查看吧?
作者: bluewing009    时间: 2009-12-1 10:28     标题: 回复 2楼 的帖子

考虑到这是成品,可以直接使用。

  就直接发附件了。
作者: Batcher    时间: 2009-12-1 11:05     标题: 回复 3楼 的帖子

直接发代码不是更好吗?一来不影响“直接使用”,二来方便他人“直接查看”。你觉得呢?
作者: hdxhao    时间: 2009-12-1 12:08

下下来看看先,谢谢楼主
作者: vsbat    时间: 2009-12-1 13:40

for /f "delims=" %%i in ('dir /ad /b /s') do (
dir /b "%%i"|findstr .>nul||rd %%i&&echo 成功删除空文件夹:%%i&&set /a sum=sum+1
)
echo -----------------------------------------------------------------------------
echo      共删除%cd%目录下 空文件夹个数:%sum%
pause>nul

亲爱的朋友-----你发布你的作品前--有没有 仔细测试呢
上面引用的是你的 核心 代码---------
经测试 :
未起用变量延迟  set /a sum=sum+1
路径含有空格未加引号导致根本无法删除文件夹,找不到路径 rd %%i

[ 本帖最后由 vsbat 于 2009-12-1 19:09 编辑 ]
作者: bluewing009    时间: 2009-12-1 13:49     标题: 回复 6楼 的帖子

延迟在开头就声明了。至于空格文件夹的问题,是我考虑不周全,需要在rd命令加""。   现在是手机登陆,稍后上传修改。或者请自行添加""。
作者: bluewing009    时间: 2009-12-1 13:51     标题: 回复 6楼 的帖子

感谢6楼对错误的指正。
作者: vsbat    时间: 2009-12-1 13:57

声明是声明了--------
可是----得用啊
set /a sum=!sum!+1
作者: bluewing009    时间: 2009-12-1 17:35     标题: 回复 9楼 的帖子

请看&&部分  

不是很明白你的意思...
作者: zqz0012005    时间: 2009-12-1 18:47     标题: 回复 9楼 的帖子

有点不明白vbbat了,我的印象中你的水平很不错。
set /a sum=sum+1
怎么连这种用法不需要开启变量延迟都忘了?
作者: vsbat    时间: 2009-12-1 19:04

aaaa--------------
天那----
抱歉 楼主----------我想错了---以为 set /a s=s+1
还要 !s!--
我很菜----呵呵---
作者: Batcher    时间: 2009-12-1 21:10

有两处疑问,望解答:
1、为何set命令给变量赋值的时候要加上/a开关?
2、你开启了变量延迟扩展之后,对于文件夹名称中含有感叹号的情况是怎样考虑的?
作者: bluewing009    时间: 2009-12-1 22:03     标题: 回复 13楼 的帖子

因为是 数字 所以用/a哦
作者: zqz0012005    时间: 2009-12-1 22:12

前面set sum=0后面set sum=不行吗?是数字就要加/a吗?
set /a sum=sum+1跟set /a sum+=1比有什么好处?

dir /b "%%i"|findstr .>nul||rd "%%i"&&echo 成功删除空文件夹 跟
rd "%%i" 2>nul &&echo 成功删除空文件夹
相比有什么好处?
作者: 523066680    时间: 2009-12-1 23:06

1.
c:\A\b\c
以下为空。
删除c以后,造成b是空的,递推……
这个要不要删一系列要作决定。

2.
学习+收藏~。

[ 本帖最后由 523066680 于 2009-12-1 23:10 编辑 ]
作者: bluewing009    时间: 2009-12-2 00:05     标题: 回复 15楼 的帖子

举个例子:
set a=1+2
set /a=1+2

第一个就是a=1+2,而第二个才是3


这就是 我加/a的原因 ,凡是涉及到运算的  加上就可以了
至于你写的 rd "%%i" 2>nul &&echo 成功删除空文件夹
不是很明白你什么意思.......

[ 本帖最后由 bluewing009 于 2009-12-2 00:51 编辑 ]
作者: Batcher    时间: 2009-12-2 10:20     标题: 回复 17楼 的帖子

set /a=1+2这个例子少了什么字符吧?笔误?

另外,你顶楼代码中没有涉及到运算的赋值操作为何也要使用/a开关呢?
作者: bluewing009    时间: 2009-12-2 11:32     标题: 回复 18楼 的帖子

哎呀~~  晕  是set/a a=1+2   嘿嘿  a被我贪污了  (-_-)
作者: zqz0012005    时间: 2009-12-2 12:43     标题: 回复 17楼 的帖子

>>前面set sum=0后面set sum=不行吗?是数字就要加/a吗?
    >这就是 我加/a的原因 ,凡是涉及到运算的  加上就可以了
请不要偷换概念。
况且有谁规定数字就一定要用于运算?

还有set /a sum=你运行过它是正确的吗?
不要说反正主要部分运行完了,后面的正不正确没有影响。
作者: bluewing009    时间: 2009-12-2 22:13     标题: 回复 20楼 的帖子

天 ~~~
最后的 set 是把sum值还原,因为sum最为常用的计数量,怕干扰到别的bat

貌似 应该是 set sum=  啊 ,  奇怪了............  ???! ! !     汗..........
还是用endlocal的好....   哭了....

[ 本帖最后由 bluewing009 于 2009-12-2 22:15 编辑 ]
作者: cao    时间: 2009-12-2 23:11

看不懂。。。。
那些五角星是什么东东啊?echo用了这么多个?用一个有问题么?
作者: bluewing009    时间: 2009-12-3 07:42     标题: 回复 22楼 的帖子

那个噢~~~   是为了界面好看,人性化一点。
作者: 523066680    时间: 2009-12-3 08:20

发的回帖完全被忽视的感觉,很好。
作者: batman    时间: 2009-12-4 08:23

一直在关注楼主的这个贴子,看来删除文件夹永远都是个话题。。。

关于删除目录下所有的空目录,我想可以充分利用rd不加s参数只能删除空目录的特性:

for /f "delims=" %%a in ('dir /ad /b /s') do rd /q "%%a" 2>nul
作者: bluewing009    时间: 2009-12-4 09:37     标题: 回复 24楼 的帖子

...........   哪有忽视你啊~~

嘿嘿  何况你的图片这么PL

  你说的那个a/b/c的问题,  因为只是用dir的.来判断,所以 只是以你运行时的情况为准

  当然,你运行一次就删除了c,再一次就是b  递推。

  你想一次搞定  建议你判断sum的值  当sum不是0就再次执行,等于0就退出....
作者: 523066680    时间: 2009-12-4 14:09

头像漂亮果然有好处,感谢回复,完毕。
作者: bluewing009    时间: 2009-12-4 17:08     标题: 回复 27楼 的帖子

呵呵  主要你那个背景有个wing哦
作者: hlzj88    时间: 2010-6-27 21:30

楼主的代码已经很好了,不过还是加一句啊
就是当文件夹保存过图片的情况,会有Thumbs.db文件,建议加一句来删除Thumbs.db后再判断。
作者: xiaoxueer    时间: 2011-3-6 02:21

dir /ad /b /s这里要加 |sort /r  否则就会在 文件夹1里面有文件夹2而且都是没文件的情况下,只删了文件夹2,文件夹1是空的,但没删。
作者: Hello123World    时间: 2011-6-9 18:01

25# batman
/q 参数是画蛇添足,没/s ,/q压根就没有存在的意义。
作者: CrLf    时间: 2011-6-9 18:16

来一种另类的:
  1. xcopy /s 源文件夹 \临时\
  2. rd /s /q 源文件夹
  3. xcopy /s \临时 源文件夹\
复制代码
适合文件少而体积小,并且空文件夹多的情况
作者: Hello123World    时间: 2011-6-9 19:09

来一种另类的:xcopy /s 源文件夹 \临时\
rd /s /q 源文件夹
xcopy /s \临时 源文件夹\适合文件少而体积小,并且空文件夹多的情况
zm900612 发表于 2011-6-9 18:16


没看懂你的意图,先复制到临时,删除源文件夹,又复制临时到源文件夹——这不是什么都没做吗?
作者: CrLf    时间: 2011-6-9 19:10

33# Hello123World


/s开关的特性是不复制空文件夹...
作者: qzwqzw    时间: 2011-6-9 23:09

32# zm900612
for %%d in (源文件夹) do (
    xcopy /s %%d %%~sdpd\$temp\
    rd /s /q %%d
    ren %%~sdpd\$temp "%%~nxd"
)
作者: ygqiang    时间: 2011-6-10 06:55

ding.......
作者: CrLf    时间: 2011-6-10 15:30

32# zm900612
for %%d in (源文件夹) do (
    xcopy /s %%d %%~sdpd\$temp\
    rd /s /q %%d
    ren %%~sdpd\$temp "%%~nxd"
)
qzwqzw 发表于 2011-6-9 23:09



真是太妙了,为什么我就没想到,差距啊...
作者: wrjx    时间: 2015-4-24 15:57

回复 37# CrLf


    请问一下,%%~sdpd这个变量是什么意思?
作者: CrLf    时间: 2015-4-25 22:13

回复 38# wrjx


    表示该文件目录的短路径,详见 for /?:
另外,FOR 变量参照的替换已被增强。您现在可以使用下列
选项语法:

     %~I          - 删除任何引号("),扩展 %I
     %~fI        - 将 %I 扩展到一个完全合格的路径名
     %~dI        - 仅将 %I 扩展到一个驱动器号
     %~pI        - 仅将 %I 扩展到一个路径
     %~nI        - 仅将 %I 扩展到一个文件名
     %~xI        - 仅将 %I 扩展到一个文件扩展名
     %~sI        - 扩展的路径只含有短名
     %~aI        - 将 %I 扩展到文件的文件属性
     %~tI        - 将 %I 扩展到文件的日期/时间
     %~zI        - 将 %I 扩展到文件的大小
     %~$PATH:I   - 查找列在路径环境变量的目录,并将 %I 扩展
                   到找到的第一个完全合格的名称。如果环境变量
                   未被定义,或者没有找到文件,此组合键会扩展
                   空字符串

可以组合修饰符来得到多重结果:

     %~dpI       - 仅将 %I 扩展到一个驱动器号和路径
     %~nxI       - 仅将 %I 扩展到一个文件名和扩展名
     %~fsI       - 仅将 %I 扩展到一个带有短名的完整路径名
     %~dp$PATH:I - 搜索列在路径环境变量的目录,并将 %I 扩展
                   到找到的第一个驱动器号和路径。
     %~ftzaI     - 将 %I 扩展到类似输出线路的 DIR

在以上例子中,%I 和 PATH 可用其他有效数值代替。%~ 语法
用一个有效的 FOR 变量名终止。选取类似 %I 的大写变量名
比较易读,而且避免与不分大小写的组合键混淆。





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2