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

[文本处理] 【已解决】求助批处理输出彩色字符函数讲解?

这是在论坛中的找到的一个输出彩色字符的程序:
-----------------------------------------------------------------------------------------------------------------------------------------
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::彩色字符控制输出{code by [email=Jvive@cn-dos.net]Jvive@cn-dos.net[/email]|2008-4-9}
:Colstr <attr> <sp> <"str"> <bk> <sp> <enter>  
::               |     |     |      |    |     |
::             颜色   空格  字符串   退格  空格 回车换行
::效率:      约18次/s  (XP 5.1/2.4GHz/256M)      
::批文件使用格式:
::       文件名 <attr> <sp> <"str"> <bk> <sp> <enter>
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::说明:
::   attr   16进位数字颜色属性。请参考16进位数字颜色属性配置演示代码。
::   sp     范围:{0,正整数} 表示输出空格的格数
::  "str"   要显示的字符串。注意当字符串中含有空格时带上双引号。
::   bk     范围:{正整数} 退格数,即光标左移位数,若设定左移位数为0,函数将强制转换为1
::   sp     范围:{0,正整数} 0将输出1个冒号,其他正整数表示空格数
::   enter  范围:{0,正整数} 0表示不换行(光标不动),其他正整数表示<enter>个数
::   字符串中可以包含除/\:*?,<>|"字符外的任何字符,但不可以全是“空格”或“.”等。
::   判断字符串是否合法的一个有效的办法是看它是否可以作为文件名来使用
::   请勿试图尝试不合法的参数,函数只保证合法的参数有正确的效果。
::   另外,对某些特殊要求可以尝试用0100色(黑色)字符来“隐藏”冒号
::例:
::call:colstr 0c 3 "abcdef" 1 2 2
::用0c色(鲜红色)依次输出3个空格 abcdef: [光标左移1位] 2个空格 2个回车换行符。
::出处:http://www.cn-dos.net/forum/viewthread.php?tid=38940
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@echo off
::Colstr函数演示。
mode con lines=24 cols=69
set s=I am from www.cn-dos.net

echo\&echo\&echo\&echo\&echo\&echo\&echo/
call:colstr e 15 "%s%" 0 1 0
call:colstr 0100 0 0 17 0 0
title 按任意键继续...&pause>nul
call:colstr a 1 "中国 DOS 联盟" 0 1 0
call:colstr c 0 "%s:~-15%" 0 1 9
pause>nul
call:colstr 2c 21 "谢谢测试!    有bug请吱一声" 0 1 9
title Jvive QQ∶275928264

pause>nul&exit/b
rem /*--------- colstr 函数 -------------
:Colstr <attr> <sp> <"str"> <bk> <sp> <enter>
for %%a in (+%2 +%4 +%5 +%6) do (
   if "%%a"=="+" echo 控制参数不能为空&exit/b
   if %%a lss +0 echo 参数越界-&exit/b
   if %%a geq +a echo 参数越界+&exit/b)
if %3 == "" echo 字符串不能为空&exit/b
pushd %tmp%&setlocal ENABLEEXTENSIONS
if exist "%~3?" del/a/q "%~3?">nul 2>nul
if %2 gtr 0 call:%0_bs %2 sp " "&call set/p=%%sp%%<nul
if %4 gtr 0 (call:%0_bs %4 bk "") else set "bk="
call:%0_bs %5 sp " "
set/p=%bk%%sp%<nul>"%~3"&findstr /a:%1 .* "%~3?" 2>nul
if not %6 equ 0 for /l %%a in (1 1 %6)do echo.
endlocal&popd&goto:eof
:Colstr_bs
set "p="&for /l %%a in (1 1 %1)do call set "p=%%p%%%~3"
set "%2=%p%"&goto:eof

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
其中函数Colstr,我看不太懂,主要是这段for:
for %%a in (+%2 +%4 +%5 +%6) do (
   if "%%a"=="+" echo 控制参数不能为空&exit/b
   if %%a lss +0 echo 参数越界-&exit/b
   if %%a geq +a echo 参数越界+&exit/b)
其中第一个if没问题,要求第2,4,5,6个参数不能为空。第二个if就无法理解了,lss +0的参数不知是什么参数,我把这4个参数设成负的,也不报越界-啊,至于第三个if,我的理解是这4个参数不能写成字母,不知道这样理解对不对。还有下面那个"%~3?"里面怎么是个?号,我昨晚看的是*号,*代表通配符,?号代表一个字符,用?号还是*号在这里有什么区别?
谢谢了!

[ 本帖最后由 lovebatworld 于 2009-3-15 21:02 编辑 ]
1

评分人数

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

回复 1楼 的帖子

lss不是参数,而是比较运算符号。用来比较两个数字或者字符串的大小。具体可以查看帮助:if /?

问号和星号都是通配符,星号表示0个或者多个任意字符,问号表示一个任意字符,本例中如果使用星号,将匹配所有文件,你可以试试把它改成星号代码的效果如何。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

哦,谢谢版主,我知道lss是小于的意思,我想知道判断那4个参数是否小于+0的这个语句是什么意思,我把那4个参数设成-1,结果还是可以正常运行,没有报越界的错误。

TOP

+5 LSS +6 √
因为有符号的除了 “-” 外,是比较其排位。(CMD 中符号排位与 ASSIC 码顺序略有区别)
#3 GTR #4 ×
$3 LEQ @1 √
( NEQ ) √
批处理之家论坛官方 QQ 群 :【当前人数/人数上限】【2009-07-08】
群①:43011867(181/200);群②:(暂缺数据);群③:66165582(120/200)。

TOP

谢谢版主,我去研究下这方面。另外能否帮我讲解一下最后3行
:Colstr_bs
set "p="&for /l %%a in (1 1 %1)do call set "p=%%p%%%~3"
set "%2=%p%"&goto:eof
其中do call set "p=%%p%%%~3"这个好像好复杂啊,do后面为啥加call,p=后面那一堆%%...是什么意思啊,这结构好乱啊

TOP

call set "p=%%p%%%~3"

这样会不会清楚些?
call是为了变量延迟扩展,启用变量延迟扩展后一个百分号应该用两个百分号来代替,预处理时脱去一半,call时再脱去另一半。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

哦,原来如此。
那3个if语句分别用来判断
1,不能为空
2,不能是字母
3,不能是??

至于第三个判断,我找不到dos中的字符排位,google上也搜不到,不知道版主是在哪里找到的,能不能提供点线索呢,我发现这个字符排位可能很有用。

TOP

经过我的试验,排位小于0的是各种符号,排位大于等于a的是字母和汉字。

[ 本帖最后由 lovebatworld 于 2009-3-15 21:01 编辑 ]

TOP

回复 8楼 的帖子

你可以搜索ASCII码
对照一下
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

我想知道 gtr 是什么意思?有好几处地方都用到了这个。看得有些模糊了

TOP

回复 10楼 的帖子

多到教学区看看教程吧
http://bbs.bathome.net/viewthread.php?tid=2530
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

返回列表