Board logo

标题: 出题:批处理显示文件的创建日期及绝对路径 [打印本页]

作者: 随风    时间: 2008-10-1 10:39     标题: 出题:批处理显示文件的创建日期及绝对路径

出题:显示文件的创建日期及绝对路径
以显示1000个文件的创建日期和路径为例: 每个目录10层,每层10个文件
set 指定目录=f:\111\测试文件夹
创建测试文件夹的代码见下。。。
用统一的文件夹作测试,各位将代码及结果贴出来、看看效果如何?

要求:
显示指定目录下的所有文件(含子目录)的创建日期和文件路径+文件名,最后显示文件总数。
不排除文件名有名为 “字节” “可用字节” 的,且无后缀名的可能性。
所以用这两个关键字过滤多余信息的需要多考虑一下了。。

限制: 不允许使用临时文件和第三方工具
       为创建统一测试文件夹方便,创建的文件名全是随机数字,不允许从这个规律入手。
       即:文件名无任何规律,只是没有特殊符号。

加分原则:
   效率高        +5
   代码简洁      +5
   思路独特      +5
   仅仅达到目的  +2
   
出题目的:
    让新手熟悉对文件信息的提取。
    解题对象不限于新手。

难点:尽可能高效的提取文件的创建日期和路径。

提醒:
   for 的 %%~ti 扩展的是文件的修改时间,而不是创建时间。
   目标目录是指定的目录,而不是批处理当前目录。

因个人时间原因委托本版版主代为加分,当然其他会员和版主也可以加分,我委托的是悬赏、鼓励分。

以下提供一段计算批处理耗时的函数代码,方便检测效率,直接复制到代码末尾即可。
  1. :: 计算批处理耗时的函数代码,直接复制到代码末尾即可。
  2. :: 别忘了在代码开头加一句 set t=%time%
  3. call :time0 "%t%" "%time%" "ok"
  4. echo.&echo 耗时: %ok%
  5. pause&exit
  6. :time0  以下为封装部分。
  7. :: code 随风 @bbs.bathone.cn 2008-08-15
  8. setlocal&set /a n=0
  9. for /f "tokens=1-8 delims=.: " %%a in ("%~1:%~2") do (
  10.    set /a n+=10%%a%%100*360000+10%%b%%100*6000+10%%c%%100*100+10%%d%%100
  11.    set /a n-=10%%e%%100*360000+10%%f%%100*6000+10%%g%%100*100+10%%h%%100
  12. )
  13. set "n=%n:-=%"
  14. set /a s=n/360000,n=n%%360000,f=n/6000,n=n%%6000,m=n/100,n=n%%100
  15. set "ok=%s% 小时 %f% 分钟 %m% 秒 %n% 毫秒"
  16. endlocal&set "%~3=%ok%"&goto :eof
复制代码
创建测试文件夹代码
  1. @echo off&setlocal enabledelayedexpansion
  2. rd /s/q 测试文件夹 2>nul
  3. for /l %%a in (1 1 10) do (
  4.    md 测试文件夹\%%a1\%%a2\%%a3\%%a4\%%a5\%%a6\%%a7\%%a8\%%a9\%%a10
  5. )
  6. for /f "delims=" %%a in ('dir/b/s/ad 测试文件夹') do (
  7.    for /l %%i in (1 1 10) do cd.>%%a\!random!!random!!random!.txt
  8. )
  9. echo 以创建文件夹及文件。。。
  10. pause
复制代码

作者: pusofalse    时间: 2008-10-1 11:11

获取创建时间,暂时没啥思路,的确得好好思考一番~
作者: wxcute    时间: 2008-10-1 11:53

我现在不好想代码,应该是DIR命令的第一列吧
作者: pusofalse    时间: 2008-10-1 11:56

dir命令的第一列是日期,第二列是时间~但也是修改时间~
作者: 随风    时间: 2008-10-1 12:15

dir /tc 是创建时间
作者: pusofalse    时间: 2008-10-2 17:09

用了一个取巧的方法~
  1. @echo off&setlocal enabledelayedexpansion
  2. set "t=%time%"
  3. set "desfolder=f:\111"
  4. set "s=%desfolder%"
  5. :lp
  6. if defined s set/a y+=1&set "s=%s:~1%"&goto lp
  7. for /f "skip=2 tokens=1,2,3*" %%a in ('dir/s/tc/a-d %desfolder%\*.*') do (
  8.      set "var=%%a"
  9.      if /i "!var:~,%y%!" equ "%desfolder%" (
  10.          set "str=%%a"
  11.          ) else (
  12.          set/a n+=1,x=n%%11
  13.          if !x! neq 0 set/a s+=1
  14.          if !n! lss 1100 if !x! neq 0 echo  %%a %%b !str!\%%d
  15. ))
  16. set/a s-=3
  17. echo   %s%个文件
  18. call :time0 "%t%" "%time%" "ok"
  19. echo.&echo 耗时: %ok%
  20. pause&exit/b
  21. :time0  以下为封装部分。
  22. :: code 随风 @bbs.bathone.cn 2008-08-15
  23. setlocal&set /a n=0
  24. for /f "tokens=1-8 delims=.: " %%a in ("%~1:%~2") do (
  25.    set /a n+=10%%a%%100*360000+10%%b%%100*6000+10%%c%%100*100+10%%d%%100
  26.    set /a n-=10%%e%%100*360000+10%%f%%100*6000+10%%g%%100*100+10%%h%%100
  27. )
  28. set "n=%n:-=%"
  29. set /a s=n/360000,n=n%%360000,f=n/6000,n=n%%6000,m=n/100,n=n%%100
  30. set "ok=%s% 小时 %f% 分钟 %m% 秒 %n% 毫秒"
  31. endlocal&set "%~3=%ok%"&goto :eof
复制代码

作者: terse    时间: 2008-10-3 01:39

  1. @echo off&setlocal enabledelayedexpansion
  2. set "f=f:\111\测试文件夹"
  3. set t=%time%
  4. for /f "skip=3 tokens=1,2,3*" %%i in ('dir/s/tc/a-d "%f%\*.*"') do (
  5. if defined x echo !x! %%i %%j&goto ok
  6. if "%%i"=="所列文件总数:" set x=%%i
  7. set str=%%i
  8. if "!str:~1,2!"==":\" (set ph=%%i)else if not defined x if not "%%j"=="个文件" echo !ph!\%%l   %%i %%j
  9. )
  10. :ok
  11. call :time0 "%t%" "%time%" "ok"
  12. echo.&echo 耗时: %ok%
  13. pause&exit
  14. :time0
  15. setlocal&set /a n=0
  16. for /f "tokens=1-8 delims=.: " %%a in ("%~1:%~2") do (
  17.    set /a n+=10%%a%%100*360000+10%%b%%100*6000+10%%c%%100*100+10%%d%%100
  18.    set /a n-=10%%e%%100*360000+10%%f%%100*6000+10%%g%%100*100+10%%h%%100
  19. )
  20. set "n=%n:-=%"
  21. set /a s=n/360000,n=n%%360000,f=n/6000,n=n%%6000,m=n/100,n=n%%100
  22. set "ok=%s% 小时 %f% 分钟 %m% 秒 %n% 毫秒"
  23. endlocal&set "%~3=%ok%"&goto :eof
复制代码
  1. @echo off&setlocal enabledelayedexpansion
  2. set "f=f:\111\测试文件夹"
  3. set t=%time%
  4. for /f "skip=3 tokens=1,2,3*" %%i in ('dir/s/tc/a-d "%f%\*.*"') do (
  5. set str=%%i
  6. set var=%%j
  7. if "!str:~1,2!"==":\" (set ph=%%i)else if "!var:~2,1!"==":" echo !ph!\%%l   %%i %%j&set /a n+=1
  8. )
  9. echo 文件总数: %n%
  10. call :time0 "%t%" "%time%" "ok"
  11. echo.&echo 耗时: %ok%
  12. pause&exit
  13. :time0
  14. setlocal&set /a n=0
  15. for /f "tokens=1-8 delims=.: " %%a in ("%~1:%~2") do (
  16.    set /a n+=10%%a%%100*360000+10%%b%%100*6000+10%%c%%100*100+10%%d%%100
  17.    set /a n-=10%%e%%100*360000+10%%f%%100*6000+10%%g%%100*100+10%%h%%100
  18. )
  19. set "n=%n:-=%"
  20. set /a s=n/360000,n=n%%360000,f=n/6000,n=n%%6000,m=n/100,n=n%%100
  21. set "ok=%s% 小时 %f% 分钟 %m% 秒 %n% 毫秒"
  22. endlocal&set "%~3=%ok%"&goto :eof
复制代码

[ 本帖最后由 terse 于 2008-10-3 09:45 编辑 ]
作者: 随风    时间: 2008-10-3 10:28

方法都不错啊,效率也高
以下是我代码
::方法一、
:: 用findstr 来过滤多余的信息,代码显得更整洁易懂,但效率略低一点点。
:: 但子文件越多时速度却相对越快,因为子文件越多findstr过滤掉的内容就越多。
:: 除文件路径和含文件名的行以外,其它的多余信息都被过滤掉了。
:
  1. @echo off&setlocal enabledelayedexpansion
  2. echo 按任意键开始
  3. pause>nul
  4. set t=%time%
  5. set 指定目录=f:\111\测试文件夹
  6. for /f "tokens=*" %%i in ('dir/a-d/tc/s "%指定目录%"^|findstr /b "[0-9] ..:"') do (
  7.    for /f "tokens=1-3* delims= " %%a in ("%%i") do (
  8.      set "str=%%i"
  9.      if "!str:~1,1!"==":" (set ml=%%i) else (
  10.         echo %%a !ml:~0,-4!\%%d&set /a n+=1
  11. )))
  12. echo.&echo :: 共有 !n! 个文件
  13. call :time0 "%t%" "%time%" "ok"
  14. echo :: 耗时 %ok%
  15. endlocal&pause>nul&exit
  16. :time0  以下为计算耗时封装部分。
  17. :: code 随风 @bbs.bathone.cn 2008-08-15
  18. setlocal&set /a n=0
  19. for /f "tokens=1-8 delims=.: " %%a in ("%~1:%~2") do (
  20.    set /a n+=10%%a%%100*360000+10%%b%%100*6000+10%%c%%100*100+10%%d%%100
  21.    set /a n-=10%%e%%100*360000+10%%f%%100*6000+10%%g%%100*100+10%%h%%100
  22. )
  23. set "n=%n:-=%"
  24. set /a s=n/360000,n=n%%360000,f=n/6000,n=n%%6000,m=n/100,n=n%%100
  25. set "ok=%s% 小时 %f% 分钟 %m% 秒 %n% 毫秒"
  26. endlocal&set "%~3=%ok%"&goto :eof
复制代码
::━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
::方法二、
:: 文件不太多时速度比用findstr要快些,但区别不太大。
:
  1. @echo off&setlocal enabledelayedexpansion
  2. echo 按任意键开始
  3. pause>nul
  4. set t=%time%
  5. set 指定目录=f:\111\测试文件夹
  6. for /f "skip=3 delims=" %%i in ('dir/tc/s/a-d "%指定目录%"') do (
  7.    for /f "tokens=1-3* delims= " %%a in ("%%i") do (
  8.      set "str=%%i"
  9.      if "%%b"=="个文件" set "ml="
  10.      if defined ml echo %%a !ml:~1,-4!\%%d&set /a n+=1
  11.      if "!str:~2,1!"==":" set "ml=%%i"
  12. ))
  13. echo.&echo :: 共有 !n! 个文件
  14. call :time0 "%t%" "%time%" "ok"
  15. echo :: 耗时 %ok%
  16. endlocal&pause>nul&exit
  17. :time0  以下为计算耗时封装部分。
  18. :: code 随风 @bbs.bathone.cn 2008-08-15
  19. setlocal&set /a n=0
  20. for /f "tokens=1-8 delims=.: " %%a in ("%~1:%~2") do (
  21.    set /a n+=10%%a%%100*360000+10%%b%%100*6000+10%%c%%100*100+10%%d%%100
  22.    set /a n-=10%%e%%100*360000+10%%f%%100*6000+10%%g%%100*100+10%%h%%100
  23. )
  24. set "n=%n:-=%"
  25. set /a s=n/360000,n=n%%360000,f=n/6000,n=n%%6000,m=n/100,n=n%%100
  26. set "ok=%s% 小时 %f% 分钟 %m% 秒 %n% 毫秒"
  27. endlocal&set "%~3=%ok%"&goto :eof
复制代码

作者: xahstar    时间: 2008-10-3 15:31

  1. @echo off&setlocal enabledelayedexpansion
  2. set "f=c:\测试文件夹"
  3. set t=%time%
  4. for /f "skip=3 tokens=1,2,4  delims= " %%i in ('dir /a-d /tc /s %f%') do (
  5.    if not %%j==个文件  if not %%j==个目录 if not %%i==所列文件总数: (
  6.       if  %%j==的目录 (set l=%%i) else (
  7.         echo %%i %%j !l!\%%k
  8.         set /a c+=1
  9.        )
  10.    )
  11. )
  12. echo 所列文件总数: %c%
  13. :: 计算批处理耗时的函数代码,直接复制到代码末尾即可。
  14. :: 别忘了在代码开头加一句 set t=%time%
  15. call :time0 "%t%" "%time%" "ok"
  16. echo.&echo 耗时: %ok%
  17. pause&exit
  18. :time0  以下为封装部分。
  19. :: code 随风 @bbs.bathone.cn 2008-08-15
  20. setlocal&set /a n=0
  21. for /f "tokens=1-8 delims=.: " %%a in ("%~1:%~2") do (
  22.    set /a n+=10%%a%%100*360000+10%%b%%100*6000+10%%c%%100*100+10%%d%%100
  23.    set /a n-=10%%e%%100*360000+10%%f%%100*6000+10%%g%%100*100+10%%h%%100
  24. )
  25. set "n=%n:-=%"
  26. set /a s=n/360000,n=n%%360000,f=n/6000,n=n%%6000,m=n/100,n=n%%100
  27. set "ok=%s% 小时 %f% 分钟 %m% 秒 %n% 毫秒"
  28. endlocal&set "%~3=%ok%"&goto :eof
  29. pause
复制代码

作者: batman    时间: 2008-10-3 16:22     标题: 我来一个:

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "skip=3 delims=" %%a in ('dir /s /a-d /tc test') do (
  3.     set "str=%%a"
  4.     if "!str:\=!" neq "!str!" set "pd=!str!"
  5.     if "!str:%date:~,4%=!" neq "!str!" (
  6.        for /f "tokens=1,2,4 delims= " %%i in ("%%a") do (
  7.            if "%%i" neq "所列文件总数:" set /a n+=1&echo %%i %%j !pd:~,-4!\%%k
  8.        )
  9.     )
  10. )
  11. echo 总共有%n%个文件。&pause>nul
复制代码

作者: dudubird    时间: 2009-7-30 12:35     标题: 哪用这么多,一条命令搞定!

for /f "delims=" %%i in ('dir /tc /b /o:-d /a-d /s d:\test\"*.*"') do echo %%~dptznxi
作者: Batcher    时间: 2009-7-30 13:44     标题: 回复 11楼 的帖子

你的代码能满足楼主的所有要求么?
作者: wangqi0077    时间: 2011-9-15 18:32

耗时: 0 小时 0 分钟 31 秒 34 毫秒
  1. @echo off
  2. setlocal EnableDelayedExpansion
  3. set t=%time%
  4. set /a a=0
  5. set "f=F:\bat\test\测试文件夹"
  6. for /r %f% %%i in (*) do (
  7. set /a a=!a!+1
  8. echo 第!a!文件详细路径是:%%i
  9. echo 创建时间:
  10. dir /tc %%i|find "/"
  11. )
  12. echo 总文件数:%a%
  13. :: 计算批处理耗时的函数代码,直接复制到代码末尾即可。
  14. :: 别忘了在代码开头加一句 set t=%time%
  15. call :time0 "%t%" "%time%" "ok"
  16. echo.&echo 耗时: %ok%
  17. pause&exit
  18. :time0  以下为计算耗时封装部分。
  19. :: code 随风 @bbs.bathone.cn 2008-08-15
  20. setlocal&set /a n=0
  21. for /f "tokens=1-8 delims=.: " %%a in ("%~1:%~2") do (
  22.    set /a n+=10%%a%%100*360000+10%%b%%100*6000+10%%c%%100*100+10%%d%%100
  23.    set /a n-=10%%e%%100*360000+10%%f%%100*6000+10%%g%%100*100+10%%h%%100
  24. )
  25. set "n=%n:-=%"
  26. set /a s=n/360000,n=n%%360000,f=n/6000,n=n%%6000,m=n/100,n=n%%100
  27. set "ok=%s% 小时 %f% 分钟 %m% 秒 %n% 毫秒"
  28. endlocal&set "%~3=%ok%"&goto :eof
复制代码





欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2