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

TOP

回复 16楼 的帖子

正是,不然批是达不到这种智能程度。
***共同提高***

TOP

用的临时文件
  1. @echo off&setlocal enabledelayedexpansion
  2. set k1=tab&set k2= &set "k3= "
  3. if "%k1%"=="tab" echo 上面这里set k1=tab设置成TAB键&pause&exit
  4. (for /f "tokens=1* delims=:" %%a in ('findstr /n .* a.txt') do (
  5.    if "%%b"=="" (
  6.        set "bk=  "
  7.        if defined var (echo;&echo;)else echo;
  8.        for %%b in (~tem.txt) do set/a n=%%~zb+60
  9.     ) else (
  10.        for /f "tokens=* delims=%k1%%k2%%k3%" %%i in ("%%b") do (
  11.        if defined n (set var=!bk!%%i&set "bk=")else set n=60&set var=!k2!!k2!%%i
  12.    )
  13.        >"%temp%\tem~.tem" echo !var!
  14.        for %%b in ("%temp%\tem~.tem") do set/a m=%%~zb-2
  15.        for /l %%i in (0 1 !m!) do (
  16.        if "!var:~%%i,1!" neq "" (
  17.        for %%b in (~tem.txt) do if %%~zb lss !n! (set/p=!var:~%%i,1!<nul)else (
  18.            echo;&set/p=!var:~%%i,1!<nul
  19.            set/a n=%%~zb+62
  20. ))))))>~tem.txt
  21. del "%temp%\tem~.tem"
  22. pause
复制代码
1

评分人数

    • batman: 代码可读性要加强PB + 15

TOP

一个for内解决问题,
  1. @echo off&setlocal enabledelayedexpansion
  2. set "tab=        "
  3. for /f "tokens=1* delims=:" %%a in ('findstr /o .* a.txt') do (
  4.         if "%%b" equ "" (echo;) else (
  5.                 for /f "tokens=* delims= %tab% " %%c in ("%%b") do (set str=%%c)
  6.                         set/a a=8180,c=0&for /l %%a in (1,1,14) do (
  7.                             set/a "b=(a-c)/2+c"&for %%b in (!b!) do if "!str:~%%b,1!" equ "" (set/a a=b) else (set/a c=b)
  8.                         )&rem 此段字符长度计算用到 随风 的折半法
  9.                         set n=4
  10.                         set "ec=    "
  11.                         for /l %%a in (0,1,!a!) do (set "one=!str:~%%a,1!"
  12.                             set ec=!ec!!one!
  13.                             if "!one!" geq "z" (set /a n+=2) else (set /a n+=1)
  14.                             if !n! geq 60 echo;!ec!&set ec=&set n=0
  15.                         )
  16.                         echo;!ec!
  17.         )
  18. )
  19. pause
复制代码

[ 本帖最后由 netbenton 于 2009-8-12 22:58 编辑 ]
1

评分人数

    • batman: 效率高,思路决定出路啊!PB + 15

TOP

帮楼上的顶起来~

TOP

回复 20楼 的帖子

代码还是存在一点问题,如出下以下文本时,代码会出错:
  1.         古人日:读书有三到,眼到、口到、心到。而我们
  2. 学习批处理则讲究四多:多看、多问、多想、
  3. 多练。那么这四多又分别是什么意思呢?
  4.     所谓多看就是多看看学习资料如教程,多看看别人写好的代码。。。
复制代码
上面的三行处理后应该是一句,而经20楼的代码处理后就成了三句,当然在现实中一般不会有这样的文字书写形式出现。
***共同提高***

TOP

已经解决21楼说的问题
  1. @echo off&setlocal enabledelayedexpansion
  2. set "tab= "
  3. for /f "tokens=1* delims=:" %%a in ('findstr /o .* a.txt^&echo;') do (rem 加个echo;最后补一行空行
  4. if "%%b" neq "" (set "str=!str!%%b") else (if defined str (rem 遇到空行并且段落不为空才分析
  5.          for /f "tokens=* delims= %tab% " %%c in ("!str!") do (set str=%%c)
  6.    set/a a=8180,c=0&for /l %%a in (1,1,14) do (
  7.        set/a "b=(a-c)/2+c"&for %%b in (!b!) do if "!str:~%%b,1!" equ "" (set/a a=b) else (set/a c=b)
  8.    )&rem 此段字符长度计算用到 随风 的折半法
  9.    set n=4
  10.    set "ec=    "
  11.    for /l %%a in (0,1,!a!) do (set "one=!str:~%%a,1!"&rem 根所段落长度来逐字判断
  12.        set ec=!ec!!one!
  13.        if "!one!" geq "z" (set /a n+=2) else (set /a n+=1)
  14.        if !n! geq 60 echo;!ec!&set ec=&set n=0
  15.    )
  16.    if defined ec echo;!ec!&rem 根据最后一节是否为空,在段落间加入空行,
  17.    echo;&set str=
  18. ))
  19. )
  20. pause
复制代码

[ 本帖最后由 netbenton 于 2009-8-14 08:03 编辑 ]

TOP

临到考虑特殊字符的时候了。
使用了临时文件,且鉴于tab制表符的特殊性,将其替换成了一个空格。
  1. @echo off
  2. if "%~1" neq "" goto LTrimInit
  3. for /f "eol= tokens=* delims=  " %%a in ('"%~f0" LTrimInit') do (
  4.     if "%%a"=="" (echo;) else (
  5.         set "var=  %%a"
  6.         set /p="  %%a"<nul>"%temp%\~line.tmp"
  7.         for %%i in ("%temp%\~line.tmp") do (
  8.             if %%~zi gtr 60 (set size=%%~zi&call :split) else echo=  %%a
  9.         )
  10.     )
  11.     del "%temp%\~line*.tmp" >nul 2>nul
  12. )
  13. pause&exit/b
  14. :LTrimInit
  15. set "tab= "
  16. for /f "delims=" %%a in ('findstr /n .* a.txt') do (
  17.     set var=%%a
  18.     setlocal enableDelayedExpansion
  19.     set var=!var:%tab%= !
  20.     set var=!var:*:= !
  21.     echo=!var!
  22.     endlocal
  23. )
  24. goto :eof
  25. :split
  26. set offset=0
  27. setlocal enableDelayedExpansion
  28. fsutil file createnew "%temp%\~line2.tmp" !size! >nul
  29. for /f "tokens=2 delims=: " %%a in ('fc /b "%temp%\~line.tmp" "%temp%\~line2.tmp" ^| more +1') do (
  30.     set /a n+=1, n%%=60
  31.     if 0x%%a geq 128 (set /a byte+=1) else set /a byte+=2
  32.     if !n!==0 (
  33.         if 0x%%a geq 128 (
  34.             if 0x!prev! lss 128 (set /a "len=(byte-1)>>1", byte=1, n=1) else set /a "len=byte>>1", byte=0
  35.         ) else (
  36.            set /a "len=byte>>1", byte=0
  37.         )
  38.         for /f "tokens=1,2" %%i in ("!offset! !len!") do echo=!var:~%%i,%%j!
  39.         set /a offset+=len
  40.     )
  41.     set prev=%%a
  42. )
  43. if %n% neq 0 echo=!var:~%offset%!
  44. goto :eof
复制代码
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

先重定向30个字符~ 然后再循环,但感觉效率不是高,没有继续
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. err>result.x 2>nul
  4. for /f "tokens=*" %%a in (text.txt) do (
  5. set a=%%a
  6. call :next
  7. )
  8. pause
  9. exit
  10. :next
  11. set /p x=%a:~0,30%>temp.x<nul
  12. set a=%a:~30%
  13.    :innext
  14.     for /f "tokens=3" %%a in ('dir temp.x /-c ^|find "个文件"') do (set num=%%a)
  15.     if %num% lss 60 (if not "%a%"=="" (
  16.     set /p x=%a:~0,1%>>temp.x<nul
  17.     set a=!a:~1!
  18.     goto :innext
  19.     ))
  20. type temp.x>>result.x
  21. echo,>>result.x
  22. if not "%a%"=="" (goto :next)
  23. goto :eof
复制代码

[ 本帖最后由 523066680 于 2009-8-16 22:08 编辑 ]

TOP

支持特殊字符的 用了fsutil
  1. @echo off
  2. err>result.x 2>nul
  3. set /a x=0
  4. for /f "delims= eol=#" %%a in (text.txt) do (
  5.    set /a x+=1
  6.    set /a seta=0,setb=80
  7.    echo,    %%a>x.x
  8.    call :func
  9. )
  10. start result.x
  11. pause
  12. exit
  13. :func
  14.    echo,Sentence%x%
  15.    type x.x>temp.x
  16.    fsutil file setzerodata offset=0 length=%seta% temp.x     >nul
  17.    fsutil file setzerodata offset=%setb% length=10000 temp.x >nul
  18.    (for /f "delims= eol=#" %%c in ('more temp.x') do (echo,%%c>temp.x))||goto :eof
  19.    for /f "tokens=3" %%a in ('dir temp.x /-c ^|find "个文件"') do (set num=%%a)
  20.    set /a seta=seta+num-2,setb=seta+80 &type temp.x>>result.x &goto :func
  21. goto :eof
复制代码
处理的文本名称为 text.txt 下面是增加了字符串  "!!%%! !test!  的示例
3、接下来,你试着回答我一个问题批处理中最常用最复杂也是最强大的命令是哪个命令?

    相信经过以上两次的训练,你会脱口而出“for”。是的,for命令的确是批处理中最重要的命令,学好它的意义是不容置疑的。管理员就此命令特为大家精心撰写了for命令从入门到精通一贴,你所要做的就是前前后后将此贴通遍,将其搞懂弄明白,并结合大量的for命令练习,以熟练掌握for命令的各种应用。

                    至此,我可以说你已经脱菜了。但是不是掌握了for命令就可以“天下无敌,无坚不摧了呢”?非也,接下来,你还要继续提升自己。"!!%%! !test!


结果
    3、接下来,你试着回答我一个问题批处理中最常用最复杂也是最强大的命令是哪个命
令?
        相信经过以上两次的训练,你会脱口而出“for”。是的,for命令的确是批处
理中最重要的命令,学好它的意义是不容置疑的。管理员就此命令特为大家精心撰写了for
命令从入门到精通一贴,你所要做的就是前前后后将此贴通遍,将其搞懂弄明白,并结合大
量的for命令练习,以熟练掌握for命令的各种应用。
                        至此,我可以说你已经脱菜了。但是不是
掌握了for命令就可以“天下无敌,无坚不摧了呢”?非也,接下来,你还要继续提升自己
。"!!%%! !test!


[ 本帖最后由 PakTC 于 2009-8-18 16:38 编辑 ]
Press Any Key To Continue...

TOP

回复 23楼 的帖子

  1. @echo off
  2. del "%temp%\~line*.tmp" >nul 2>nul
  3. if "%~1" neq "" goto LTrimInit
  4. for /f "eol= tokens=* delims=  " %%a in ('"%~f0" LTrimInit') do (
  5.     if "%%a"=="" (
  6.         for %%i in ("%temp%\~line.tmp") do (
  7.             for /f "usebackq delims=" %%A in (%%i) do if %%~zi gtr 60 (
  8.                 set var=%%A
  9.                 set size=%%~zi
  10.                 call :split
  11.             ) else (del "%temp%\~line.tmp" & echo=%%A)
  12.         )
  13.         echo;
  14.     ) else (
  15.         if not exist "%temp%\~line.tmp" (set /p="  %%a"<nul>>"%temp%\~line.tmp"
  16.         ) else set /p= %%a<nul>>"%temp%\~line.tmp"
  17.     )
  18. )
  19. rem 最后一段后面没有空行的情况
  20. if exist "%temp%\~line*.tmp" (
  21.     for %%i in ("%temp%\~line.tmp") do (
  22.         if %%~zi gtr 60 (
  23.             set size=%%~zi
  24.             for /f "usebackq delims=" %%A in (%%i) do set var=%%A
  25.             call :split
  26.         ) else echo=  %%a
  27.     )
  28. )
  29. pause&exit/b
  30. :LTrimInit
  31. set "tab=        "
  32. for /f "delims=" %%a in ('findstr /n .* a.bat') do (
  33.     set var=%%a
  34.     setlocal enableDelayedExpansion
  35.     set var=!var:%tab%= !
  36.     set var=!var:*:= !
  37.     echo=!var!
  38.     endlocal
  39. )
  40. goto :eof
  41. :split
  42. set offset=0
  43. setlocal enableDelayedExpansion
  44. fsutil file createnew "%temp%\~line2.tmp" !size! >nul
  45. for /f "tokens=2 delims=: " %%a in ('fc /b "%temp%\~line.tmp" "%temp%\~line2.tmp" ^| more +1') do (
  46.     set /a n+=1, n%%=60
  47.     if 0x%%a geq 128 (set /a byte+=1) else set /a byte+=2
  48.     if !n!==0 (
  49.         if 0x%%a geq 128 (
  50.             if 0x!prev! lss 128 (set /a "len=(byte-1)>>1", byte=1, n=1) else set /a "len=byte>>1", byte=0
  51.         ) else (
  52.            set /a "len=byte>>1", byte=0
  53.         )
  54.         for /f "tokens=1,2" %%i in ("!offset! !len!") do echo=!var:~%%i,%%j!
  55.         set /a offset+=len
  56.     )
  57.     set prev=%%a
  58. )
  59. if %n% neq 0 echo=!var:~%offset%!
  60. del "%temp%\~line*.tmp"
  61. goto :eof
复制代码
针对题目新要求做了改动,还需要完善。

[ 本帖最后由 zqz0012005 于 2009-8-18 22:50 编辑 ]
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

返回列表