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

【练习-021】按要求对文件夹中文件进行统计操作的批处理

出题目的:
  通过解题熟练掌握for+dir的用法
解题要求:
  1 代码高效简洁
  2 不生成临时文件
  3 通用性好
加分原则:
  1 思路独特基分5分
  2 代码高效基分4分
  3 代码简洁基分3分
  4 无临时文件基分2分
  5 通用性好基分1分
  6 完美代码加15分
题目如下:
  已知文件夹下有子文件夹和诺干txt文件以及批处理test.bat(见图1),其中每
个子文件夹下有诺干txt文件(见图2)要求运行test.bat后生成list.txt并删除test.bat
(见图3),生成的list.txt如下(同文件夹下的文件目录要求5个一排并对齐,两个文
件夹目录用空行格开):
  1. 本目录下有文本文件5个:
  2. 本局.txt     电信.txt     水电局.txt    水电站.txt    网吧.txt   
  3.  
  4. 伏波路子文件夹中有文本文件12个:
  5. 王家洲.txt    湾塘.txt     教师新村.txt   国税局.txt    检察院.txt   
  6. 潇湘双语.txt   移动.txt     税务局.txt    教师村.txt    石港路.txt   
  7. 纸厂.txt     桔园.txt 
  8.    
  9. 渌滨路子文件夹中有文本文件3个:
  10. 渌滨.txt     伏坡岭.txt    伏波.txt    
  11. ............   
  12. 向阳南路子文件夹中有文本文件17个:
  13. 电力局.txt    向阳小区.txt   劳动局.txt    林业局.txt    水利局.txt   
  14. 烟草.txt     环保局.txt    民政局.txt    畜牧.txt     向阳南路.txt  
  15. 津口路.txt    向阳.txt     津口东路.txt   世纪.txt     武警.txt    
  16. 保险.txt     发展.txt 
  17.    
  18. E:\文档资料\局域网\批处理\huafe\中总共有文本文件121个
复制代码
补充一点:
  文本文件名中最多有6个汉字,最少有2个汉字(全是汉字)
附件: 您需要登录才可以下载或查看附件。没有帐号?注册
***共同提高***

这题之所以分为文本处理类是因为list.txt中的列表要对其吧?~做过一次才知道这题综合性好强。

[ 本帖最后由 pusofalse 于 2008-9-4 19:19 编辑 ]
心绪平和,眼藏静谧。

TOP

对齐的时候,需要考虑文件名长度大于80(甚至几百)的情况不?
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

  1. @echo off
  2. Setlocal Enabledelayedexpansion
  3. set totle=0
  4. call :shuchu "" 本目录下
  5. for /f "skip=2 tokens=4" %%a in ('dir *^|find "DIR"') do (
  6. call :shuchu %%a\ %%a子文件夹中
  7. )
  8. echo %~d0%~p0中总共有文本文件%totle%个>>list
  9. ren list list.txt
  10. set n=,m=,totle=
  11. del %0
  12. exit
  13. :shuchu
  14. for /f %%a in ('dir /d %1*.txt^|find "个文件"') do (
  15. set /a totle=%totle%+%%a
  16. echo %2有文本文件%%a个:>>list
  17. )
  18. set "kong=       "&set n=0
  19. for /f %%a in ('dir /b %1*.txt') do (
  20. set /a n+=1&set "str=%%a%kong%"
  21. set /p =!str:~,10! <nul>>list
  22. set /a quyu=!n!%%5
  23. if !quyu! equ 0 echo.>>list
  24. )
  25. echo.>>list
  26. echo.>>list
复制代码

[ 本帖最后由 shqf 于 2008-9-4 22:19 编辑 ]
1

评分人数

TOP

  为什么偏偏是5个一排而不是4个一排呢?要是4个一排的话,dir /w就搞定了^_^。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. set mn=1
  3. for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
  4.      set "str=%%~nxi        "
  5.      set/a n+=1,m=n%%5
  6.      call:lp
  7.      )
  8.      >list.txt echo 本目录下有文本文件!n!个
  9.      for /l %%a in (1 1 %mn%) do if "!%%a!" neq "" >>list.txt echo.!%%a!
  10.           echo.>>list.txt
  11.           set/a nm=mn+1,mn+=1,t+=n,n=0
  12.      for /f "delims=" %%a in ('dir /b /ad') do (
  13.          for /f "delims=" %%i in ('dir /b /a-d "%%a\*.txt"') do (
  14.             set var=%%a
  15.             set "str=%%~nxi        "
  16.             set/a n+=1,m=n%%5
  17.             call:lp
  18.             )
  19.             if defined var (
  20.      >>list.txt echo.!var!子文件夹中有文本文件!n!个:&set var=
  21.      for /l %%b in (!nm! 1 !mn!) do if "!%%b!" neq "" >>list.txt echo.!%%b!
  22.      )
  23.      echo.>>list.txt
  24.      set/a nm=mn+1,mn+=1,t+=n,n=0
  25.      )
  26.      >>list.txt echo %~dp0中总共有文本文件%t%个
  27.       del %0
  28. pause&exit
  29. :lp
  30. if %m% equ 0 (set/a mn+=1&set "%mn%=!%mn%!%str%") else set "%mn%=!%mn%!%str%"
复制代码

精简点
  1. @echo off&setlocal enabledelayedexpansion
  2. set/a mn=1,nm=1&set "var1=%~dp0"
  3. for /f "delims=" %%i in ('dir /s/b *.txt') do (
  4.      set "var=%%~dpi"&set "str=%%~nxi    "
  5.      if "!var!" neq "!var1!" call:lp0
  6.      set/a n+=1,m=n%%5
  7.      call:lp
  8.      )
  9.      call:lp0
  10. >>list.txt echo %~dp0中总共有文本文件%t%个
  11. del %0
  12. pause&exit
  13. :lp
  14. set var1=!var!
  15. if %m% equ 0 (set/a mn+=1&set "%mn%=!%mn%!%str%") else set "%mn%=!%mn%!%str%"
  16. goto:eof
  17. :lp0  
  18. if !nm! equ 1 (>list.txt echo 本目录下有文本文件!n!个) else (
  19.      set var1=!var1:%~dp0=!
  20.      >>list.txt echo !var1:~,-1!子文件夹中有文本文件!n!个)
  21.      for /l %%i in (!nm! 1 !mn!) do if "!%%i!" neq "" >>list.txt echo.!%%i!
  22.      echo.>>list.txt
  23.      set/a nm=mn+1,mn+=1,t+=n,n=0
复制代码

[ 本帖最后由 terse 于 2008-9-5 03:05 编辑 ]
1

评分人数

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. set "space=       "
  3. :lp
  4. for /f "delims=" %%a in ('dir/b %1') do (
  5.      if /i "%%~fsa" neq "%~fs0" if exist "%%a\" (
  6.            call :lp "%%a"
  7.            ) else (
  8.            if /i "%%~xa" equ ".txt" set/a #%~1+=1&set "_%~1=!_%~1!"%%a" "
  9. ))
  10. set/a m=0
  11. (echo %~1目录中有!#%~1!个文本文件:
  12. for %%i in (!_%~1!) do (
  13.      set/a m+=1,mod=m%%5,x+=1
  14.      set "var=%%~i%space%"
  15.      set/p=!var:~,10! <nul
  16.      if !mod! equ 0 echo.
  17. )
  18. echo.&echo.)>>list.txt
  19. if "%~1" equ "" echo %~dp0中共有%x%个文本文件>>list.txt&start list.txt
复制代码
  1. @echo off&setlocal enabledelayedexpansion
  2. set "space=       "
  3. for /r %%a in (*.txt) do (
  4.      set "pat=%%~dpa"&set "pat=!pat:~,-1!"
  5.      for %%i in (!pat!.tmp) do set "_%%~ni=!_%%~ni!"%%~nxa" "&set/a .%%~ni+=1
  6. )
  7. for /f "tokens=1* delims==_" %%a in ('set _') do (
  8.      set m=0
  9.      echo %%a中共有!.%%a!个文本文件:
  10.      for %%i in (%%b) do (
  11.          set "x=%%~i%space%"
  12.          set/a m+=1,mod=m%%5,c+=1
  13.          set/p=!x:~,10! <nul&if !mod! equ 0 echo.
  14.      )
  15.      echo.&echo.
  16. )>>list.txt
  17. echo %~dp0中共有%c%个文本文件>>list.txt
  18. start list.txt
复制代码
  1. @echo off&setlocal enabledelayedexpansion
  2. set "space=       "
  3. for /r %%a in (*.txt) do set ".%%~pa=!.%%~pa!"%%~nxa" "&set/a _%%~pa+=1
  4. for /f "delims==." %%a in ('set .') do (
  5.      set "var=%%a"&set n=0
  6.      echo !var:%~p0=!中有!_%%a!个文本文件:
  7.      for %%i in (!.%%a!) do (
  8.            set "str=%%~i%space%"
  9.            set/a n+=1,mod=n%%5,c+=1
  10.            set/p=!str:~,10! <nul
  11.            if !mod! equ 0 echo.
  12.      )
  13.      echo.&echo.
  14. )>>list.txt
  15. echo %~dp0中共有%c%个文本文件。>>list.txt
  16. start list.txt
复制代码
1

评分人数

    • batman: 居然写出了三个代码PB + 10
心绪平和,眼藏静谧。

TOP

我再来抛下砖吧

  1. @echo off&setlocal enabledelayedexpansion
  2. set "str=本目录"
  3. for /f "delims=" %%i in ('dir /ad /b') do set "str=!str! %%i"
  4. for %%a in (%str%) do (
  5.     if "%%a" equ "本目录" (
  6.        set "p="
  7.        ) else (
  8.        set "p=%%a\"
  9.     )
  10.     set /a m=0,n=0,v=0
  11.     for /f "delims=" %%i in ('dir /b !p!*.txt') do (
  12.         set "var=%%~nxi          "&set /a n+=1,v+=1
  13.         call,set "%%a!m!=%%%%a!m!%%!var:~,10!"
  14.         if !n! equ 5 set /a n=0,m+=1
  15.     )
  16.     set /a num+=v,m-=1  
  17.     echo %%a下有文本文件!v!个:>>list.txt
  18.     for /l %%m in (0,1,!m!) do echo !%%a%%m!>>list.txt
  19.   echo.>>list.txt
  20. )
  21. echo %~dp0下总共有文本文件%num%个>>list.txt
  22. start list.txt&del /q %0
复制代码

[ 本帖最后由 batman 于 2008-9-5 14:42 编辑 ]
***共同提高***

TOP

原帖由 pusofalse 于 2008-9-5 13:52 发表
@echo off&setlocal enabledelayedexpansion
set "space=       "
:lp
for /f "delims=" %%a in ('dir/b %1') do (
     if /i "%%~fsa" neq "%~fs0" if exist "%%a\" (
           call :lp "%%a"
    ...

空行处理不完全正确,有时会多出一空行来。。。
***共同提高***

TOP

&&在我题目的最后我补上了这句话:文本文件名中最多有6个汉字,最少有2个汉字(全是
汉字),可能大家只注意到了“6”,而没有注意“汉字”,对汉字字符进行对齐在字符后补
英文空格" "是不行的,而要补汉字空格" ",shqf和terse兄弟显然是忽视了这点了。

ps:这是道综合性极强的题目,希望大家不要以现有的方案为满足,都来动动手,想一想还有
没有更完美的解决方案!

[ 本帖最后由 batman 于 2008-9-5 14:33 编辑 ]
***共同提高***

TOP

回复 9楼 的帖子

三个代码我这里测试正常,还请BATMAN兄把你的测试结果贴上来,再分析一下。
心绪平和,眼藏静谧。

TOP

原帖由 pusofalse 于 2008-9-5 14:33 发表
三个代码我这里测试正常,还请BATMAN兄把你的测试结果贴上来,再分析一下。

测试结果如下:
  1. 中有5个文本文件:
  2. 本局.txt      电信.txt      水电局.txt     水电站.txt     网吧.txt      
  3. 伏波路\中有12个文本文件:
  4. 王家洲.txt     湾塘.txt      教师新村.txt    国税局.txt     检察院.txt     
  5. 潇湘双语.txt    移动.txt      税务局.txt     教师村.txt     石港路.txt     
  6. 纸厂.txt      桔园.txt      
  7. 南江北路\中有13个文本文件:
  8. 建材小区.txt    交警.txt      交通局.txt     物资局.txt     南江北路.txt    
  9. 接龙桥.txt     农机公司.txt    二五一.txt     铁路.txt      建材.txt      
  10. 渌园路.txt     石油.txt      七六三一八.txt   
  11. 南江南路\中有10个文本文件:
  12. 地税局.txt     杨家山.txt     一医院.txt     育红小学.txt    农业局.txt     
  13. 工商银行.txt    粮食局.txt     东风.txt      南江南路.txt    姚家岭.txt     
  14. 向阳北路\中有15个文本文件:
  15. 农行.txt      城信.txt      信用联社.txt    金丰.txt      卫生局.txt     
  16. 向阳北路.txt    文化路.txt     桑园.txt      台湾村.txt     向阳路.txt     
  17. 开发区.txt     客运公司.txt    黄金西路.txt    黄金东路.txt    卫生.txt      
  18. 向阳南路\中有17个文本文件:
  19. 电力局.txt     向阳小区.txt    劳动局.txt     林业局.txt     水利局.txt     
  20. 烟草.txt      环保局.txt     民政局.txt     畜牧.txt      向阳南路.txt    
  21. 津口路.txt     向阳.txt      津口东路.txt    世纪.txt      武警.txt      
  22. 保险.txt      发展.txt      
  23. 学堂路\中有25个文本文件:
  24. 财政局.txt     县政府.txt     县委.txt      人大.txt      自来水.txt     
  25. 箭台.txt      工商局.txt     法院.txt      建设局.txt     教育局.txt     
  26. 建委.txt      外贸局.txt     派出所.txt     司法局.txt     房产局.txt     
  27. 政府.txt      审计局.txt     商业局.txt     组织.txt      班竹塘.txt     
  28. 学堂路.txt     班竹圹.txt     斑竹塘.txt     津口西路.txt    甘塘坡.txt     
  29. 渌滨路\中有3个文本文件:
  30. 渌滨.txt      伏坡岭.txt     伏波.txt      
  31. 漉浦东路\中有9个文本文件:
  32. 熙园.txt      梅苑.txt      五中.txt      公安局.txt     双月.txt      
  33. 棉织厂.txt     公路局.txt     漉浦东路.txt    黎韶.txt      
  34. 漉浦西路\中有12个文本文件:
  35. 国土.txt      邮政局.txt     火花塞.txt     中医院.txt     湘火炬.txt     
  36. 农业发展银行.txt  火车.txt      菜码头.txt     渌口中学.txt    漉浦路.txt     
  37. 火花.txt      五二六.txt     
  38. E:\文档资料\局域网\批处理\huafe\中共有121个文本文件。
复制代码

有的目录下多出了空行。。。
***共同提高***

TOP

原帖由 batman 于 2008-9-5 14:30 发表
&&在我题目的最后我补上了这句话:文本文件名中最多有6个汉字,最少有2个汉字(全是
汉字),可能大家只注意到了“6”,而没有注意“汉字”,对汉字字符进行对齐在字符后补
英文空格" "是不行的,而要补汉字空格 ...

怎么回事呢?我应该补的就是“    ”  贴上的变化吧
%mn%=!%mn%!%str%
而且我没用截位的  因为无须的

TOP

我补的是汉字空格,本地VISTA下测试通过,好象没错呵。

[ 本帖最后由 shqf 于 2008-9-5 20:39 编辑 ]

TOP

我也来一个
...
  1. @echo off&set /a m=0&del/q list.txt 2>nul
  2. call :loop "%cd%" 本目录
  3. for /f "delims=" %%i in ('dir/b/ad') do call :loop "%%i" "%%~nxi"
  4. start list.txt
  5. del/q "%~0"
  6. :loop
  7. Setlocal Enabledelayedexpansion
  8. for /f "delims=" %%a in ('dir/b "%~1\*.txt"2^>nul') do (
  9.    set /a b+=^^!n,n+=1,n=n%%5,m+=1
  10.    set "str=%%~nxa          "
  11.    call "set var!b!=%%var!b! !str:~0,10!"
  12. )
  13. >>list.txt echo %~2里有!m!个文件
  14. for /l %%l in (1 1 !b!) do >>list.txt echo    !var%%l!
  15. >>list.txt echo\
  16. endlocal&goto :eof
复制代码

[ 本帖最后由 随风 于 2008-9-10 20:27 编辑 ]
技术问题请到论坛发帖求助!

TOP

返回列表