中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 探测某个文件夹是不是空目录的方法
作者:
标题: 探测某个文件夹是不是空目录的方法 上一主题 | 下一主题
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『楼 主』:  探测某个文件夹是不是空目录的方法

  有网友问我要一个探测某个文件夹下哪些子目录为空的代码,原以为用 dir 会很简单地解决掉,结果一测试,才发现原来事情并非那么简单。其间变换了几种思路,前前后后竟然花费了两个小时才把问题解决好。以下是我的解题过程:

  最开始,我以为可以先用 dir /ad /b /s 来获取所有子目录的路径,然后再通过获取 "dir /a 子目录" 的输出是否为空来判断子目录是否为空,代码如下:
@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%i in ('dir /ad /b /s') do (
    for /f %%j in ('dir /a /b "%%i"') do if "%%j"=="" echo "%%i"下没有文件
)
pause
  可是,无论我如何变换环境测试,始终不能检测到空目录,百思不得其解,于是放弃了通过检测空值来探测空目录的想法。

  改成下面的代码来查看test.txt,发现dir空目录的结果占了9行(包括空行)。
@echo off
cd.>test.txt
setlocal enabledelayedexpansion
for /f "delims=" %%i in ('dir /a /b /s') do >>test.txt dir /a "%%i"
start test.txt
于是想到了通过探测dir结果中信息行数的方法来探测文件夹是否为空,得到如下代码:
@echo off
set num=0
setlocal enabledelayedexpansion
for /f "delims=" %%i in ('dir /ad /b /s') do (
    for /f %%j in ('dir /a "%%i"') do set /a num+=1
    if !num! lss 8 echo "%%i" 下没有文件
    set num=0
)
pause
  至此,问题得到解决。

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

[ Last edited by namejm on 2007-1-6 at 12:22 AM ]



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-12-5 11:42
查看资料  发短消息 网志   编辑帖子  回复  引用回复
youxi01
高级用户




积分 846
发帖 247
注册 2006-10-27
来自 湖南==》广东
状态 离线
『第 2 楼』:  

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 可以避免这种情况:
@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%i in ('dir /ad /b /s') do (
    dir /a /b "%%i"|findstr .>nul||echo %%i
)
pause
[ Last edited by youxi01 on 2006-12-5 at 01:45 PM ]

2006-12-5 13:42
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 3 楼』:  

  通过 findstr 来探测确实是种方法。不过,比起顶楼的代码,效率方面稍微逊色了一点,问题出在管道符号的使用上。另外,2F启用变量延迟的语句可以去掉。



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-12-6 00:01
查看资料  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 4 楼』:  

  基于2楼的说法,得到一个更加简洁高效的代码:
@echo off
set flag=
for /f %%i in ('dir /a /b "目标文件夹"') do set flag=1
if defined flag (echo 文件夹非空) else echo 这是个空文件夹
pause
  谢谢楼下的提醒,修改了一处错误。

[ Last edited by namejm on 2007-1-6 at 12:17 AM ]



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2007-1-6 11:35
查看资料  发短消息 网志   编辑帖子  回复  引用回复
qzwqzw
银牌会员

天的白色影子


积分 2342
发帖 635
注册 2004-3-6
状态 离线
『第 5 楼』:  

4楼代码存在漏洞

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

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

2007-1-6 12:39
查看资料  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 6 楼』:  

  呵呵,确实有漏洞,写代码手快了一点,多加了一个参数d。

  至于不存在"目标文件夹"而出错的情况,则不应该归为漏洞,因为是要对目标文件夹进行检测,默认的前提条件是这个目标文件夹存在,属于隐性声明而不是显式声明,呵呵,套用了一下术语,关公面前耍了一次大刀。



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2007-1-6 13:16
查看资料  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 7 楼』:  

  今天在翻看老帖的时候,发现这个问题我曾经写过一段更加简洁的代码(请点 这里 查看),自己居然搞忘了,嘿嘿,意外收获。修改几个字符之后再发一次:
@echo off
dir /a /b "目标文件夹"|findstr .>nul&& echo 有文件 || echo 没有文件
pause


   此帖被 +5 点积分      点击查看详情   
评分人:【 redtek 分数: +5  时间:2007-1-7 07:38




尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2007-1-7 07:35
查看资料  发短消息 网志   编辑帖子  回复  引用回复
dikex
高级用户

潜水修练批处理



积分 788
发帖 366
注册 2006-12-31
状态 离线
『第 8 楼』:  

有的文件是没有后缀的……

2007-1-7 08:00
查看资料  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 9 楼』:  

  点号在 findstr 命令中不是普通的字符,而是正则表达式中的特殊符号,表示任意字符的意思,和 dir 命令中的 ? 或者 * 是同样的作用:通配符。没有后缀的文件照样能正确处理。



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2007-1-7 08:09
查看资料  发短消息 网志   编辑帖子  回复  引用回复
dikex
高级用户

潜水修练批处理



积分 788
发帖 366
注册 2006-12-31
状态 离线
『第 10 楼』:  



  Quote:
Originally posted by namejm at 2007-1-6 07:09 PM:
  点号在 findstr 命令中不是普通的字符,而是正则表达式中的特殊符号,表示任意字符的意思,和 dir 命令中的 ? 或者 * 是同样的作用:通配符。没 ...

一般很少用findstr,还以为那个“.”是后缀的那个:P

2007-1-7 08:16
查看资料  发短消息 网志   编辑帖子  回复  引用回复
ocnzhao
新手上路





积分 19
发帖 10
注册 2006-4-29
状态 离线
『第 11 楼』:  

这个我需要

2007-1-8 06:02
查看资料  发短消息 网志   编辑帖子  回复  引用回复
willsion
高级用户




积分 789
发帖 310
注册 2004-9-2
状态 离线
『第 12 楼』:  



  Quote:
Originally posted by namejm at 2007-1-7 07:35 AM:
  今天在翻看老帖的时候,发现这个问题我曾经写过一段更加简洁的代码(请点 [url=http://www.cn-dos.net/forum/viewthread.php?tid=21989]这里[/color ...

这个真是精品了。

2007-3-7 13:13
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: