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

[文本处理] [已解决]批处理怎样快速准确的实现按字节添加空格?

我有一个批处理
  1. :startSection
  2. @echo off & setlocal enabledelayedexpansion
  3. cls
  4. set /a item=9
  5. for /r .\ %%c in (*.exe) do (
  6.     set /a item+=1
  7. )
  8. mode con: cols=45 lines=!item!
  9. set "table=0123456789abcdefghijklmnopqrstuvwyz"&set i=0
  10. for /l %%b in (1,1,30) do (set k= !k!)
  11. echo ╔┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉╗
  12. echo ┋ EXE文件选择器,输入字母后请按下回车键  ┋
  13. echo ┋                                        ┋
  14. for /r .\ %%a in (*.exe) do (
  15.         call set a=%%table:~!i!,1%%
  16.             IF %0=="%%a" (
  17.               rem No Operation
  18.             ) ELSE (
  19.               set e!a!="%%a"
  20.               set temp=%%~na%k%
  21.               echo ┋   ^(!a!^)  !temp:~0,30!  ┋
  22.               set /a i+=1
  23.             )
  24. )
  25. set ex=exit/b
  26. echo ┋                                        ┋
  27. echo ┋   (x)  Exit                            ┋
  28. echo ┋            感谢使用本软件(by Sniperhgy)┋
  29. echo ┋                           QQ:754972247 ┋
  30. echo ╚┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉╝
  31. set /p select=Plz choose:
  32. !e%select%!
  33. goto startSection
复制代码

作用是遍历当前目录下的所有exe文件,然后生成菜单,以供调用。
其中为了整齐,用了添加空格的代码(补满30个字符),但是这样
一来,当文件明中有中文时,就会出现不整齐的现象(因为中文是
2个字节,一个字符,不上空格后,就长出来了)
,针对这种情况,请教了高手之后,我对代码作出了修改
  1. :startSection
  2. @echo off & setlocal enabledelayedexpansion
  3. cls
  4. set "table=0123456789abcdefghijklmnopqrstuvwyz"&set i=0
  5. echo ╔┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉╗
  6. echo ┋ EXE文件选择器,输入字母后请按下回车键  ┋
  7. echo ┋                                        ┋
  8. for /r .\ %%a in (*.exe) do (
  9.         call set a=%%table:~!i!,1%%
  10.             IF %0=="%%a" (
  11.               rem No Operation
  12.             ) ELSE (
  13.               set e!a!="%%a"
  14.               for /f "skip=1 delims=:" %%i in ('^(echo."%%~na"^&echo.^)^|findstr /o .') do (
  15.                   set /a Bytes=35-%%i
  16.               )
  17.               for /l %%b in (1,1,!Bytes!) do (set k= !k!)
  18.               set temp=%%~na!k!
  19.               set "k="
  20.               echo ┋   ^(!a!^)  !temp:~0,30!  ┋
  21.               set /a i+=1
  22.             )
  23. )
  24. set ex=exit/b
  25. echo ┋                                        ┋
  26. echo ┋   (x)  Exit                            ┋
  27. echo ┋            感谢使用本软件(by Sniperhgy)┋
  28. echo ┋                           QQ:754972247 ┋
  29. echo ╚┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉╝
  30. set /p select=Plz choose:
  31. !e%select%!
  32. goto startSection
复制代码

现在可以部分解决中文的问题了,但是还是有不少
毛病,最突出的就是效率太低,真是一行一行打出来的
,还有就是如果文件明中有中文且大于35字节,就会出
问题,我想请教知道的朋友,怎样才能提高这段代码的
效率,顺便求一下35字节的解决方法(这个倒是不着急
,大不了都改成35个字节一下就好了,关键就是效率
问题)

[ 本帖最后由 sniperhgy 于 2009-6-27 14:59 编辑 ]
1

评分人数

    • Batcher: 感谢主动给标题标注[已解决]字样PB + 2

对齐文件名,首先必须知道最长的文件名是多少字节,这个是已知条件吗?
好像需要用临时文件才能提高点效率。

[ 本帖最后由 随风 于 2009-6-27 00:28 编辑 ]
技术问题请到论坛发帖求助!

TOP

不用临时文件还真不太好办,关键是要处理子目录里的文件,大家都来讨论讨论。。
技术问题请到论坛发帖求助!

TOP

搞出来了,每行35字节
  1. @echo off
  2. if "%~1"=="h" ((for /r %%a in (*.txt) do echo %%~na)&echo;&exit)
  3. set /a z=35
  4. for /f "delims=" %%a in ('%~s0 h^|findstr /o .*') do (
  5.    for /f "delims=:" %%i in ("%%a") do set /a n=%%i-2-h,h=%%i
  6.    setlocal enabledelayedexpansion
  7.    if defined var (
  8.      set /a jj=z-n&set "k="
  9.      for /l %%i in (1 1 !jj!) do set "k= !k!"
  10.      echo 【!var:*:=!!k!】
  11.     )
  12.    endlocal&set "var=%%a"
  13. )
  14. echo;&pause&exit
复制代码

[ 本帖最后由 随风 于 2009-6-27 01:11 编辑 ]
技术问题请到论坛发帖求助!

TOP

::按楼主要求写的代码,无法处理含!号的文件名。
::第一次会稍微慢点,以后就快了。
:
  1. @echo off
  2. if "%~1"=="h" ((for /r %%a in (*.txt) do echo %%~na)&echo;&exit)
  3. setlocal enabledelayedexpansion
  4. set "table=0123456789abcdefghijklmnopqrstuvwyz"
  5. set "table2=!table!"&set /a z=35
  6. for /r %%a in (*.txt) do (
  7.    set ".!table2:~0,1!=%%a"&set "table2=!table2:~1!"
  8. )
  9. for /f "delims=" %%a in ('%~s0 h^|findstr /o .*') do (
  10.    for /f "delims=:" %%i in ("%%a") do set /a n=%%i-2-h,h=%%i
  11.    if defined var (
  12.      set /a jj=z-n,hh+=1&set "k="
  13.      set "mm=!table:~0,1!"&set "table=!table:~1!"
  14.      for /l %%i in (1 1 !jj!) do set "k= !k!"
  15.      set #!hh!=┋^(!mm!^)  !var:*:=!!k!┋
  16.     )
  17.    set "var=%%a"
  18. )
  19. :loop
  20. echo ╔┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉╗
  21. echo ┋ EXE文件选择器,输入字母后请按下回车键  ┋
  22. echo ┋                                        ┋
  23. for /l %%a in (1 1 !hh!) do echo !#%%a!
  24. echo ┋                                        ┋
  25. echo ┋   (x)  Exit                            ┋
  26. echo ┋            感谢使用本软件(by Sniperhgy)┋
  27. echo ┋                           QQ:754972247 ┋
  28. echo ╚┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉╝
  29. echo;&set num=&set /p num=请输入: &cls
  30. if /i "%num%"=="x" exit
  31. start "" "!.%num%!"
  32. goto loop
复制代码
技术问题请到论坛发帖求助!

TOP

哦,十分感谢随风大哥,一连回了四个帖子,最长的文件名都是35个字节以内的,看了一下,我的水平太有限,一时还难以理解,等我慢慢研究在和随风大哥交流,谢谢了

TOP

返回列表