标题: 出题:批处理显示文件的创建日期及绝对路径 [打印本页]
作者: 随风 时间: 2008-10-1 10:39 标题: 出题:批处理显示文件的创建日期及绝对路径
出题:显示文件的创建日期及绝对路径
以显示1000个文件的创建日期和路径为例: 每个目录10层,每层10个文件
set 指定目录=f:\111\测试文件夹
创建测试文件夹的代码见下。。。
用统一的文件夹作测试,各位将代码及结果贴出来、看看效果如何?
要求:
显示指定目录下的所有文件(含子目录)的创建日期和文件路径+文件名,最后显示文件总数。
不排除文件名有名为 “字节” “可用字节” 的,且无后缀名的可能性。
所以用这两个关键字过滤多余信息的需要多考虑一下了。。
限制: 不允许使用临时文件和第三方工具
为创建统一测试文件夹方便,创建的文件名全是随机数字,不允许从这个规律入手。
即:文件名无任何规律,只是没有特殊符号。
加分原则:
效率高 +5
代码简洁 +5
思路独特 +5
仅仅达到目的 +2
出题目的:
让新手熟悉对文件信息的提取。
解题对象不限于新手。
难点:尽可能高效的提取文件的创建日期和路径。
提醒:
for 的 %%~ti 扩展的是文件的修改时间,而不是创建时间。
目标目录是指定的目录,而不是批处理当前目录。
因个人时间原因委托本版版主代为加分,当然其他会员和版主也可以加分,我委托的是悬赏、鼓励分。
以下提供一段计算批处理耗时的函数代码,方便检测效率,直接复制到代码末尾即可。- :: 计算批处理耗时的函数代码,直接复制到代码末尾即可。
- :: 别忘了在代码开头加一句 set t=%time%
- call :time0 "%t%" "%time%" "ok"
- echo.&echo 耗时: %ok%
- pause&exit
-
- :time0 以下为封装部分。
- :: code 随风 @bbs.bathone.cn 2008-08-15
- setlocal&set /a n=0
- for /f "tokens=1-8 delims=.: " %%a in ("%~1:%~2") do (
- set /a n+=10%%a%%100*360000+10%%b%%100*6000+10%%c%%100*100+10%%d%%100
- set /a n-=10%%e%%100*360000+10%%f%%100*6000+10%%g%%100*100+10%%h%%100
- )
- set "n=%n:-=%"
- set /a s=n/360000,n=n%%360000,f=n/6000,n=n%%6000,m=n/100,n=n%%100
- set "ok=%s% 小时 %f% 分钟 %m% 秒 %n% 毫秒"
- endlocal&set "%~3=%ok%"&goto :eof
复制代码
创建测试文件夹代码- @echo off&setlocal enabledelayedexpansion
- rd /s/q 测试文件夹 2>nul
- for /l %%a in (1 1 10) do (
- md 测试文件夹\%%a1\%%a2\%%a3\%%a4\%%a5\%%a6\%%a7\%%a8\%%a9\%%a10
- )
- for /f "delims=" %%a in ('dir/b/s/ad 测试文件夹') do (
- for /l %%i in (1 1 10) do cd.>%%a\!random!!random!!random!.txt
- )
- echo 以创建文件夹及文件。。。
- 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
用了一个取巧的方法~- @echo off&setlocal enabledelayedexpansion
- set "t=%time%"
- set "desfolder=f:\111"
- set "s=%desfolder%"
- :lp
- if defined s set/a y+=1&set "s=%s:~1%"&goto lp
- for /f "skip=2 tokens=1,2,3*" %%a in ('dir/s/tc/a-d %desfolder%\*.*') do (
- set "var=%%a"
- if /i "!var:~,%y%!" equ "%desfolder%" (
- set "str=%%a"
- ) else (
- set/a n+=1,x=n%%11
- if !x! neq 0 set/a s+=1
- if !n! lss 1100 if !x! neq 0 echo %%a %%b !str!\%%d
- ))
- set/a s-=3
- echo %s%个文件
- call :time0 "%t%" "%time%" "ok"
- echo.&echo 耗时: %ok%
- pause&exit/b
- :time0 以下为封装部分。
- :: code 随风 @bbs.bathone.cn 2008-08-15
- setlocal&set /a n=0
- for /f "tokens=1-8 delims=.: " %%a in ("%~1:%~2") do (
- set /a n+=10%%a%%100*360000+10%%b%%100*6000+10%%c%%100*100+10%%d%%100
- set /a n-=10%%e%%100*360000+10%%f%%100*6000+10%%g%%100*100+10%%h%%100
- )
- set "n=%n:-=%"
- set /a s=n/360000,n=n%%360000,f=n/6000,n=n%%6000,m=n/100,n=n%%100
- set "ok=%s% 小时 %f% 分钟 %m% 秒 %n% 毫秒"
- endlocal&set "%~3=%ok%"&goto :eof
复制代码
作者: terse 时间: 2008-10-3 01:39
- @echo off&setlocal enabledelayedexpansion
- set "f=f:\111\测试文件夹"
- set t=%time%
- for /f "skip=3 tokens=1,2,3*" %%i in ('dir/s/tc/a-d "%f%\*.*"') do (
- if defined x echo !x! %%i %%j&goto ok
- if "%%i"=="所列文件总数:" set x=%%i
- set str=%%i
- if "!str:~1,2!"==":\" (set ph=%%i)else if not defined x if not "%%j"=="个文件" echo !ph!\%%l %%i %%j
- )
- :ok
- call :time0 "%t%" "%time%" "ok"
- echo.&echo 耗时: %ok%
- pause&exit
- :time0
- setlocal&set /a n=0
- for /f "tokens=1-8 delims=.: " %%a in ("%~1:%~2") do (
- set /a n+=10%%a%%100*360000+10%%b%%100*6000+10%%c%%100*100+10%%d%%100
- set /a n-=10%%e%%100*360000+10%%f%%100*6000+10%%g%%100*100+10%%h%%100
- )
- set "n=%n:-=%"
- set /a s=n/360000,n=n%%360000,f=n/6000,n=n%%6000,m=n/100,n=n%%100
- set "ok=%s% 小时 %f% 分钟 %m% 秒 %n% 毫秒"
- endlocal&set "%~3=%ok%"&goto :eof
复制代码
- @echo off&setlocal enabledelayedexpansion
- set "f=f:\111\测试文件夹"
- set t=%time%
- for /f "skip=3 tokens=1,2,3*" %%i in ('dir/s/tc/a-d "%f%\*.*"') do (
- set str=%%i
- set var=%%j
- if "!str:~1,2!"==":\" (set ph=%%i)else if "!var:~2,1!"==":" echo !ph!\%%l %%i %%j&set /a n+=1
- )
- echo 文件总数: %n%
- call :time0 "%t%" "%time%" "ok"
- echo.&echo 耗时: %ok%
- pause&exit
- :time0
- setlocal&set /a n=0
- for /f "tokens=1-8 delims=.: " %%a in ("%~1:%~2") do (
- set /a n+=10%%a%%100*360000+10%%b%%100*6000+10%%c%%100*100+10%%d%%100
- set /a n-=10%%e%%100*360000+10%%f%%100*6000+10%%g%%100*100+10%%h%%100
- )
- set "n=%n:-=%"
- set /a s=n/360000,n=n%%360000,f=n/6000,n=n%%6000,m=n/100,n=n%%100
- set "ok=%s% 小时 %f% 分钟 %m% 秒 %n% 毫秒"
- endlocal&set "%~3=%ok%"&goto :eof
复制代码
[ 本帖最后由 terse 于 2008-10-3 09:45 编辑 ]
作者: 随风 时间: 2008-10-3 10:28
方法都不错啊,效率也高
以下是我代码
::方法一、
:: 用findstr 来过滤多余的信息,代码显得更整洁易懂,但效率略低一点点。
:: 但子文件越多时速度却相对越快,因为子文件越多findstr过滤掉的内容就越多。
:: 除文件路径和含文件名的行以外,其它的多余信息都被过滤掉了。
:- @echo off&setlocal enabledelayedexpansion
- echo 按任意键开始
- pause>nul
- set t=%time%
- set 指定目录=f:\111\测试文件夹
- for /f "tokens=*" %%i in ('dir/a-d/tc/s "%指定目录%"^|findstr /b "[0-9] ..:"') do (
- for /f "tokens=1-3* delims= " %%a in ("%%i") do (
- set "str=%%i"
- if "!str:~1,1!"==":" (set ml=%%i) else (
- echo %%a !ml:~0,-4!\%%d&set /a n+=1
- )))
- echo.&echo :: 共有 !n! 个文件
- call :time0 "%t%" "%time%" "ok"
- echo :: 耗时 %ok%
- endlocal&pause>nul&exit
-
- :time0 以下为计算耗时封装部分。
- :: code 随风 @bbs.bathone.cn 2008-08-15
- setlocal&set /a n=0
- for /f "tokens=1-8 delims=.: " %%a in ("%~1:%~2") do (
- set /a n+=10%%a%%100*360000+10%%b%%100*6000+10%%c%%100*100+10%%d%%100
- set /a n-=10%%e%%100*360000+10%%f%%100*6000+10%%g%%100*100+10%%h%%100
- )
- set "n=%n:-=%"
- set /a s=n/360000,n=n%%360000,f=n/6000,n=n%%6000,m=n/100,n=n%%100
- set "ok=%s% 小时 %f% 分钟 %m% 秒 %n% 毫秒"
- endlocal&set "%~3=%ok%"&goto :eof
复制代码
::━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
::方法二、
:: 文件不太多时速度比用findstr要快些,但区别不太大。
:- @echo off&setlocal enabledelayedexpansion
- echo 按任意键开始
- pause>nul
- set t=%time%
- set 指定目录=f:\111\测试文件夹
- for /f "skip=3 delims=" %%i in ('dir/tc/s/a-d "%指定目录%"') do (
- for /f "tokens=1-3* delims= " %%a in ("%%i") do (
- set "str=%%i"
- if "%%b"=="个文件" set "ml="
- if defined ml echo %%a !ml:~1,-4!\%%d&set /a n+=1
- if "!str:~2,1!"==":" set "ml=%%i"
- ))
- echo.&echo :: 共有 !n! 个文件
- call :time0 "%t%" "%time%" "ok"
- echo :: 耗时 %ok%
- endlocal&pause>nul&exit
-
- :time0 以下为计算耗时封装部分。
- :: code 随风 @bbs.bathone.cn 2008-08-15
- setlocal&set /a n=0
- for /f "tokens=1-8 delims=.: " %%a in ("%~1:%~2") do (
- set /a n+=10%%a%%100*360000+10%%b%%100*6000+10%%c%%100*100+10%%d%%100
- set /a n-=10%%e%%100*360000+10%%f%%100*6000+10%%g%%100*100+10%%h%%100
- )
- set "n=%n:-=%"
- set /a s=n/360000,n=n%%360000,f=n/6000,n=n%%6000,m=n/100,n=n%%100
- set "ok=%s% 小时 %f% 分钟 %m% 秒 %n% 毫秒"
- endlocal&set "%~3=%ok%"&goto :eof
复制代码
作者: xahstar 时间: 2008-10-3 15:31
- @echo off&setlocal enabledelayedexpansion
- set "f=c:\测试文件夹"
- set t=%time%
- for /f "skip=3 tokens=1,2,4 delims= " %%i in ('dir /a-d /tc /s %f%') do (
- if not %%j==个文件 if not %%j==个目录 if not %%i==所列文件总数: (
- if %%j==的目录 (set l=%%i) else (
- echo %%i %%j !l!\%%k
- set /a c+=1
- )
- )
- )
- echo 所列文件总数: %c%
- :: 计算批处理耗时的函数代码,直接复制到代码末尾即可。
- :: 别忘了在代码开头加一句 set t=%time%
- call :time0 "%t%" "%time%" "ok"
- echo.&echo 耗时: %ok%
- pause&exit
-
- :time0 以下为封装部分。
- :: code 随风 @bbs.bathone.cn 2008-08-15
- setlocal&set /a n=0
- for /f "tokens=1-8 delims=.: " %%a in ("%~1:%~2") do (
- set /a n+=10%%a%%100*360000+10%%b%%100*6000+10%%c%%100*100+10%%d%%100
- set /a n-=10%%e%%100*360000+10%%f%%100*6000+10%%g%%100*100+10%%h%%100
- )
- set "n=%n:-=%"
- set /a s=n/360000,n=n%%360000,f=n/6000,n=n%%6000,m=n/100,n=n%%100
- set "ok=%s% 小时 %f% 分钟 %m% 秒 %n% 毫秒"
- endlocal&set "%~3=%ok%"&goto :eof
- pause
复制代码
作者: batman 时间: 2008-10-3 16:22 标题: 我来一个:
- @echo off&setlocal enabledelayedexpansion
- for /f "skip=3 delims=" %%a in ('dir /s /a-d /tc test') do (
- set "str=%%a"
- if "!str:\=!" neq "!str!" set "pd=!str!"
- if "!str:%date:~,4%=!" neq "!str!" (
- for /f "tokens=1,2,4 delims= " %%i in ("%%a") do (
- if "%%i" neq "所列文件总数:" set /a n+=1&echo %%i %%j !pd:~,-4!\%%k
- )
- )
- )
- 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 毫秒- @echo off
- setlocal EnableDelayedExpansion
- set t=%time%
- set /a a=0
- set "f=F:\bat\test\测试文件夹"
- for /r %f% %%i in (*) do (
- set /a a=!a!+1
- echo 第!a!文件详细路径是:%%i
- echo 创建时间:
- dir /tc %%i|find "/"
- )
- echo 总文件数:%a%
-
-
- :: 计算批处理耗时的函数代码,直接复制到代码末尾即可。
-
- :: 别忘了在代码开头加一句 set t=%time%
-
- call :time0 "%t%" "%time%" "ok"
-
- echo.&echo 耗时: %ok%
-
- pause&exit
- :time0 以下为计算耗时封装部分。
-
- :: code 随风 @bbs.bathone.cn 2008-08-15
-
- setlocal&set /a n=0
-
- for /f "tokens=1-8 delims=.: " %%a in ("%~1:%~2") do (
-
- set /a n+=10%%a%%100*360000+10%%b%%100*6000+10%%c%%100*100+10%%d%%100
-
- set /a n-=10%%e%%100*360000+10%%f%%100*6000+10%%g%%100*100+10%%h%%100
-
- )
-
- set "n=%n:-=%"
-
- set /a s=n/360000,n=n%%360000,f=n/6000,n=n%%6000,m=n/100,n=n%%100
-
- set "ok=%s% 小时 %f% 分钟 %m% 秒 %n% 毫秒"
-
- endlocal&set "%~3=%ok%"&goto :eof
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |