Board logo

标题: 【练习-025】批处理按要求对文件进行列表 [打印本页]

作者: batman    时间: 2008-10-1 13:45     标题: 【练习-025】批处理按要求对文件进行列表

出题目的:
  1、温习dir命令
  2、练习文本对齐的方法
加分原则:
  1 思路新颖基分5分
  2 代码高效基分4分
  3 代码简洁基分3分
  4 代码通用基分2分
  5 无临时文件基分1分
  6 完美代码加15分
题目如下:
  某文件夹下有相同的文件若干,其文件名均是由数字、字母、中文混合而成的(文件名中没有特殊字符和空格),现在已知所有的文件名都在10个字符以内,要求用批处理将所有有的文件名进行列表,列表时要求每四个文件名一排且实现文件名左对齐,如下示例:
刘德华move09       十八日议会msge     公众game事业部    北京2008纪实
.................................
中关村bio计划        2004425事件            winxp技术             中学生bbs

[ 本帖最后由 batman 于 2008-10-1 14:39 编辑 ]
作者: 随风    时间: 2008-10-1 13:48

时间不多,先发帖了,为不影响他人思路,先把代码用白色字体帖出来。
代码如下:
  1. @echo off&setlocal enabledelayedexpansion
  2. cd.>c.txt
  3. set var=C:\批处理之家论坛下载_batman原创代码合集
  4. set "var2=a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9"
  5. for /f "delims=" %%a in ('dir/b "%var%"') do (
  6.     set /a x=-1&set "k="
  7.     set "num=%%~na#"
  8.     for %%i in (%var2%) do set num=!num:%%i=%%i !
  9.     for %%i in (!num!) do set /a x+=1
  10.     if "!num:~0,-2!"==" #" set /a x-=1
  11.     for /l %%i in (1 1 !x!) do set "k= !k!"
  12.     set num=!num:~0,-1!
  13.     set "num=!num: =!                "
  14.     set /a n+=1,n=n%%4
  15.     set /p=!num:~0,10!!k!<NUL>>c.txt
  16.     if !n! equ 0 echo.>>c.txt
  17. )
  18. start "" "c.txt"
复制代码


[ 本帖最后由 随风 于 2008-10-1 14:11 编辑 ]
作者: pusofalse    时间: 2008-10-1 16:17

  1. @echo off&setlocal enabledelayedexpansion
  2. for %%i in (test\*) do (
  3.      echo>tmp %%~ni
  4.      for %%a in (tmp) do set/a var=23-%%~za
  5.      set/p=%%~ni <nul
  6.      for /l %%i in (1 1 !var!) do set/p= <nul
  7.      set/a m+=1
  8.      if !m! equ 4 echo.&set m=0
  9. )
  10. del tmp
  11. echo.&pause
复制代码
写代码的时候,遇到一件不解的事情。
全角的()竟然比大写字母Z小,用以下代码便知:
  1. if "(" lss "Z" echo (小于Z。
复制代码
但把“(”或“)”写入文件读取大小时,确实是2字节。
不解中。。。貌似又牵扯到if的比较机制了,疑惑。。。
作者: wxcute    时间: 2008-10-1 17:01

现在的系统好像不区分部分中英文标点、全角半角数字的,会把中文“(”当成英文“(”
(我的是XPSP3,SP2好像也一样)
如:
  1. @echo off
  2. for /l %%i in (1 1 10) do echo %%i
  3. pause
复制代码

第二个1和10都是全角数字,全角1后面的空格也是全角的。
结果正确。
作者: batman    时间: 2008-10-1 17:19     标题: 我的方法一逐字符法(效率上有问题)

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f %%a in ('dir /b test') do (
  3.     set "str=%%~na               "&set /a n+=1,m=n%%4
  4.     set "a=!str!"&call :lp
  5.     if !m! equ 0 echo.
  6. )
  7. pause>nul&goto :eof
  8. :lp
  9. if "%a:~,1%" gtr "z" set /a v+=1
  10. set "a=%a:~1%"
  11. if defined a goto lp
  12. set /a num=15-v
  13. set /p=!str:~,%num%!<nul&set "v=0"
复制代码

[ 本帖最后由 batman 于 2008-10-1 17:23 编辑 ]
作者: pusofalse    时间: 2008-10-1 18:08     标题: 回复 4楼 的帖子

测试同是,环境XP SP2。。。疑惑中。。。
作者: zqz0012005    时间: 2008-10-1 20:39     标题: 逐一字符法判断汉字字符

  1. @echo off
  2. cd.>t~.txt
  3. set /p str=请输入:
  4. :loop
  5. >>t~.txt echo.%str:~,1%
  6. if not "%str:~1%"=="" (set "str=%str:~1%"&goto loop)
  7. >>t~.txt echo.
  8. setlocal enabledelayedexpansion
  9. for /f "tokens=1,2 delims=:" %%a in ('findstr /o .* t~.txt') do (
  10.    set /a n+=1,m=n-1
  11.    set "_!n!=%%a"
  12.    if !n! geq 2 (
  13.       call set /a "len=%%_!n!%%-%%_!m!%%"
  14.       if !len! equ 4 (if defined chr echo !chr!)
  15.    )
  16.    set chr=%%b
  17. )
  18. del t~.txt
  19. echo.&pause
复制代码
if 判别汉字字符的根据似乎既不是国标码,也不是Unicode编码。
作者: terse    时间: 2008-10-1 21:58

我也来个
  1. @echo off&setlocal enabledelayedexpansion
  2. set z=0
  3. for /f "delims=" %%i in ('dir /b /a-d') do (
  4.      set/a n+=1
  5.      set _!n!=%%~ni
  6.      >tem.txt echo %%~ni
  7.      call :lp tem.txt
  8.      )
  9. cd.>tem.txt
  10. for /l %%i in (1 1 %n%) do (
  11.      set/a m=%%i%%4,mn=z-!%%iz!
  12.      for /l %%i in (1 1 !mn!) do set "k=!k! "
  13.      set/p=!_%%i!     !k!<nul >>tem.txt&set k=
  14.      if !m! equ 0 >>tem.txt echo.
  15.      )
  16.      start "" "tem.txt"&exit
  17. :lp
  18. set %n%z=%~z1
  19. if !%n%z! gtr %z% set/a z=!%n%z!
复制代码

作者: 随风    时间: 2008-10-3 10:49

发现逐字判断也不慢
  1. @echo off&setlocal enabledelayedexpansion
  2. set /a s=4&cd.>c.txt
  3. set "code= 0123456789abcdefghijklmnopqrstuvwxyz"
  4. for /l %%i in (0 1 36) do set num.!code:~%%i,1!#=a
  5. for /f "delims=" %%a in ('dir/b/a-d "tmp"') do (
  6.    set k=&set /a n=0&set "str=%%~na"
  7.    for /l %%a in (0 1 10) do (
  8.       if not ""=="!str:~%%a,1!" (
  9.          set "var=!str:~%%a,1!"
  10.          if defined num.!var!# set /a n+=1
  11.     ))
  12.     for /l %%i in (1 1 !n!) do set "k= !k!"
  13.     set "str=!str!                "
  14.     set /a m=m%%4+1
  15.     (set /p=!str:~,10!!k!<nul&if !m! equ !s! echo.)>>c.txt
  16. )
  17. start c.txt
复制代码

作者: keen    时间: 2009-5-20 13:55

用了三个for:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f %%i in ('dir /b') do (
  3.     set str=%%~ni&set /a n+=1&set "space="
  4.     for /f "skip=1 delims=:" %%j in ('^(echo !str!^&echo.^)^|findstr /o .*') do set b=%%j
  5.     set /a c=21-!b!
  6.     for /l %%k in (1 1 !c!) do set "space=!space! "
  7.     set "str=!str!!space!"&set /p=!str!<nul
  8.     set /a var=!n!%%4
  9.     if !var!==0 echo\
  10. )
  11. pause>nul
复制代码

作者: netbenton    时间: 2009-5-20 19:58

  1. @echo off&setlocal enabledelayedexpansion
  2. if not "%1"=="##" goto :next
  3. for /f "delims=." %%i in ('dir /b') do (echo %%i)
  4. goto :eof
  5. :next
  6. set "spac=                         "
  7. set/a n=1,ap=0,bp=0
  8. set str=
  9. for /f "tokens=1,2 delims=:" %%a in ('%0 ##^|findstr /o .*') do (
  10.         set/a ap=19-%%a+bp+2,bp=%%a
  11.         if defined nul (
  12.                 for %%c in (!ap!) do (
  13.                         set str=!str!!ec!!spac:~0,%%c!
  14.                 )
  15.                 set/a n=n%%4+1
  16.                 if !n! equ 1 echo !str!&set str=
  17.         ) else (set nul=y)
  18.         set ec=%%b
  19. )
  20. if defined str echo !str!
  21. pause
复制代码

作者: zhouyongjun    时间: 2009-6-16 10:52

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1,2 delims=:" %%a in ('dir/b/a-d^|findstr/o ".*"') do (
  3.     set/a n+=1,mod=n%%4,num=20-%%a+b
  4.     if !mod! equ 1 (<nul set/p=%%~nb) else (
  5.         for /l %%c in (1,1,!num!) do set/p= <nul
  6.         <nul set/p=%%~nb
  7.     )
  8.     set "c=%%~xb9876543210"&set c=!c:~9,1!
  9.     set/a b=%%a+c
  10.     if !mod! equ 0 echo/
  11. )
  12. echo/&pause>nul
复制代码

作者: tab    时间: 2009-6-16 14:27

  1. @dir/b /a-d|sed -e :a -e "s/^.\{1,10\}$/& /;ta"|sed "N;s/\n/\t/;N;s/\n/\t/;N;s/\n/\t/"|more>r.txt&start r.txt
复制代码





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