中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-08-04 12:07
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » dir /a-d /b /s 查找分区根目录及其所有子目录时的一个bug 查看 2,331 回复 11
楼 主 dir /a-d /b /s 查找分区根目录及其所有子目录时的一个bug 发表于 2007-03-09 04:24 ·  中国 广东 电信
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
20年会员
UID 51697
来自 成都
状态 离线
  假设:我想把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 ]
本帖最近评分记录 (共 6 条) 点击查看详情
评分人分数时间
lxmxn +4 2007-03-09 04:30
redtek +20 2007-03-09 04:56
ccwan +11 2007-03-09 05:04
NaturalJ0 +15 2007-03-09 05:30
huzixuan +2 2007-03-11 01:25
zouzhxi +4 2007-04-03 07:25
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2 发表于 2007-03-09 05:09 ·  中国 河北 廊坊 三河市 移动
金牌会员
★★★★
积分 2,725
发帖 1,160
注册 2006-09-23 12:00
19年会员
UID 63486
来自 河北廊坊
状态 离线
呵呵,我跟着版主的思路来一段代码吧,这个代码的思路是先提取所有的txt,然后再检验文件名,而jm的代码是先提取所有的test.txt及E:\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的代码会要快一点
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
namejm +4 2007-03-09 05:11
三人行,必有吾师焉。 学然后知不足,教然后知困,然后能自强也。
3 发表于 2007-03-09 23:20 ·  中国 安徽 马鞍山 电信
中级用户
★★
积分 493
发帖 228
注册 2007-02-16 00:38
19年会员
UID 79596
性别 男
来自 安徽
状态 离线
如果有几个test.txt文件,
想找某个日期的,
怎么办?
4 发表于 2007-03-10 07:42 ·  中国 安徽 阜阳 电信
初级用户
积分 42
发帖 19
注册 2006-12-28 01:20
19年会员
UID 74752
性别 男
状态 离线
学习了 我这个菜鸟从中受到一些启发 斑竹就是牛B
5 发表于 2007-03-10 07:46 ·  中国 安徽 阜阳 电信
初级用户
积分 42
发帖 19
注册 2006-12-28 01:20
19年会员
UID 74752
性别 男
状态 离线
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"
)
6 发表于 2007-03-11 01:06 ·  中国 安徽 马鞍山 电信
中级用户
★★
积分 493
发帖 228
注册 2007-02-16 00:38
19年会员
UID 79596
性别 男
来自 安徽
状态 离线
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
7 发表于 2007-03-11 01:26 ·  中国 安徽 芜湖 电信
高级用户
★★
积分 537
发帖 219
注册 2006-10-31 21:08
19年会员
UID 69036
性别 男
来自 芜湖
状态 离线
果然是这样!

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
江湖远
碧空长
路茫茫

一个人漫无目的的奔跑,风,刺骨的冷....
8 发表于 2007-03-14 22:08 ·  中国 江苏 南京 电信
初级用户
积分 76
发帖 39
注册 2007-03-09 06:54
19年会员
UID 81169
性别 男
状态 离线
看完了,有点清楚了,6楼的xycoordinate
给的说明真是好啊,省了自己去查了.......
狐狸喜欢狡猾。。
9 发表于 2007-04-03 00:18 ·  中国 浙江 杭州 电信
银牌会员
★★★
积分 1,928
发帖 931
注册 2007-01-06 11:46
19年会员
UID 75624
性别 男
状态 离线
其实这样也行啊

@echo off
for /r e:\ %%i in (*.txt) do (
if /i "%%~nxi"=="test.txt" echo "%%~dpi"
)
pause
10 又学到不少 发表于 2007-04-27 09:47 ·  中国 广东 惠州 电信
新手上路
积分 10
发帖 5
注册 2006-12-01 12:21
19年会员
UID 72277
性别 男
状态 离线
又学到不少
11 发表于 2007-04-30 04:00 ·  中国 广东 茂名 电信
新手上路
积分 12
发帖 6
注册 2007-04-21 13:21
19年会员
UID 85989
性别 男
状态 离线
我晕
各位都是高手,我初来乍到,还望关照....就连DIR有命令我都好多不懂了
郁闷
12 发表于 2007-05-02 15:28 ·  中国 云南 昆明 电信
初级用户
积分 57
发帖 29
注册 2006-12-27 09:36
19年会员
UID 74694
性别 男
状态 离线
顶起了.都是些高人.强呀!
论坛跳转: