返回列表 发帖

【练习-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 编辑 ]
***共同提高***

时间不多,先发帖了,为不影响他人思路,先把代码用白色字体帖出来。
代码如下:
@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"COPY


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

TOP

@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.&pauseCOPY
写代码的时候,遇到一件不解的事情。
全角的()竟然比大写字母Z小,用以下代码便知:
if "(" lss "Z" echo (小于Z。 COPY
但把“(”或“)”写入文件读取大小时,确实是2字节。
不解中。。。貌似又牵扯到if的比较机制了,疑惑。。。
1

评分人数

    • batman: 方法独特,思路新颖PB + 14
心绪平和,眼藏静谧。

TOP

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

第二个1和10都是全角数字,全角1后面的空格也是全角的。
结果正确。

TOP

我的方法一逐字符法(效率上有问题)

@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" COPY

[ 本帖最后由 batman 于 2008-10-1 17:23 编辑 ]
***共同提高***

TOP

回复 4楼 的帖子

测试同是,环境XP SP2。。。疑惑中。。。
心绪平和,眼藏静谧。

TOP

逐一字符法判断汉字字符

@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.&pauseCOPY
if 判别汉字字符的根据似乎既不是国标码,也不是Unicode编码。
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

我也来个
@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!COPY
1

评分人数

TOP

发现逐字判断也不慢
@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.txtCOPY
技术问题请到论坛发帖求助!

TOP

用了三个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>nulCOPY
(*^_^*)

TOP

@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!
pauseCOPY

TOP

@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>nulCOPY

TOP

@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.txtCOPY

TOP

返回列表