中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 如何给dir结果中的文件名加上完整路径
« [1] [2] »
作者:
标题: 如何给dir结果中的文件名加上完整路径 上一主题 | 下一主题
onlykier
初级用户





积分 50
发帖 23
注册 2006-11-3
状态 离线
『楼 主』:  如何给dir结果中的文件名加上完整路径

假设一个目录下有子目录,子目录下又有子目录,用如下命令
dir /s /a-d /tc|sort|find "-"|find /v "序列" 结果类此如下
2006-10-01  19:49              123,392 asdfasdfasd060921-060927.xls
2006-10-01  19:49              123,904 asdfasdfasd060914-060920.xls
2006-10-01  19:49              161,280 asdfasdfasd060831-060906.xls
2006-10-01  19:49              167,936 asdfasdfasd060907-060913.xls
2006-10-07  19:08              160,768 asdfasdfasd060824-060830.xls
2006-10-07  19:13              124,928 asdfasdfasd060928-061004.xls
2006-10-12  00:17              124,416 asdfasdfasd061005-061011.xls
2006-10-19  08:18              124,928 asdfasdfasd061012-061018.xls
2006-10-26  12:22              124,928 asdfasdfasd061019-061025.xls

我想在文件名之前显示该文件的目录名,结果像这样,请问该如何做?
2006-10-01  19:49              123,392 d:\x1\asdfasdfasd060921-060927.xls
2006-10-01  19:49              123,904 d:\x2\asdfasdfasd060914-060920.xls
2006-10-01  19:49              161,280 d:\x2\1\asdfasdfasd060831-060906.xls
2006-10-01  19:49              167,936 d:\x2\2\asdfasdfasd060907-060913.xls
2006-10-07  19:08              160,768 d:\x2\3\asdfasdfasd060824-060830.xls
2006-10-07  19:13              124,928 d:\x4\asdfasdfasd060928-061004.xls
2006-10-12  00:17              124,416 d:\x5\asdfasdfasd061005-061011.xls
2006-10-19  08:18              124,928 d:\x4\1\asdfasdfasd061012-061018.xls
2006-10-26  12:22              124,928 d:\x4\3\asdfasdfasd061019-061025.xls


──────────────── 版务记录 ────────────────
执行:namejm
原标题:问个dir的问题
修改后标题:如何给dir结果中的文件名加上完整路径
说明:因标题过于模糊,不便于论坛的搜索和管理,在本提示发表三日后,楼主尚未修改
  标题,现由本人强制修改标题,并扣除楼主2点积分。
──────────────── 版务记录 ────────────────


[ Last edited by namejm on 2007-2-3 at 08:38 PM ]

   此帖被 -2 点积分    点击查看详情   
评分人:【 namejm 分数: -2  时间:2007-2-4 09:43


2006-11-7 23:22
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
不得不爱
超级版主

我爱DOS


积分 5310
发帖 2044
注册 2005-9-26
来自 四川南充
状态 离线
『第 2 楼』:  

dir/s/b
时间和大小是一定要吗?

[ Last edited by 不得不爱 on 2006-11-7 at 11:29 AM ]



我的网络U盘 我的网络第2个U盘
论坛软件下载链接
灵雨飘零论坛  
论坛新手必读,所有人的基本行为准则
刷QQ空间人气、留言的小软件
2006-11-7 23:27
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
onlykier
初级用户





积分 50
发帖 23
注册 2006-11-3
状态 离线
『第 3 楼』:  

日期 和文件名要,其他要不要都行

2006-11-7 23:33
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
onlykier
初级用户





积分 50
发帖 23
注册 2006-11-3
状态 离线
『第 4 楼』:  

dir /s /a-d /tc|sort|find "-"|find /v "序列"
这句话的意思是
/s 显示当前目录及子目录的文件
/a-d 结果中去除文件夹的信息
/tc 按创建时间显示
|sort 是对dir /s/a-d/tc 的结果进行排序,按创建时间从早到晚排序
|find "-" 对dir /s /a-d /tc|sort 的结果进行筛选,只显示带有"-"的行
|find /v "序列" 的作用是,由于dir /s /a-d /tc|sort|find "-"显示的结果中有一行结果是不相要的,所以对dir /s /a-d /tc|sort|find 的结果中去除带有"序列"的那行

2006-11-7 23:35
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
不得不爱
超级版主

我爱DOS


积分 5310
发帖 2044
注册 2005-9-26
来自 四川南充
状态 离线
『第 5 楼』:  

bat里用:
FOR /F "tokens=*" %%i IN ('dir/s/b/od') DO @echo %%~ti %%i
CMD里用
FOR /F "tokens=*" %i IN ('dir/s/b/od') DO @echo %~ti %i



我的网络U盘 我的网络第2个U盘
论坛软件下载链接
灵雨飘零论坛  
论坛新手必读,所有人的基本行为准则
刷QQ空间人气、留言的小软件
2006-11-8 00:31
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
onlykier
初级用户





积分 50
发帖 23
注册 2006-11-3
状态 离线
『第 6 楼』:  

我要文件的目录位置。请楼上的兄弟看下1楼的原意

2006-11-8 01:57
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


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

  5F的只满足了3F的其中一个需求,而对另一个需求不做处理,在5F的基础上得到如下代码:
@echo off
for /f "delims=" %%i in ('dir /a-d /b /s /od') do echo %%~ti %%~dpnxi
pause
[ Last edited by namejm on 2006-11-7 at 02:15 PM ]



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-11-8 02:09
查看资料  发短消息 网志   编辑帖子  回复  引用回复
不得不爱
超级版主

我爱DOS


积分 5310
发帖 2044
注册 2005-9-26
来自 四川南充
状态 离线
『第 8 楼』:  

可是我测试了下7楼的代码和5楼的代码是一样的输出啊



我的网络U盘 我的网络第2个U盘
论坛软件下载链接
灵雨飘零论坛  
论坛新手必读,所有人的基本行为准则
刷QQ空间人气、留言的小软件
2006-11-8 04:40
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
不得不爱
超级版主

我爱DOS


积分 5310
发帖 2044
注册 2005-9-26
来自 四川南充
状态 离线
『第 9 楼』:  

不会是你们执行dir/s/b/od不显示带路径的文件名吧



我的网络U盘 我的网络第2个U盘
论坛软件下载链接
灵雨飘零论坛  
论坛新手必读,所有人的基本行为准则
刷QQ空间人气、留言的小软件
2006-11-8 04:45
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


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



  Quote:
Originally posted by 不得不爱 at 2006-11-7 16:40:
可是我测试了下7楼的代码和5楼的代码是一样的输出啊

  sorry,没有对5F和7F的代码做对比测试,导致我主观地认为5F的代码和7F的代码有所差别,实际上它们显示的结果是一样的。

  不过,用 for 语句中的 %%~ti 扩展只能探测到文件的最后改动时间,而不能探测到文件的创建时间。要提取创建时间的话,还是需要用 dir 里的 /tc。请楼主测试以下代码,看是不是你所需要的:
@echo off
for /f "tokens=1-3*" %%i in ('dir /a-d /tc /s^|findstr /b "[0-9]"^|sort') do echo %%i %%j %%~dpnxl
pause
  发现用 %%~dpnxl 来扩展文件的完整路径的时候,居然是直接在文件名前简单地加上批处理所在的路径,看来这个问题还真的有点棘手,可能得通过产生临时文件的方法才能完全满足楼主的要求。

[ Last edited by namejm on 2006-11-7 at 08:26 PM ]



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

batch fan


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

  找到了一个解决方案,美中不足的是:产生了两个临时文件。
@echo off
cd.>"%tmp%\tmp.txt"
setlocal enabledelayedexpansion
for /f "tokens=1-3*" %%i in ('dir /a-d /tc /s^|findstr ":"') do (
    set var=%%i%%j%%k%%l
    if "!var:~1,1!"==":" set route=!var!
    if not "!route!"=="!var!" if not "%%j"=="" echo %%i %%j !route:~0,-3!\%%l>>"%tmp%\tmp.txt"
)
sort<"%tmp%\tmp.txt">"%tmp%\list.txt"
del "%tmp%\tmp.txt"
start "" "%tmp%\list.txt"




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




积分 3687
发帖 1467
注册 2005-8-8
状态 离线
『第 12 楼』:  

效率较低,不过不会生成临时文件
@echo off
cd.>list.txt
setlocal EnableDelayedExpansion
for /f "tokens=1-3* delims= " %%i in ('dir/a-d/tc/s ^|sort^|findstr "-"^|find /v "序列"') do (
  for /f "delims=" %%a in ('dir/b/s "%%l"') do set Name=%%~fa
    echo %%i %%j %%k        !Name!>>list.txt
)
exit


2006-11-8 13:11
查看资料  发短消息 网志   编辑帖子  回复  引用回复
不得不爱
超级版主

我爱DOS


积分 5310
发帖 2044
注册 2005-9-26
来自 四川南充
状态 离线
『第 13 楼』:  

楼上的无法运行!
@echo off
for /f "tokens=1-3*" %%a in ('dir/s/a-d/tc^|sort^|find "-"') do echo %%a|find "序列号">nul||echo %%a %%b %%~dpnxd




我的网络U盘 我的网络第2个U盘
论坛软件下载链接
灵雨飘零论坛  
论坛新手必读,所有人的基本行为准则
刷QQ空间人气、留言的小软件
2006-11-8 23:07
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


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

  我在10F说过,for 语句的 %%~ti 只能探测到文件的最后改动时间,而 %%~dpnxi 只是简单地在文件名之前加上批处理所在的路径,假设 test.bat 位于 d:\test 下,而test.txt 位于 d:\test\abc\123 下,那么,%%~dpnxi 只会把 test.txt 扩展成 d:\test\test.txt 而不是 d:\test\abc\123\test.txt ,所以,同时使用 %%~ti 和  %%~dpnxi(或者%%~fi) 的做法是不正确的。



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




积分 3687
发帖 1467
注册 2005-8-8
状态 离线
『第 15 楼』:  

我 12F 的测试过,可以运行,只不过LZ的后一段:findstr "-"^|find /v "序列" 测试时我用的是^|findstr ".mmf"(mmf为手机铃声文件)

for /f "delims=" %%a in ('dir/b/s "%%l"') do set Name=%%~fa
这一行是再搜索一次"%%l"的文件,%%~fa获得正确路径,因为再次dir/s搜索,所以效率降低了

2006-11-9 04:51
查看资料  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: