Board logo

标题: 如何给dir结果中的文件名加上完整路径 [打印本页]

作者: onlykier     时间: 2006-11-7 23:22    标题: 如何给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 ]
作者: 不得不爱     时间: 2006-11-7 23:27
dir/s/b
时间和大小是一定要吗?

[ Last edited by 不得不爱 on 2006-11-7 at 11:29 AM ]
作者: onlykier     时间: 2006-11-7 23:33
日期 和文件名要,其他要不要都行
作者: onlykier     时间: 2006-11-7 23:35
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-8 00:31
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
作者: onlykier     时间: 2006-11-8 01:57
我要文件的目录位置。请楼上的兄弟看下1楼的原意
作者: namejm     时间: 2006-11-8 02:09
  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 ]
作者: 不得不爱     时间: 2006-11-8 04:40
可是我测试了下7楼的代码和5楼的代码是一样的输出啊
作者: 不得不爱     时间: 2006-11-8 04:45
不会是你们执行dir/s/b/od不显示带路径的文件名吧
作者: namejm     时间: 2006-11-8 07:03


  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 ]
作者: namejm     时间: 2006-11-8 11:23
  找到了一个解决方案,美中不足的是:产生了两个临时文件。
@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"

作者: zh159     时间: 2006-11-8 13:11
效率较低,不过不会生成临时文件
@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 23:07
楼上的无法运行!
@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

作者: namejm     时间: 2006-11-9 01:47
  我在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) 的做法是不正确的。
作者: zh159     时间: 2006-11-9 04:51
我 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搜索,所以效率降低了
作者: namejm     时间: 2006-11-9 07:34
  看来 %%~fi 扩展路径的时候是有条件限制的,12F的代码确实能准确取到真实的绝对路径,不过这个绝对路径是 dir 出来的,而不是通过 %%~fi 扩展出来的,把 set Name=%%~fa 换成 set Name=%%a,效果一样。

  不过,12F的代码是有缺陷的:当在不同文件夹下存在同名文件的时候,再次用 dir 来查询,则只能取到其中一个目录下的同名文件,而不能取到全部;不理解 find /v "序列 用意何在,假设某个文件名或者路径名中含有 序列 二字,那岂不是过滤掉了吗?

  另外,15F的举例中,用^|findstr ".mmf“ 的格式,会查找到文件名中含有 mmf 的所有文件,而不仅仅是只查到后缀名为 .mmf 的文件,这是因为 findstr 支持正则表达式,而点号在正则表达式中是匹配任意字符的。

  综合各种方案的优缺点,我觉得只有通过产生临时文件的方法,才有可能完成楼主的要求。

[ Last edited by namejm on 2006-11-8 at 08:21 PM ]
作者: 3742668     时间: 2006-11-9 08:24
1.subst x: "%cd%"
2.wmic datafile where "drive='x:'" get filesize,CreationDate,name
3.subst x: /d
只要把第二步放到for里面进行操作就可以得到希望的结果了,时间关系,代码略。
作者: namejm     时间: 2006-11-9 08:42
  3742668兄够强悍,wmic 用得出神入化,PF。