[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

出题:批处理显示文件的创建日期及绝对路径

出题:显示文件的创建日期及绝对路径
以显示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
复制代码
技术问题请到论坛发帖求助!

dir /tc 是创建时间
技术问题请到论坛发帖求助!

TOP

方法都不错啊,效率也高
以下是我代码
::方法一、
:: 用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
复制代码
技术问题请到论坛发帖求助!

TOP

返回列表