|
s11ss
银牌会员
积分 2098
发帖 566
注册 2007-9-11
状态 离线
|
『楼 主』:
[讨论]********findstr/a之用法质疑********
看到electronixtar兄发的ColorDemo.cmd(http://www.cn-dos.net/forum/viewthread.php?tid=35609&fpage=1)中有一句代码是用findstr来实现显示彩色字符,很佩服前辈的才华啊。我findstr用得少,今晚发现这个命令的/a参数使用有点奇怪,通过findstr/?查看帮助,解释是:
/A:attr 指定有十六进位数字的颜色属性。请见 "color /?"
再看color/?,解释是:
attr 指定控制台输出的颜色属性
颜色属性由两个十六进制数字指定 -- 第一个为背景,第二个则为
前景。
这么说来,对于findstr的参数/a,就应该是输入两个十六进制数字啰。但是实际情况不是,我尝试了n次,发现4个十六进制数字有效(多于4个的取最后4个),而在color命令后则不行。这四位中的后两位数好理解,就是如上述的“指定控制台输出的颜色属性“,而前两位是干什么用的呢?我发现是用来控制所显示的文件名字符串(包括之后的冒号)之间的横线和竖线的显示的(包括其有无及粗细),但又好像不全是,因为有时前两位数会影响到后两位数,致使后两位数失去它们的指定颜色的作用(比如2c04)。
TEST:(似乎构成等差数列,公差为4)
1.(横线)
findstr /a:040a . %systemdrive%\boot.ini* 2.(竖线)
findstr /a:080a . %systemdrive%\boot.ini* 3.(横线+竖线)
findstr /a:0c0a . %systemdrive%\boot.ini* 4.(竖线,注意与第2种情况对比)
findstr /a:100a . %systemdrive%\boot.ini* 5.(横线+竖线,注意与第3种情况对比)
findstr /a:140a . %systemdrive%\boot.ini* 6.(竖线,注意与第2,4种情况对比)
findstr /a:180a . %systemdrive%\boot.ini* 7.(横线+竖线,注意与第3,5种情况对比)
findstr /a:1c0a . %systemdrive%\boot.ini* 8.换成200a就没有横线和竖线了。
9.后面还有,如:(貌似和1c0a一样)
findstr /a:dd0a . %systemdrive%\boot.ini* 10.还有些情况是“表格”里居然什么都没有,或者表格最右端出现一条很粗的竖线,另外注意表格边框上的横线和竖线(不同的参数下会导致边框线有时显示,有时又不显示)。还有有时当你把cmd窗口滚动条向上滑动去看上边的命令执行结果然后回过来看,会发现下面的刚执行过的命令的结果居然变了!灵异事件!(比如5c0a)
再来个测试用批处理:
@echo off
setlocal
set begin=%1
set end=%2
set step=%3
set colo=%4
if "%4" equ "" (
echo 四个参数:
echo 1.起始值(两位16进制):如04
echo 2.终值(两位16进制):如2c
echo 3.公差(10进制):如4
echo 4.后两位颜色设置(两位16进制):如0a
echo 例如:%0 04 2c 4 0a
set begin=04
set end=2c
set step=4
set colo=0a
)
set/a n=0x%begin%
set t=test.tmp
pushd %tmp%
if exist %t% goto :test
for /l %%a in (1,1,5) do echo.^ >>%t%
:test
call :10to16 %n%
if %n% lss 16 (set v=0%r%%colo%) else (set v=%r%%colo%)
echo %v%
findstr/a:%v% . %t%*
echo.
set/a n+=%step%
if not %n% gtr 0x%end% goto :test
popd
pause
goto :eof
:10to16
set/a q=%1
:1c
set/a r=%q%%%16
set/a q=%q%/16
call set r=%%r:10=A%%
call set r=%%r:11=B%%
call set r=%%r:12=C%%
call set r=%%r:13=D%%
call set r=%%r:14=E%%
call set r=%%r:15=F%%
call set r%1=%r%%%r%1%%
if not %q% equ 0 goto :1c
call set r=%%r%1%%
set r%1=
*********************************
注:
以上结论纯粹是我个人观点,大家也来试试,这到底是怎么回事呢?
我的操作系统是:
XP Professional 5.1.2600
[ Last edited by s11ss on 2007-11-23 at 10:35 PM ]
|
|
2007-11-23 22:19 |
|
|
knoppix7
银牌会员
积分 1287
发帖 634
注册 2007-5-2 来自 cmd.exe
状态 离线
|
『第
2 楼』:
和DEBUG中的 debug 很像..
f b800:0000 f9f XX YY
貌似XX代表样式 YY代表颜色.
|
|
2007-11-24 12:30 |
|
|
s11ss
银牌会员
积分 2098
发帖 566
注册 2007-9-11
状态 离线
|
『第
3 楼』:
哦?我想可以用这个特性来画表格..................
|
|
2007-11-24 17:42 |
|
|
electronixtar
铂金会员
积分 7493
发帖 2672
注册 2005-9-2
状态 离线
|
『第
4 楼』:
哇咔咔,很难得一见的技术贴,真不忍心给水了
那个ColorDemo.CMD不是我写的,我只是转帖,而且我也不是什么前辈,只是一个p处理爱好者而已。
|
C:\>BLOG http://initiative.yo2.cn/
C:\>hh.exe ntcmds.chm::/ntcmds.htm
C:\>cmd /cstart /MIN "" iexplore "about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll/10/5432'>" |
|
2007-11-27 19:48 |
|
|
zh159
金牌会员
积分 3687
发帖 1467
注册 2005-8-8
状态 离线
|
『第
5 楼』:
现在10to16不用这么罗嗦了,如果只转换一位(0~f),用下面的就OK
set "Hex=0123456789ABCDEF"
set /a R=
call set R=%%Hex:~%R%,1%% 转换多位的:
@echo off
set "Hex=0123456789ABCDEF"
set /p S=
:10to16
set /a R=S%%16
call set R=%%Hex:~%R%,1%%
set /a S/=16
set C=%R%%C%
if not %S% == 0 goto 10to16
echo %C%
set S=
set R=
set C=
pause [ Last edited by zh159 on 2007-11-27 at 08:09 PM ]
|
|
|
2007-11-27 20:07 |
|
|
s11ss
银牌会员
积分 2098
发帖 566
注册 2007-9-11
状态 离线
|
『第
6 楼』:
Quote: | Originally posted by electronixtar at 2007-11-27 07:48 PM:
哇咔咔,很难得一见的技术贴,真不忍心给水了
那个ColorDemo.CMD不是我写的,我只是转帖,而且我也不是什么前辈,只是一个p处理爱好者而已。 |
|
electronixtar兄不要谦虚啦~~诶,兄的签名档中
cmd /cstart "" "about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll/10/5432'>"
这句怎么我运行后提示“没有可以显示的页面”啊?还有about:都有哪些用法啊?
|
|
2007-11-27 20:08 |
|
|
electronixtar
铂金会员
积分 7493
发帖 2672
注册 2005-9-2
状态 离线
|
『第
7 楼』:
Quote: | Originally posted by s11ss at 2007-11-27 20:08:
electronixtar兄不要谦虚啦~~诶,兄的签名档中
cmd /cstart "" "about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll/10/5432'>& ... |
|
那就直接运行iexplore about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll/10/5432'> 试试?哇咔咔
[ Last edited by electronixtar on 2007-11-27 at 08:19 PM ]
|
C:\>BLOG http://initiative.yo2.cn/
C:\>hh.exe ntcmds.chm::/ntcmds.htm
C:\>cmd /cstart /MIN "" iexplore "about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll/10/5432'>" |
|
2007-11-27 20:11 |
|
|
electronixtar
铂金会员
积分 7493
发帖 2672
注册 2005-9-2
状态 离线
|
『第
8 楼』:
Quote: | Originally posted by zh159 at 2007-11-27 20:07:
现在10to16不用这么罗嗦了,如果只转换一位(0~f),用下面的就OK
set "Hex=0123456789ABCDEF"
set /a R=
call set R=%%Hex:~%R%,1%% 转换多位的: ... |
|
:P 看不懂,牛B了,很久不来这里高手依旧那么彪悍
|
C:\>BLOG http://initiative.yo2.cn/
C:\>hh.exe ntcmds.chm::/ntcmds.htm
C:\>cmd /cstart /MIN "" iexplore "about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll/10/5432'>" |
|
2007-11-27 20:16 |
|
|
upsco
初级用户
积分 67
发帖 32
注册 2007-11-19
状态 离线
|
『第
9 楼』:
Quote: | Originally posted by electronixtar at 2007-11-27 08:11 PM:
那就直接运行iexplore about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll/10/5432'> 试试?哇咔咔
[ Last edited by electronixtar on 20 ... |
|
我们怎么引用都运行不了,要是我们这样就能运行你电脑上的某个程序,嘎嘎,你可惨了
|
|
2007-11-27 20:25 |
|
|
electronixtar
铂金会员
积分 7493
发帖 2672
注册 2005-9-2
状态 离线
|
『第
10 楼』:
Quote: | Originally posted by upsco at 2007-11-27 20:25:
我们怎么引用都运行不了,要是我们这样就能运行你电脑上的某个程序,嘎嘎,你可惨了 |
|
那么你肯定没有安装 Microsoft Office 2000/XP/2003/2007 中任意一个版本
|
C:\>BLOG http://initiative.yo2.cn/
C:\>hh.exe ntcmds.chm::/ntcmds.htm
C:\>cmd /cstart /MIN "" iexplore "about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll/10/5432'>" |
|
2007-11-27 20:28 |
|
|
s11ss
银牌会员
积分 2098
发帖 566
注册 2007-9-11
状态 离线
|
『第
11 楼』:
zh159兄,你的转换多位的代码与我的代码相比也不见得不啰嗦啊~~~~~~~~
不,我收回这句话。
其实各有优缺点。
你的简单但降低了代码可读性,我的啰嗦但提高了代码可读性。
[ Last edited by s11ss on 2007-11-27 at 08:46 PM ]
|
|
2007-11-27 20:30 |
|
|
s11ss
银牌会员
积分 2098
发帖 566
注册 2007-9-11
状态 离线
|
『第
12 楼』:
Quote: | Originally posted by electronixtar at 2007-11-27 08:28 PM:
那么你肯定没有安装 Microsoft Office 2000/XP/2003/2007 中任意一个版本 |
|
我装了 Microsoft Office 2003。好像是经过修改的。
|
|
2007-11-27 20:33 |
|
|
zh159
金牌会员
积分 3687
发帖 1467
注册 2005-8-8
状态 离线
|
|
2007-11-27 20:42 |
|
|
s11ss
银牌会员
积分 2098
发帖 566
注册 2007-9-11
状态 离线
|
『第
14 楼』:
zh159兄,你的转换多位的代码与我的代码相比也不见得不啰嗦啊~~~~~~~~
不好意思,我收回这句话。
其实各有优缺点。
你的简单但降低了代码可读性而且加大了“程序处理量”(0-9都替换了),我的啰嗦但提高了代码可读性。
|
|
2007-11-27 20:51 |
|
|
everest79
金牌会员
一叶枝头,万树皆春
积分 2564
发帖 1127
注册 2006-12-25
状态 离线
|
『第
15 楼』:
我也写过个
SETLOCAL ENABLEDELAYEDEXPANSION
IF %1 GTR 2099999999 (GOTO :EOF)
SET VAR=0123456789ABCDEF
FOR /L %%i IN (0,1,15) DO (
SET H%%i=!VAR:~%%i,1!)
SET HH=1&SET KK=0&SET TT=%1
:th1
SET /A HV%HH%=%TT%/16,HV%KK%=%TT%%%16
IF !HV%HH%! GTR 16 (SET TT=HV%HH%&&SET /A HH+=1,KK+=1&&GOTO TH1)
SET VAR1=0x00!H%HV9%!!H%HV8%!!H%HV7%!!H%HV6%!!H%HV5%!!H%HV4%!!H%HV3%!!H%HV2%!!H%HV1%!!H%HV0%!
ECHO %VAR1% ^<^<=%0
GOTO :EOF
|
|
2007-11-27 20:54 |
|