中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-14 19:02
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 如何给dir结果中的文件名加上完整路径
楼 主 如何给dir结果中的文件名加上完整路径 发表于 2006-11-07 23:22 ·  中国 内蒙古 呼和浩特 电信
初级用户
积分 50
发帖 23
注册 2006-11-03 23:05
UID 69459
性别 男
状态 离线
假设一个目录下有子目录,子目录下又有子目录,用如下命令
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 ]
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
namejm -2 2007-02-04 09:43
2 发表于 2006-11-07 23:27 ·  中国 四川 南充 电信
超级版主
★★★★
我爱DOS
积分 5,310
发帖 2,044
注册 2005-09-26 12:00
UID 42843
性别 男
来自 四川南充
状态 离线
3 发表于 2006-11-07 23:33 ·  中国 内蒙古 呼和浩特 电信
初级用户
积分 50
发帖 23
注册 2006-11-03 23:05
UID 69459
性别 男
状态 离线
日期 和文件名要,其他要不要都行
4 发表于 2006-11-07 23:35 ·  中国 内蒙古 呼和浩特 电信
初级用户
积分 50
发帖 23
注册 2006-11-03 23:05
UID 69459
性别 男
状态 离线
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 的结果中去除带有"序列"的那行
5 发表于 2006-11-08 00:31 ·  中国 四川 南充 电信
超级版主
★★★★
我爱DOS
积分 5,310
发帖 2,044
注册 2005-09-26 12:00
UID 42843
性别 男
来自 四川南充
状态 离线
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
6 发表于 2006-11-08 01:57 ·  中国 内蒙古 呼和浩特 电信
初级用户
积分 50
发帖 23
注册 2006-11-03 23:05
UID 69459
性别 男
状态 离线
我要文件的目录位置。请楼上的兄弟看下1楼的原意
7 发表于 2006-11-08 02:09 ·  中国 广东 佛山 广东睿江科技有限公司
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
UID 51697
来自 成都
状态 离线
  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没商量。
考虑问题复杂化,解决问题简洁化。
8 发表于 2006-11-08 04:40 ·  中国 四川 南充 电信
超级版主
★★★★
我爱DOS
积分 5,310
发帖 2,044
注册 2005-09-26 12:00
UID 42843
性别 男
来自 四川南充
状态 离线
9 发表于 2006-11-08 04:45 ·  中国 四川 南充 电信
超级版主
★★★★
我爱DOS
积分 5,310
发帖 2,044
注册 2005-09-26 12:00
UID 42843
性别 男
来自 四川南充
状态 离线
10 发表于 2006-11-08 07:03 ·  中国 广东 佛山 广东睿江科技有限公司
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
UID 51697
来自 成都
状态 离线
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 ""^|sort') do echo %%i %%j %%~dpnxl
pause

  发现用 %%~dpnxl 来扩展文件的完整路径的时候,居然是直接在文件名前简单地加上批处理所在的路径,看来这个问题还真的有点棘手,可能得通过产生临时文件的方法才能完全满足楼主的要求。

[ Last edited by namejm on 2006-11-7 at 08:26 PM ]
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
11 发表于 2006-11-08 11:23 ·  中国 广东 佛山 广东睿江科技有限公司
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
UID 51697
来自 成都
状态 离线
  找到了一个解决方案,美中不足的是:产生了两个临时文件。

@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没商量。
考虑问题复杂化,解决问题简洁化。
12 发表于 2006-11-08 13:11 ·  中国 广西 玉林 博白县 电信
金牌会员
★★★★
积分 3,687
发帖 1,467
注册 2005-08-08 12:00
UID 44210
状态 离线
效率较低,不过不会生成临时文件
@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
13 发表于 2006-11-08 23:07 ·  中国 四川 南充 电信
超级版主
★★★★
我爱DOS
积分 5,310
发帖 2,044
注册 2005-09-26 12:00
UID 42843
性别 男
来自 四川南充
状态 离线
楼上的无法运行!
@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
14 发表于 2006-11-09 01:47 ·  中国 广东 佛山 广东睿江科技有限公司
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
UID 51697
来自 成都
状态 离线
  我在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没商量。
考虑问题复杂化,解决问题简洁化。
15 发表于 2006-11-09 04:51 ·  中国 广西 玉林 博白县 电信
金牌会员
★★★★
积分 3,687
发帖 1,467
注册 2005-08-08 12:00
UID 44210
状态 离线
我 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搜索,所以效率降低了
论坛跳转: