标题: [文本处理] [已解决]批处理怎样快速准确的实现按字节添加空格? [打印本页]
作者: sniperhgy 时间: 2009-6-27 00:16 标题: [已解决]批处理怎样快速准确的实现按字节添加空格?
我有一个批处理
- :startSection
- @echo off & setlocal enabledelayedexpansion
- cls
- set /a item=9
- for /r .\ %%c in (*.exe) do (
- set /a item+=1
- )
- mode con: cols=45 lines=!item!
- set "table=0123456789abcdefghijklmnopqrstuvwyz"&set i=0
- for /l %%b in (1,1,30) do (set k= !k!)
- echo ╔┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉╗
- echo ┋ EXE文件选择器,输入字母后请按下回车键 ┋
- echo ┋ ┋
- for /r .\ %%a in (*.exe) do (
- call set a=%%table:~!i!,1%%
- IF %0=="%%a" (
- rem No Operation
- ) ELSE (
- set e!a!="%%a"
- set temp=%%~na%k%
- echo ┋ ^(!a!^) !temp:~0,30! ┋
- set /a i+=1
- )
- )
- set ex=exit/b
- echo ┋ ┋
- echo ┋ (x) Exit ┋
- echo ┋ 感谢使用本软件(by Sniperhgy)┋
- echo ┋ QQ:754972247 ┋
- echo ╚┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉╝
- set /p select=Plz choose:
- !e%select%!
- goto startSection
复制代码
作用是遍历当前目录下的所有exe文件,然后生成菜单,以供调用。
其中为了整齐,用了添加空格的代码(补满30个字符),但是这样
一来,当文件明中有中文时,就会出现不整齐的现象(因为中文是
2个字节,一个字符,不上空格后,就长出来了)
,针对这种情况,请教了高手之后,我对代码作出了修改
- :startSection
- @echo off & setlocal enabledelayedexpansion
- cls
- set "table=0123456789abcdefghijklmnopqrstuvwyz"&set i=0
- echo ╔┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉╗
- echo ┋ EXE文件选择器,输入字母后请按下回车键 ┋
- echo ┋ ┋
- for /r .\ %%a in (*.exe) do (
- call set a=%%table:~!i!,1%%
- IF %0=="%%a" (
- rem No Operation
- ) ELSE (
- set e!a!="%%a"
- for /f "skip=1 delims=:" %%i in ('^(echo."%%~na"^&echo.^)^|findstr /o .') do (
- set /a Bytes=35-%%i
- )
- for /l %%b in (1,1,!Bytes!) do (set k= !k!)
- set temp=%%~na!k!
- set "k="
- echo ┋ ^(!a!^) !temp:~0,30! ┋
- set /a i+=1
- )
- )
- set ex=exit/b
- echo ┋ ┋
- echo ┋ (x) Exit ┋
- echo ┋ 感谢使用本软件(by Sniperhgy)┋
- echo ┋ QQ:754972247 ┋
- echo ╚┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉╝
- set /p select=Plz choose:
- !e%select%!
- goto startSection
复制代码
现在可以部分解决中文的问题了,但是还是有不少
毛病,最突出的就是效率太低,真是一行一行打出来的
,还有就是如果文件明中有中文且大于35字节,就会出
问题,我想请教知道的朋友,怎样才能提高这段代码的
效率,顺便求一下35字节的解决方法(这个倒是不着急
,大不了都改成35个字节一下就好了,关键就是效率
问题)
[ 本帖最后由 sniperhgy 于 2009-6-27 14:59 编辑 ]
作者: 随风 时间: 2009-6-27 00:27
对齐文件名,首先必须知道最长的文件名是多少字节,这个是已知条件吗?
好像需要用临时文件才能提高点效率。
[ 本帖最后由 随风 于 2009-6-27 00:28 编辑 ]
作者: 随风 时间: 2009-6-27 00:45
不用临时文件还真不太好办,关键是要处理子目录里的文件,大家都来讨论讨论。。
作者: 随风 时间: 2009-6-27 01:02
搞出来了,每行35字节- @echo off
- if "%~1"=="h" ((for /r %%a in (*.txt) do echo %%~na)&echo;&exit)
- set /a z=35
- for /f "delims=" %%a in ('%~s0 h^|findstr /o .*') do (
- for /f "delims=:" %%i in ("%%a") do set /a n=%%i-2-h,h=%%i
- setlocal enabledelayedexpansion
- if defined var (
- set /a jj=z-n&set "k="
- for /l %%i in (1 1 !jj!) do set "k= !k!"
- echo 【!var:*:=!!k!】
- )
- endlocal&set "var=%%a"
- )
- echo;&pause&exit
复制代码
[ 本帖最后由 随风 于 2009-6-27 01:11 编辑 ]
作者: 随风 时间: 2009-6-27 02:23
::按楼主要求写的代码,无法处理含!号的文件名。
::第一次会稍微慢点,以后就快了。
:- @echo off
- if "%~1"=="h" ((for /r %%a in (*.txt) do echo %%~na)&echo;&exit)
- setlocal enabledelayedexpansion
- set "table=0123456789abcdefghijklmnopqrstuvwyz"
- set "table2=!table!"&set /a z=35
- for /r %%a in (*.txt) do (
- set ".!table2:~0,1!=%%a"&set "table2=!table2:~1!"
- )
- for /f "delims=" %%a in ('%~s0 h^|findstr /o .*') do (
- for /f "delims=:" %%i in ("%%a") do set /a n=%%i-2-h,h=%%i
- if defined var (
- set /a jj=z-n,hh+=1&set "k="
- set "mm=!table:~0,1!"&set "table=!table:~1!"
- for /l %%i in (1 1 !jj!) do set "k= !k!"
- set #!hh!=┋^(!mm!^) !var:*:=!!k!┋
- )
- set "var=%%a"
- )
- :loop
- echo ╔┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉╗
- echo ┋ EXE文件选择器,输入字母后请按下回车键 ┋
- echo ┋ ┋
- for /l %%a in (1 1 !hh!) do echo !#%%a!
- echo ┋ ┋
- echo ┋ (x) Exit ┋
- echo ┋ 感谢使用本软件(by Sniperhgy)┋
- echo ┋ QQ:754972247 ┋
- echo ╚┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉╝
- echo;&set num=&set /p num=请输入: &cls
- if /i "%num%"=="x" exit
- start "" "!.%num%!"
- goto loop
复制代码
作者: sniperhgy 时间: 2009-6-27 14:59
哦,十分感谢随风大哥,一连回了四个帖子,最长的文件名都是35个字节以内的,看了一下,我的水平太有限,一时还难以理解,等我慢慢研究在和随风大哥交流,谢谢了
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |