![]() |
中国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,还以为那个“.”是后缀的那个: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 |