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

[文件操作] 批处理检测某盘符下所有的空文件夹

用批处理检测某盘符下所有的空文件夹
包括子目录,并将该空文件夹的路径显示出来.

缺点:若某空文件夹下有空文件夹,会把这个父文件夹当作非空文件夹。
:
  1. @echo off
  2. for /f "delims=" %%a in ('dir /b/s/ad^|sort /r') do (
  3.   dir /b "%%a"|findstr .>nul|| echo %%a
  4. )
  5. pause
复制代码
技术问题请到论坛发帖求助!

TOP


原来联盟里早有精彩的代码了,我的真是献丑了。
技术问题请到论坛发帖求助!

TOP

回复 3# 的帖子

哦,是吗?我也不知道哦
不过看2F的代码效率确实不是很高...

TOP

用递归的方法可能会好很多

TOP

利用 namejm 在cn-dos里的一段代码
:
  1. @echo off
  2. for /f "delims=" %%i in ('dir/b/s/ad') do call :lis "%%i"
  3. pause
  4. :lis
  5. set flag=
  6. for /f "delims=" %%a in ('dir/a/b %1') do set flag=1
  7. if not defined flag echo %~1
  8. goto :eof
复制代码

[ 本帖最后由 随风 于 2008-1-5 12:18 编辑 ]
技术问题请到论坛发帖求助!

TOP

个人觉得,namejm的代码效率还有挖掘的潜力。
因为namejm在代码中,几乎对所有的文件夹都进行了检测,举例说明:
现有一父文件夹f:\test,一子文件夹f:\test\test。
在namejm的代码中,不管是子文件夹还是父文件夹都会去检测是否为空(父文件夹肯定不为空),这样,会导致效率打折扣。于是,个人就尝试用递归的方法找出 那个 不含任何子文件夹的 文件夹,然后只要检测这些文件夹是否是空文件夹就行了,测试代码:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /d %%i in (f:\*) do call :Check "%%i"
  3. for /f "delims=" %%i in (test.txt) do (
  4.      set flag=0
  5.      for /f "delims=" %%j in ('dir /a-d /b %%i 2^>nul') do set flag=1
  6.      if !flag! EQU 0 echo %%i为空文件夹)
  7. pause>nul
  8. :Check
  9. set "var=%~1"
  10. set flag=0
  11. for /D %%i in ("%~1\*") do (
  12.       set flag=1
  13.       call :Check "%%i"
  14. )
  15. if %flag% EQU 0 (>>test.txt echo "%var%"& set flag=1)
复制代码
不过效率还不是很高,较namejm的略高。
不过,两种方法各有优缺点(而且检测结果有些出入,原因正在查...):
namejm的代码优点:可以检测系统文件夹;代码简洁;缺点:速度略慢;

上面的递归算法优点:速度稍快;缺点:不能探测系统目录,如:回收站等;

附:两种方法检测结果
namejm的代码:
  1. 18:09:59.12
  2. F:\System Volume Information\_restore{CD2BF03E-A00F-4EFC-A572-06BD79233DB7}
  3. F:\2\新建
  4. F:\2\新建文件夹\新建文件夹\新建文件夹1
  5. 找不到文件
  6. F:\RECYCLER\S-1-5-21-1060284398-813497611-13438020022-500.
  7. 找不到文件
  8. F:\RECYCLER\S-1-5-21-1060284298-813497611-13438020086-500\S-1-5-21-1064224258-81
  9. 3597681-13430823629-500.
  10. 找不到文件
  11. F:\RECYCLER\S-1-5-21-1060284298-813497611-13438020086-500\S-1-5-21-1064442258-81
  12. 3597862-13230823629-500.
  13. F:\Recycled\Df1
  14. F:\Recycled\Df2
  15. F:\Recycled\Df91
  16. F:\Recycled\Df42\班主任工作
  17. F:\Recycled\Df42\10班成绩
  18. F:\Recycled\Df42\班会课(修改)\大学照片\班会课~2\大学照片
  19. F:\Recycled\Df62\芳香烃 示例1
  20. F:\办公\CN-DOS批处理精华贴(2007-A)(IE7)
  21. F:\办公\经典代码\经典代码\系统优化\C盘个人资料转移器\Desktop
  22. F:\办公\经典代码\经典代码\系统优化\C盘个人资料转移器\Favorites
  23. F:\办公\经典代码\经典代码\系统优化\C盘个人资料转移器\My Documents
  24. F:\办公\经典代码\经典代码\系统优化\C盘个人资料转移器\OE
  25. F:\办公\经典代码\经典代码\系统优化\C盘个人资料转移器\Temp
  26. F:\办公\★化学★\化学反应原理课件\第二章\化学平衡\平衡图像(第四课时)
  27. 18:11:18.35
复制代码
递归算法运行结果:
  1. 生成临时文件18:15:09.23.....
  2. 生成临时文件完成.....
  3. "f:\2\新建文件夹\新建文件夹\新建文件夹1"
  4. "f:\2\新建"
  5. "f:\办公\经典代码\经典代码\系统优化\C盘个人资料转移器\Desktop"
  6. "f:\办公\经典代码\经典代码\系统优化\C盘个人资料转移器\Favorites"
  7. "f:\办公\经典代码\经典代码\系统优化\C盘个人资料转移器\My Documents"
  8. "f:\办公\经典代码\经典代码\系统优化\C盘个人资料转移器\OE"
  9. "f:\办公\经典代码\经典代码\系统优化\C盘个人资料转移器\Temp"
  10. "f:\办公\CN-DOS批处理精华贴(2007-A)(IE7)"
  11. "f:\办公\★化学★\化学反应原理课件\第二章\化学平衡\平衡图像(第四课时)"
  12. "f:\办公\PowerpointMOBAN\PowerpointMOBAN\Groovy Baby"
  13. "f:\办公\PowerpointMOBAN\PowerpointMOBAN\3 New free PowerPoint Template Designs"
  14. "f:\办公\PowerpointMOBAN\PowerpointMOBAN\Preprogrammed PowerPoint Templates"
  15. "f:\办公\PowerpointMOBAN\PowerpointMOBAN\Sunrise and Sunsets, Clouds"
  16. ========完成18:16:06.57==============
复制代码

TOP

回复 2# 的帖子

这里用findstr还不如设置 标志?!如果,含有文件则+1

TOP

回复 9# 的帖子

有几个地方你理解错误了:
1、
标签下面的for已经检测出了,文件夹是否为空,flag等于0时不就代表此文件夹为空吗?  那么创建临时文件和后面的for岂不是多余的了吗?

这个 检测的时候,检测出的不是空文件夹,而是最后一级文件夹,也就是这个文件夹里再没有文件夹,但不表示这个文件夹里没有文件!!
2、
另:if %flag% EQU 0 (>>test.txt echo "%var%"& set flag=1)
  这句中的set flag=1 有什么用?

这个要仔细思考了,如果不设置flag的话,会重复显示结果的(递归调用的时候,跳出一层for,它就显示一次,有多少层for,就重复显示多少次)

TOP

呵呵,你回的真快啊,我马上就删除了,你还是看见了
技术问题请到论坛发帖求助!

TOP

:
  1. @echo off
  2. for /f "delims=" %%a in ('dir/s/a/b/ad^|sort /r') do (
  3.     if not defined flag call :loop "%%a"
  4.     if "%%a"=="%flag%" (set flag=) else call :lis "%%a"
  5. )
  6. pause
  7. :lis
  8. set num=
  9. for /f "delims=" %%a in ('dir/a/b %1 2^>nul') do set num=1
  10. if not defined num echo %~1
  11. goto :eof
  12. :loop
  13. for /f "tokens=1* delims=\" %%c in (%1) do (
  14.   if not "%%d"=="" call set flag=%%flag%%\%%c
  15.   call :loop "%%d"
  16. )
  17. set flag=%flag:~1%
  18. goto :eof
复制代码
技术问题请到论坛发帖求助!

TOP

即是空文件夹,何不先删除再创建呢?
:
  1. @echo off
  2. for /f "delims=" %%i in ('dir/s/a/b/ad^|sort /r') do (
  3.    rd "%%i"2>nul&&md "%%i"&&echo %%i
  4. )
  5. pause
复制代码

[ 本帖最后由 随风 于 2008-1-6 01:02 编辑 ]
1

评分人数

技术问题请到论坛发帖求助!

TOP

呵呵,删除再创建?!
好思路!!

TOP

回复 2# 随风

老师,能不能改成,输出 txt 路径?

TOP

回复 1# youxi01


   代码能分享一下 吗?谢谢

TOP

返回列表