Board logo

标题: 【原创】colstr函数---单行输出彩色字符 [打印本页]

作者: jvive     时间: 2008-3-31 21:40    标题: 【原创】colstr函数---单行输出彩色字符

原帖已成古董,
点此下载

更新帖点此:(2楼)

http://www.cn-dos.net/forum/viewthread.php?tid=39777&fpage=1

可以处理除了双引号外的任何字符

[ Last edited by jvive on 2009-4-24 at 05:52 ]
作者: qwd     时间: 2008-3-31 22:07    标题: 刚写的中国象棋正好需要这个!

顶!
作者: zh159     时间: 2008-3-31 23:07
利用findstr /a:参数来输出彩色字符不错
作者: niao22     时间: 2008-3-31 23:25
才搞明白FINDSTR的用法

在文件中寻找字符串。

FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/F:file]
        [/C:string] [/G:file] [/D:dir list] [/A:color attributes] [/OFF[LINE]]
        strings [[drive:][path]filename[ ...]]

  /B        在一行的开始配对模式。
  /E        在一行的结尾配对模式。
  /L        按字使用搜索字符串。
  /R        将搜索字符串作为一般表达式使用。
  /S        在当前目录和所有子目录中搜索
              匹配文件。
  /I         指定搜索不分大小写。
  /X        打印完全匹配的行。
  /V        只打印不包含匹配的行。
  /N        在匹配的每行前打印行数。
  /M        如果文件含有匹配项,只打印其文件名。
  /O        在每个匹配行前打印字符偏移量。
  /P        忽略有不可打印字符的文件。  
  /OFF[LINE] 不跳过带有脱机属性集的文件。
  /A:attr   指定有十六进位数字的颜色属性。请见 "color /?"
  /F:file   从指定文件读文件列表 (/ 代表控制台)。
  /C:string 使用指定字符串作为文字搜索字符串。
  /G:file   从指定的文件获得搜索字符串。 (/ 代表控制台)。
  /D:dir    查找以分号为分隔符的目录列表
  strings   要查找的文字。
  [drive:][path]filename
            指定要查找的文件。

除非参数有 /C 前缀,请使用空格隔开搜索字符串。
例如: 'FINDSTR "hello there" x.y' 在文件 x.y 中寻找 "hello" 或
"there" 。  'FINDSTR /C:"hello there" x.y' 文件 x.y  寻找
"hello there"。

一般表达式的快速参考:
  .        通配符: 任何字符
  *        重复: 以前字符或类别出现零或零以上次数
  ^        行位置: 行的开始
  $        行位置: 行的终点
  [class]  字符类别: 任何在字符集中的字符
  [^class] 补字符类别: 任何不在字符集中的字符
  [x-y]    范围: 在指定范围内的任何字符
  \x       Escape: 元字符 x 的文字用法
  \<xyz    字位置: 字的开始
  xyz\>    字位置: 字的结束

有关 FINDSTR 常见表达法的详细情况,请见联机命令参考。
作者: Climbing     时间: 2008-4-1 00:38
还真不容易看懂啊,怎么琢磨的啊?我可是费了将近20分钟的时间才大概看明白是怎么实现的。

关键处在:

  Quote:
if %3 neq 1 (set/p=<nul>%2) else echo.>%2
findstr /a:%1 .* "%~2*"

其中的set/p=后面是一个退格符,将这个退格符放到%2这个文件中。
%~2应该是将%2这个变量中的所有双引号去掉,"%~2*"表示在前面生成的%2文件名后面加*号(文件中的通配符),查找的内容是.*(匹配任何内容),这样只显示一个文件名,文件内容中的退格则删除了回车字符,实现同行显示不同的颜色。高明,佩服之至,呵呵。

不知道我分析的对不对?
作者: cooray     时间: 2008-4-3 14:15
好东西啊,今天没分了,下次再加
作者: Shinaterry     时间: 2008-4-3 15:08
利害利害..
作者: qianmo717     时间: 2008-4-4 10:10
学入门教程的时候就被告知,批处理是不能一屏显示多种颜色的,现在这种理论是不是成立呢?
请问“右键暂停,左键继续”是怎样实现的。

[ Last edited by qianmo717 on 2008-4-4 at 10:15 AM ]
作者: qq43142691     时间: 2008-4-4 13:58
佩服佩服。。
作者: Shinaterry     时间: 2008-4-5 19:33
不解: 为什么每一次输出, 后面都会莫明其妙多出一个字符":"?
作者: plp626     时间: 2008-4-5 20:29
用的是findstr /a参数,冒号当然会有了

第二个代码给了很丰富的色彩配置,大家根据需要改啊
@echo off
::输出彩色字符
mode con lines=24 cols=69
set "a=        One World !"
set "b= one Dream !"
set "c= 让我们大家一起说"
set "d=︱              bbs.cn-dos.net is our common home!"
set "e=          {Author∶jvive︱08-03-31︱Thanks to∶9527}"
set "x=              ︱"
set "p=★★★★★★★★★★★★★★★"
set "k="
pushd %tmp%
del/q "%a%?" "%b%?" "%c%?" "%d%?" "%e%?" "%x%?" "%p%?" 2>nul
call:enter 3
call:JV a "%a%" 0
call:JV b "%b%" 0
call:JV c "%c%" 0
call:enter 5
call:JV 0100 0 0
call:JV 040a "%d%" 0
call:JV 040a "%x%" 0
call:JV 0100 000 0
call:JV 040b "%d%" 0
call:JV 040b "%x%" 0
call:JV 0100 000 0
call:JV 0400 "%d%" 0
call:JV 0400 "%x%" 0
call:JV 0100 0 1
call:enter 3
call:JV e "%e%" 0
call:JV 0100 0 1
echo.
call:color
pause>nul&exit/b
rem ---------subprocess--------
:color|一二层第一个色调混合为主色调,最后一个为闪烁停留色调.
for %%a in (0 e)do (
   for %%b in (a 1 2 3 4 5 6 7 8 0 c b d f e)do (
      call set "k=%%k%%"
      call:bak %%a%%b "%p%" 0
))
goto :eof
:JV
:bak
if %3 neq 1 (set/p=%k%<nul>"%~2") else echo.>"%~2"
if %0 neq :bak (set k=) else set "k=%k%"
findstr /a:%1 .* "%~2?"
del "%~2?"
goto :eof
:enter
for /l %%a in (1 1 %1)do echo.
附图:


[ Last edited by plp626 on 2008-4-23 at 11:44 PM ]
作者: Shinaterry     时间: 2008-4-5 20:38
唉! 算了! 反正可以删除..
作者: plp626     时间: 2008-4-5 20:49
删除什么?

不理解
作者: Shinaterry     时间: 2008-4-7 01:05
删除冒号!

set "c= 让我们大家一起说 " -> 注意: 只要字符串最后面一带"空格", 运行就会出错..

请问 LZ/plp626 有没有好的解决方法呢? (需保留最后的空格)
作者: terse     时间: 2008-4-7 12:39


  Quote:
Originally posted by Shinaterry at 2008-4-7 01:05:
删除冒号!

set "c= 让我们大家一起说 " -> 注意: 只要字符串最后面一带"空格", 运行就会出错..

请问 LZ/plp626 有没有好的解决方法呢? (需保留最后的空格)

@echo off&setlocal enabledelayedexpansion
set "a= One World !           "
set "b=one Dream ! "
set "c=让我们大家一起说 "
set "d=︱              bbs.cn-dos.net is our common home! "
set "e=        {Author∶jvive︱08-03-31︱Thanks to∶9527}  "
set "f=★★★★★★★★★★★★★★★  "
for %%i in ("%a%" "%b%" "%c%" "%d%" "%e%" "%f%") do call:lp %%i
pause&exit
:lp
set /a p=%random%%%14
set "s=12345689abcde"
set v=!s:~%p%,1!
set /p= <nul >%1
findstr /a:0!v! .* "%~n1*"
echo.&echo.
del %1
)
作者: obediently     时间: 2008-4-7 13:16
佩服!!~
作者: xb2008chopin     时间: 2008-4-8 03:14
学习了 本人正需要这个!谢谢了!
作者: lzys     时间: 2008-4-8 10:24
不错,学习了,这回可以加醒目的标题了!
作者: Shinaterry     时间: 2008-4-8 11:03
15楼的代码不能完美的解决问题, 假如字符串后面带多个"空格"? 如何原样输出?
作者: ansipeter     时间: 2008-4-8 11:27
唉,我想问一下楼上的?你搞清楚显示彩色字符的原理了吗?
作者: terse     时间: 2008-4-8 11:53


  Quote:
Originally posted by Shinaterry at 2008-4-8 11:03:
15楼的代码不能完美的解决问题, 假如字符串后面带多个"空格"? 如何原样输出?

你输入试了没?
作者: ansipeter     时间: 2008-4-8 12:04
问的不合理,答的也不合理,因为根本就不合理,你们两个别用P处理建立文件,你们手动给我建立一个以N个空格结尾的文件,建立好了我看看,唉.........

[ Last edited by ansipeter on 2008-4-8 at 12:10 PM ]
作者: terse     时间: 2008-4-8 12:30
建空格结尾的文件当然不能的  但如P中用CALL呢 肯定提示没有这个文件
作者: ZJHJ     时间: 2008-4-8 22:09
结尾是空格的不好掌握,我试过,会改变颜色。
作者: Shinaterry     时间: 2008-4-9 01:48
@ansipeter

原理我是明白, 问题既然存在, 就需要去解决..

方法我是有的, 可惜太过笨拙..

考虑是否贴出ing..
作者: terse     时间: 2008-4-9 02:21
RE:Shinaterry
我这里测试的应该可以显示的:你说字符串后面带多个"空格"是否这样呢
@echo off&setlocal enabledelayedexpansion
set "a= One World !     ︱  ︱     空格    "
set "b=one Dream !      ︱  ︱    空格   "
set "c=让我们大家一起说   空格     ︱  ︱  "
set "d=︱              bbs.cn-dos.net is our common home!    空格  "
set "e=        {Author∶jvive︱08-03-31︱Thanks to∶9527}    空格  空格    "
set "f=★★★★★★★★★★★★★★★  空格 ︱  ︱ 空格    "
for %%i in ("%a%" "%b%" "%c%" "%d%" "%e%" "%f%") do call:lp %%i
pause&exit
:lp
set /a p=%random%%%14
set "s=12345689abcde"
call set v=!s:~%p%,1!
set /p= <nul >%1
findstr /a:0!v! .* "%~n1*"
echo.&echo.
del %1
作者: PPdos     时间: 2008-4-9 03:38    标题: 佩服 佩服

一直以为纯批做不出这种效果 直到现在还不敢相信,这将给我们莫大的鼓舞!

感谢 实现他的人!

我想了解的是 这个着色理念的局限性 是否能让着色后的脚本正常运行?

希望大家共同探讨一下
作者: ansipeter     时间: 2008-4-9 11:11
我就说一遍原理,只说一遍,如果有误请谅解

首先说一下如果添加空格该怎么办,我并不了解你加空格的目的和要求,我只是粗略的说一下,如果要加空格请不要把目标投向你要显示的文字的身上,像这样set "a= One World !     ︱  ︱     空格    ",你应该在set /p=[N个空格]<nul >%1这句上面做文章才是。

实现原理:实现彩色字符显示效果最主要的就是FINDSTR命令/A参数造成的,你所显示的彩色字符就是用FINDSTR查找的文件的文件名称,也就是说显示出来的是文件名称,这个文件是临时的,因为我们只是要显示效果,所以文件名称的要求限制了我们将要显示的内容,文件名是不允许我们用类似”>< : ? \“等等一些特殊字符来命名的,所以我们如果要显示这些字符也就有了限制,其次,我很佩服大家的讨论成果,也就是利用set /p=[N个空格]<nul >%1进行同行显示不同颜色的应用,这是我始料不及的,为什么用set /p=[N个空格]<nul >%1这种方法能够实现同行显示不同颜色呢?因为我们建立的文件内容是 (暂时我们叫退格键),那为何能够实现同行的效果呢?因为文件内容没有包含回车换行符,这样理解我觉得容易些,这也就是实现同行效果的原因(我自己是这样认为的),在说一下set /p=[空格]<nul >%1为何能够删除FINDSTR命令遗留下来的讨厌的冒号,就跟讨厌的9527一样,呵呵,请大家记住符号在正常情况下是退格键,但是在P处理中本人觉得他起到了前移一个位置的作用,也就是说符号并没有把前面的字符删除掉,这点一定要清楚,不是把前面的字符删除了,是把光标前移到前面字符的位置了,那为何冒号被删除了,是因为后面的那个空格,是被空格替换掉了,听好了,是替换掉了,其实我觉得很多人认为字符是删除前面的那个字符,其实不然啊.好了,就说到这里,只要大家明白了就好,再次强调一遍,我只说这一次,不在发表任何争论和讨论

[ Last edited by ansipeter on 2008-4-9 at 11:17 AM ]
作者: ZJHJ     时间: 2008-4-10 00:24
我修改了一下,让大家好理解

@echo off
call:kh 2
call:JV 0e "                       彩色" 0
call:JV 0f "与黑白字体同在CMD下运行" 0
call:JV 0100 0 1
call:kh 2
call:JV 0a "    单行显示" 0
call:JV 0b "不同颜色" 0
call:JV 0f "的字体(这里没有屏蔽冒号)," 0
@echo.
@echo.
@echo     完全可以与黑白字体混合编辑使用。
call:kh 1
call:JV 0c "    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 1 2 3 4 5 0 A B C D E" 0
call:JV 0100 0 1
@echo.
call:JV 0d "    {} [] ()()' 、,, ;:‘ ’“”。?" 0
call:JV 0e " !! + _ - = ~ $ @ & # ^" 0
call:JV 0100 0 1
call:kh 1
call:JV 06 "    只要不显示" 0
call:JV 0e "特殊" 0
call:JV 09 "符号" 0
call:JV 00ce "是没有问题的。" 0
call:JV 0100 0 1
call:kh 1
call:JV 0b "    好控制" 0
call:JV 0b "不同颜色,也好调整编辑格式," 0
call:JV 09 "结尾的冒号方便屏蔽。" 0
call:JV 0100 0 1
call:kh 1
call:JV 03 "    不能有整行空格;行末尾也不要有空格。" 0
call:JV 0100 0 1
@echo.
call:JV 0100 "   '" 0
call:JV 019a "学习学习!共同探讨!" 0
call:JV 0100 0 1
@echo.
@echo     感觉容易理解,方便掌握!
pause>nul
goto :eof
:JV
if %3 neq 1 (set/p=<nul>%2) else echo.>%2
findstr /a:%1 .* "%~2*"
del "%~2"
goto :eof
:kh
for /l %%a in (1 1 %1)do echo.
goto :eof

[ Last edited by ZJHJ on 2008-4-10 at 08:43 PM ]
作者: lxy2007     时间: 2008-4-11 13:08
强!
作者: plp626     时间: 2008-4-25 14:04
自己给自己加分!

我就是要让函数的思想发扬广大,让这样的帖子火起来,
作者: dslz666     时间: 2008-4-28 05:36
强,,。让批处理更上了一个层次
作者: jfm034     时间: 2008-4-30 08:50
强人呐。

学习。。

虽然现看得一头雾水的。。
作者: zh159     时间: 2008-5-1 16:24
建议第一次生成含退格字符的文件后,在输出彩色字符结束前去掉“删除-生成”的方式,采用ren修改含退格字符的文件名的方式
set /p= <nul>"-"
:lp
......
set 字符=...
ren "-" "字符"&findstr /a:c .* "字符*" 2>nul&ren "字符" "-"
goto lp

作者: pigpigs     时间: 2008-11-11 17:54
看来这么多文章,真是服了,P也能实现这么多功能。
作者: shell     时间: 2008-11-11 21:25
膜拜了~~~~~
作者: tireless     时间: 2008-12-31 15:04
bug:

1. 当输出了冒号,后面再显示另一种颜色,冒号会消失。
2. 退格键(>1时)与字符串后面的空格本身就是矛盾的,一个是后退,一个是前进。两者只能择其一。
3. 无法输出既不带空格也不带冒号的字符。

个人觉得,函数要尽量不去判断才比较有意义,也就是说如果有一个功能每个人都要这么写,那么这段代码作为函数就比较好...呃..还是不赞同批处理函数...

---------------------------------------------------------------------------------------------------------------
一个短的:
:kaler <attr> <"string"> [:]
pushd %tmp%
if exist "%~2?" del /a/f "%~2?"
set /p=%3 <nul>"%~2"
findstr /a:%1 . "%~2?"
popd & goto :eof
如要输出冒号,第三个参数填 : 号,或随便一个非特殊字符。

[ Last edited by tireless on 2009-2-27 at 00:13 ]
作者: netbenton     时间: 2009-1-5 02:21


作者: qinchun36     时间: 2009-1-15 22:05
好东西,先收藏了再漫漫研究