中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-09-14 17:23
47,812 主题排行 / 349,917 发帖 / 今日 0 篇 / 48,268 会员排行
DOS批处理 & 脚本技术(批处理室) » 探测某个文件夹是不是空目录的方法
可打印版本  3,898 / 11
第1楼 namejm 发表于 2006-12-05 11:42
荣誉版主 发帖 1,737 积分 5,226 来自 成都
探测某个文件夹是不是空目录的方法
  有网友问我要一个探测某个文件夹下哪些子目录为空的代码,原以为用 dir 会很简单地解决掉,结果一测试,才发现原来事情并非那么简单。其间变换了几种思路,前前后后竟然花费了两个小时才把问题解决好。以下是我的解题过程:

  最开始,我以为可以先用 dir /ad /b /s 来获取所有子目录的路径,然后再通过获取 "dir /a 子目录" 的输出是否为空来判断子目录是否为空,代码如下:

  可是,无论我如何变换环境测试,始终不能检测到空目录,百思不得其解,于是放弃了通过检测空值来探测空目录的想法。

  改成下面的代码来查看test.txt,发现dir空目录的结果占了9行(包括空行)。

于是想到了通过探测dir结果中信息行数的方法来探测文件夹是否为空,得到如下代码:

  至此,问题得到解决。

  后来,在群里又讨论了一番,发现上面的代码还可以优化,探测文件夹目录是否为空的方案还有好几种,比如 rd 方案,copy 方案。时间关系,其中的原理暂时不多说。

[ Last edited by namejm on 2007-1-6 at 12:22 AM ]
第2楼 youxi01 发表于 2006-12-05 13:42
高级用户 发帖 247 积分 846 来自 湖南==》广东
TO namejm,代码段1经检测,可能原因如下:
for /f %%j in ('dir /a /b "%%i"') do if "%%j"=="" echo "%%i"下没有文件
以上语句当%%i为空值时,不能正常执行,因为'dir /a /b "%%i"'为空,也就是根本无%%j,也就无法实现所需结果。

当%%i为空时,类似以下代码。
测试语句:
for /f %i in () do if "%i"=="" (echo ok ) else echo no
以上代码执行时,是什么都不显示,是不是出乎意料呢?

利用findstr 可以避免这种情况:


[ Last edited by youxi01 on 2006-12-5 at 01:45 PM ]
第3楼 namejm 发表于 2006-12-06 00:01
荣誉版主 发帖 1,737 积分 5,226 来自 成都
  通过 findstr 来探测确实是种方法。不过,比起顶楼的代码,效率方面稍微逊色了一点,问题出在管道符号的使用上。另外,2F启用变量延迟的语句可以去掉。
第4楼 namejm 发表于 2007-01-06 11:35
荣誉版主 发帖 1,737 积分 5,226 来自 成都
  基于2楼的说法,得到一个更加简洁高效的代码:


  谢谢楼下的提醒,修改了一处错误。

[ Last edited by namejm on 2007-1-6 at 12:17 AM ]
第5楼 qzwqzw 发表于 2007-01-06 12:39
银牌会员 发帖 636 积分 2,343
4楼代码存在漏洞

如果不存在“目标文件夹”判断出错

如果“目标文件夹”下仅存在文件判断出错
第6楼 namejm 发表于 2007-01-06 13:16
荣誉版主 发帖 1,737 积分 5,226 来自 成都
  呵呵,确实有漏洞,写代码手快了一点,多加了一个参数d。

  至于不存在"目标文件夹"而出错的情况,则不应该归为漏洞,因为是要对目标文件夹进行检测,默认的前提条件是这个目标文件夹存在,属于隐性声明而不是显式声明,呵呵,套用了一下术语,关公面前耍了一次大刀。
第7楼 namejm 发表于 2007-01-07 07:35
荣誉版主 发帖 1,737 积分 5,226 来自 成都
  今天在翻看老帖的时候,发现这个问题我曾经写过一段更加简洁的代码(请点 这里 查看),自己居然搞忘了,嘿嘿,意外收获。修改几个字符之后再发一次:
第8楼 dikex 发表于 2007-01-07 08:00
高级用户 发帖 366 积分 788
有的文件是没有后缀的……
第9楼 namejm 发表于 2007-01-07 08:09
荣誉版主 发帖 1,737 积分 5,226 来自 成都
  点号在 findstr 命令中不是普通的字符,而是正则表达式中的特殊符号,表示任意字符的意思,和 dir 命令中的 ? 或者 * 是同样的作用:通配符。没有后缀的文件照样能正确处理。
第10楼 dikex 发表于 2007-01-07 08:16
高级用户 发帖 366 积分 788
Originally posted by namejm at 2007-1-6 07:09 PM:
  点号在 findstr 命令中不是普通的字符,而是正则表达式中的特殊符号,表示任意字符的意思,和 dir 命令中的 ? 或者 * 是同样的作用:通配符。没 ...


一般很少用findstr,还以为那个“.”是后缀的那个:P
第11楼 ocnzhao 发表于 2007-01-08 06:02
新手上路 发帖 10 积分 19
这个我需要
第12楼 willsion 发表于 2007-03-07 13:13
高级用户 发帖 312 积分 793
Originally posted by namejm at 2007-1-7 07:35 AM:
  今天在翻看老帖的时候,发现这个问题我曾经写过一段更加简洁的代码(请点 这里

这个真是精品了。
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023