标题: 【练习-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
时间不多,先发帖了,为不影响他人思路,先把代码用白色字体帖出来。
代码如下:
- @echo off&setlocal enabledelayedexpansion
- cd.>c.txt
- set var=C:\批处理之家论坛下载_batman原创代码合集
- 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"
- for /f "delims=" %%a in ('dir/b "%var%"') do (
- set /a x=-1&set "k="
- set "num=%%~na#"
- for %%i in (%var2%) do set num=!num:%%i=%%i !
- for %%i in (!num!) do set /a x+=1
- if "!num:~0,-2!"==" #" set /a x-=1
- for /l %%i in (1 1 !x!) do set "k= !k!"
- set num=!num:~0,-1!
- set "num=!num: =! "
- set /a n+=1,n=n%%4
- set /p=!num:~0,10!!k!<NUL>>c.txt
- if !n! equ 0 echo.>>c.txt
- )
- start "" "c.txt"
复制代码
[ 本帖最后由 随风 于 2008-10-1 14:11 编辑 ]
作者: pusofalse 时间: 2008-10-1 16:17
- @echo off&setlocal enabledelayedexpansion
- for %%i in (test\*) do (
- echo>tmp %%~ni
- for %%a in (tmp) do set/a var=23-%%~za
- set/p=%%~ni <nul
- for /l %%i in (1 1 !var!) do set/p= <nul
- set/a m+=1
- if !m! equ 4 echo.&set m=0
- )
- del tmp
- echo.&pause
复制代码
写代码的时候,遇到一件不解的事情。
全角的()竟然比大写字母Z小,用以下代码便知:- if "(" lss "Z" echo (小于Z。
复制代码
但把“(”或“)”写入文件读取大小时,确实是2字节。
不解中。。。貌似又牵扯到if的比较机制了,疑惑。。。
作者: wxcute 时间: 2008-10-1 17:01
现在的系统好像不区分部分中英文标点、全角半角数字的,会把中文“(”当成英文“(”
(我的是XPSP3,SP2好像也一样)
如:
- @echo off
- for /l %%i in (1 1 10) do echo %%i
- pause
复制代码
第二个1和10都是全角数字,全角1后面的空格也是全角的。
结果正确。
作者: batman 时间: 2008-10-1 17:19 标题: 我的方法一逐字符法(效率上有问题)
- @echo off&setlocal enabledelayedexpansion
- for /f %%a in ('dir /b test') do (
- set "str=%%~na "&set /a n+=1,m=n%%4
- set "a=!str!"&call :lp
- if !m! equ 0 echo.
- )
- pause>nul&goto :eof
- :lp
- if "%a:~,1%" gtr "z" set /a v+=1
- set "a=%a:~1%"
- if defined a goto lp
- set /a num=15-v
- 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 标题: 逐一字符法判断汉字字符
- @echo off
- cd.>t~.txt
- set /p str=请输入:
- :loop
- >>t~.txt echo.%str:~,1%
- if not "%str:~1%"=="" (set "str=%str:~1%"&goto loop)
- >>t~.txt echo.
- setlocal enabledelayedexpansion
- for /f "tokens=1,2 delims=:" %%a in ('findstr /o .* t~.txt') do (
- set /a n+=1,m=n-1
- set "_!n!=%%a"
- if !n! geq 2 (
- call set /a "len=%%_!n!%%-%%_!m!%%"
- if !len! equ 4 (if defined chr echo !chr!)
- )
- set chr=%%b
- )
- del t~.txt
- echo.&pause
复制代码
if 判别汉字字符的根据似乎既不是国标码,也不是Unicode编码。
作者: terse 时间: 2008-10-1 21:58
我也来个- @echo off&setlocal enabledelayedexpansion
- set z=0
- for /f "delims=" %%i in ('dir /b /a-d') do (
- set/a n+=1
- set _!n!=%%~ni
- >tem.txt echo %%~ni
- call :lp tem.txt
- )
- cd.>tem.txt
- for /l %%i in (1 1 %n%) do (
- set/a m=%%i%%4,mn=z-!%%iz!
- for /l %%i in (1 1 !mn!) do set "k=!k! "
- set/p=!_%%i! !k!<nul >>tem.txt&set k=
- if !m! equ 0 >>tem.txt echo.
- )
- start "" "tem.txt"&exit
- :lp
- set %n%z=%~z1
- if !%n%z! gtr %z% set/a z=!%n%z!
复制代码
作者: 随风 时间: 2008-10-3 10:49
发现逐字判断也不慢- @echo off&setlocal enabledelayedexpansion
- set /a s=4&cd.>c.txt
- set "code= 0123456789abcdefghijklmnopqrstuvwxyz"
- for /l %%i in (0 1 36) do set num.!code:~%%i,1!#=a
- for /f "delims=" %%a in ('dir/b/a-d "tmp"') do (
- set k=&set /a n=0&set "str=%%~na"
- for /l %%a in (0 1 10) do (
- if not ""=="!str:~%%a,1!" (
- set "var=!str:~%%a,1!"
- if defined num.!var!# set /a n+=1
- ))
- for /l %%i in (1 1 !n!) do set "k= !k!"
- set "str=!str! "
- set /a m=m%%4+1
- (set /p=!str:~,10!!k!<nul&if !m! equ !s! echo.)>>c.txt
- )
- start c.txt
复制代码
作者: keen 时间: 2009-5-20 13:55
用了三个for:
- @echo off&setlocal enabledelayedexpansion
- for /f %%i in ('dir /b') do (
- set str=%%~ni&set /a n+=1&set "space="
- for /f "skip=1 delims=:" %%j in ('^(echo !str!^&echo.^)^|findstr /o .*') do set b=%%j
- set /a c=21-!b!
- for /l %%k in (1 1 !c!) do set "space=!space! "
- set "str=!str!!space!"&set /p=!str!<nul
- set /a var=!n!%%4
- if !var!==0 echo\
- )
- pause>nul
复制代码
作者: netbenton 时间: 2009-5-20 19:58
- @echo off&setlocal enabledelayedexpansion
- if not "%1"=="##" goto :next
- for /f "delims=." %%i in ('dir /b') do (echo %%i)
- goto :eof
- :next
- set "spac= "
- set/a n=1,ap=0,bp=0
- set str=
- for /f "tokens=1,2 delims=:" %%a in ('%0 ##^|findstr /o .*') do (
- set/a ap=19-%%a+bp+2,bp=%%a
- if defined nul (
- for %%c in (!ap!) do (
- set str=!str!!ec!!spac:~0,%%c!
- )
- set/a n=n%%4+1
- if !n! equ 1 echo !str!&set str=
- ) else (set nul=y)
- set ec=%%b
- )
- if defined str echo !str!
- pause
复制代码
作者: zhouyongjun 时间: 2009-6-16 10:52
- @echo off&setlocal enabledelayedexpansion
- for /f "tokens=1,2 delims=:" %%a in ('dir/b/a-d^|findstr/o ".*"') do (
- set/a n+=1,mod=n%%4,num=20-%%a+b
- if !mod! equ 1 (<nul set/p=%%~nb) else (
- for /l %%c in (1,1,!num!) do set/p= <nul
- <nul set/p=%%~nb
- )
- set "c=%%~xb9876543210"&set c=!c:~9,1!
- set/a b=%%a+c
- if !mod! equ 0 echo/
- )
- echo/&pause>nul
复制代码
作者: tab 时间: 2009-6-16 14:27
- @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://www.bathome.net/) |
Powered by Discuz! 7.2 |