中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » dir /a-d /b /s 查找分区根目录及其所有子目录时的一个bug
作者:
标题: dir /a-d /b /s 查找分区根目录及其所有子目录时的一个bug 上一主题 | 下一主题
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『楼 主』:  dir /a-d /b /s 查找分区根目录及其所有子目录时的一个bug

  假设:我想把E盘下所有存在test.txt这个文本文件的完整路径列出来,我使用了如下代码:
@echo off
for /f "delims=" %%i in ('dir /a-d /b /s e:\test.txt') do echo "%%~dpi"
pause
  如果E盘根目录下正好有一个名为test.txt的文件夹,这下就热闹了:E:\test.txt下有多少个文件,E:\test.txt这个路径就会显示多少次!如果E:\test.txt下没有文件,E:\test.txt这条路径就不会有任何显示。如果test.txt这个文件夹存在于E盘的某个子文件夹中,就不会出现这样的情形。

  稍加分析,发现原因是这样的:test.txt 这个名字存在二义性:它既可以表示名为 test 的文本文件,也可以表示名为 test.txt 的文件夹;而全分区查找指定文件的 dir 命令,必须写成 dir /a-d /s e:\test.txt 的格式,这样一来,因为 test.txt 的二义性,就导致了 dir 会搜索 e:\test.txt 这个文件夹下所有类型的文件、同时,也搜索 E: 分区下的所有名为 test 的文本文件。

  解决的办法是:对dir后的结果进行检验。代码可以修改为:
@echo off
for /f "delims=" %%i in ('dir /a-d /b /s e:\test.txt') do (
    if /i "%%~nxi"=="test.txt"  echo "%%~dpi"
)
pause
[ Last edited by namejm on 2007-3-8 at 03:52 PM ]

   此帖被 +56 点积分        点击查看详情   
评分人:【 lxmxn 分数: +4  时间:2007-3-9 04:30
评分人:【 redtek 分数: +20  时间:2007-3-9 04:56
评分人:【 ccwan 分数: +11  时间:2007-3-9 05:04
评分人:【 NaturalJ0 分数: +15  时间:2007-3-9 05:30
评分人:【 huzixuan 分数: +2  时间:2007-3-11 01:25
评分人:【 zouzhxi 分数: +4  时间:2007-4-3 07:25




尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2007-3-9 04:24
查看资料  发短消息 网志   编辑帖子  回复  引用回复
ccwan
金牌会员




积分 2725
发帖 1160
注册 2006-9-23
来自 河北廊坊
状态 离线
『第 2 楼』:  

txtjmtest.txtE:\test.txt()
@echo off
for /f "delims=" %%i in ('dir /a-d /b /s e:\*.txt') do (
    if /i "%%~ni"=="test" do echo "%%~dpi"
)
pause
如果txt文件的数量巨大的话,jm的代码会要快一点

   此帖被 +4 点积分     点击查看详情   
评分人:【 namejm 分数: +4  时间:2007-3-9 05:11




三人行,必有吾师焉。   学然后知不足,教然后知困,然后能自强也。
2007-3-9 05:09
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
xycoordinate
中级用户




积分 493
发帖 228
注册 2007-2-16
来自 安徽
状态 离线
『第 3 楼』:  

如果有几个test.txt文件,
想找某个日期的,
怎么办?

2007-3-9 23:20
查看资料  发送邮件  发短消息 网志  OICQ (226308607)  编辑帖子  回复  引用回复
shuaigeya
初级用户





积分 42
发帖 19
注册 2006-12-28
状态 离线
『第 4 楼』:  

学习了 我这个菜鸟从中受到一些启发 斑竹就是牛B

2007-3-10 07:42
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
shuaigeya
初级用户





积分 42
发帖 19
注册 2006-12-28
状态 离线
『第 5 楼』:  

if /i "%%~nxi"=="test.txt"  这一句我不明白是什么意思 结果我把这句去掉 也
可以用 呵呵
@echo off
for /f "delims=" %%i in ('dir /a-d /b /s 'dir /a-d /b /s e:\test.txt') do (
echo "%%~dpi"
)

2007-3-10 07:46
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
xycoordinate
中级用户




积分 493
发帖 228
注册 2007-2-16
来自 安徽
状态 离线
『第 6 楼』:  



  Quote:
Originally posted by shuaigeya at 2007-3-9 18:46:
if /i "%%~nxi"=="test.txt"  这一句我不明白是什么意思 结果我把这句去掉 也
可以用 呵呵
@echo off
for /f "delims=" %%i in ('dir /a-d /b /s 'd ...

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

2007-3-11 01:06
查看资料  发送邮件  发短消息 网志  OICQ (226308607)  编辑帖子  回复  引用回复
huzixuan
高级用户




积分 537
发帖 219
注册 2006-10-31
来自 芜湖
状态 离线
『第 7 楼』:  

果然是这样!

    if /i "%%~nxi"=="test.txt"  echo "%%~dpnxi"

用的巧,用的好阿!

@echo off
for /f "delims=" %%i in ('dir /a-d /b /s e:\test.txt') do (
    if /i "%%~nxi"=="test.txt"  echo "%%~dpnxi"
)
pause



江湖远
碧空长
路茫茫

    一个人漫无目的的奔跑,风,刺骨的冷....
2007-3-11 01:26
查看资料  发短消息 网志   编辑帖子  回复  引用回复
hxmupdata
初级用户




积分 76
发帖 39
注册 2007-3-9
状态 离线
『第 8 楼』:  

看完了,有点清楚了,6楼的xycoordinate
给的说明真是好啊,省了自己去查了.......



狐狸喜欢狡猾。。
2007-3-14 22:08
查看资料  发短消息 网志   编辑帖子  回复  引用回复
wudixin96
银牌会员





积分 1928
发帖 931
注册 2007-1-6
状态 离线
『第 9 楼』:  

其实这样也行啊

@echo off
for /r e:\ %%i in (*.txt) do (
    if /i "%%~nxi"=="test.txt"  echo "%%~dpi"
)
pause

2007-4-3 00:18
查看资料  发短消息 网志   编辑帖子  回复  引用回复
senjieg
新手上路





积分 10
发帖 5
注册 2006-12-1
状态 离线
『第 10 楼』:  又学到不少

又学到不少

2007-4-27 09:47
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
taozicici
新手上路





积分 12
发帖 6
注册 2007-4-21
状态 离线
『第 11 楼』:  

我晕
各位都是高手,我初来乍到,还望关照....就连DIR有命令我都好多不懂了
郁闷

2007-4-30 04:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
ccuu668
初级用户





积分 57
发帖 29
注册 2006-12-27
状态 离线
『第 12 楼』:  

顶起了.都是些高人.强呀!

2007-5-2 15:28
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: