Board logo

标题: [特效代码] 【已解决】批处理如何实现cmd窗口随机配色? [打印本页]

作者: wangjile    时间: 2013-7-1 13:05     标题: 【已解决】批处理如何实现cmd窗口随机配色?

我想让我的批处理在启动时随机选择颜色代码,就是每次打开批处理背景和前景颜色都是随机的,但是有要求背景颜色和前景颜色不能相同,否则会变回默认的黑框框
问了一圈,也没人回答,自己连搜带蒙的写了以下代码:
  1. @echo off
  2. :ks
  3. setlocal EnableDelayedExpansion
  4. set str=0 1 2 3 4 5 6 7 8 9 A B C D E F
  5. set /a asss=%random%%%16
  6. set /a addd=%random%%%16
  7. for /f "tokens=%asss% delims= " %%i in ("%str%") do set dy=%%i
  8. for /f "tokens=%addd% delims= " %%Y in ("%str%") do set de=%%Y
  9. color %dy%%de%
  10. pause
  11. goto ks
复制代码
倒是能够随机配色了,但是会报错,请高手指点,如果能够有更简练的代码的话,也请不吝赐教……

下面是报错的截图:
作者: xxpinqz    时间: 2013-7-1 13:43

tokens=0报错。循环32次后也会出错
试试这样
  1. @echo off&setlocal enabledelayedexpansion
  2. set "str=0123456789abcdef"
  3. :ks
  4. set /a asss=!random!%%16,addd=!random!%%16
  5. color !str:~%asss%,1!!str:~%addd%,1!
  6. pause
  7. goto ks
复制代码

作者: wangjile    时间: 2013-7-1 14:12

tokens=0报错。循环32次后也会出错
试试这样
xxpinqz 发表于 2013-7-1 13:43


嗯,谢谢回答,这个给力,也不会报错……大概能看懂,非常感谢,不过大虾能不能解释下!str:~%addd%,1!这句的意思,或者给个教程的地址也行,再次谢谢大虾的回答
作者: wangjile    时间: 2013-7-1 14:18

查了下教程,有这么一句
~在%var:~n,m%中表示使用扩展环境变量指定位置的字符串。

m 和 n 为整数参数。数字 m 为正数表示取变量 var 中从左侧数第 m 个字符(单字节字符)以后的内容;m 为负数则表示取变量 var 从右侧数第 -m 个字符以及其右侧的所有的字符,这就是第一条命令所产生的新字符串。如果数字 n 为正数,表示在上述新字符串中,从其左侧取 n 个字符的内容;若 n 为负数,则从其左侧取字符直到还剩下 -n 个字符为止的内容。
如果您坚持认为这种抽象的表达方式是根本无法解释清楚这该死的 m 和无耻的 n 究竟是怎么回事的话,不如实验一下下面的例子。为了方便查看效果,我们假定变量 var 中的内容为 1234567890 (set var=1234567890),然后依次输入以下命令并查看相应的结果。
输入的命令    结果    效果                   
echo %var%    1234567890 显示所有                 
echo %var:~4%   567890   从第4个字符以后开始显示         
echo %var:~4,3%  567     从第4个字符以后开始显示,并只显示前3个  
echo %var:~-4%  7890    从倒数第4个字符开始显示         
echo %var:~-4,3% 789     从倒数第4个字符开始显示,并只显示前3个  
echo %var:~4,-2% 5678    从第4个字符以后开始显示,显示到还剩2个为止
echo %var:~0,3%  123     从头开始显示,并只显示前3个字符     
echo %var:~0,-3% 1234567   从头开始显示,显示到还剩3个字符为止   
此外,set 也可以对数值型的变量进行常见的运算操作。
set /a num=48
set /a result=%num%+12
echo %result%
上面的命令表示先给数值 48 赋给变量 num ,然后再把变量 num 的数值与数值 12 相加后的结果赋给变量 result 。第3行可以显示变量 result 的值,结果很明显,是 60 。

现在终于看懂了,松了一口气啊
作者: wangjile    时间: 2013-7-1 14:26

本帖最后由 wangjile 于 2013-7-3 14:10 编辑

!str:~%addd%,1!  意思就是从字符串str中取自左侧第1个字符开始以后的内容(顺序为自左向右),而%addd%在这里的意思就是在上述取到的内容中取第%addd%个字符的内容,也就是说m指定范围,n指定具体数值…………不知道我这么理解对不对?

这个新找到的,更便于理解:

set 目标字符串=%源字符串:~起始值,截取长度%

注意,起始值从0开始!
截取长度是可选的,如果省略逗号和截取长度,将会从起始值一直截取到字符串的结尾
作者: cutebe    时间: 2013-7-1 14:45

本帖最后由 cutebe 于 2013-7-1 14:52 编辑
  1. @ECHO OFF
  2. SETLOCAL EnableDelayedExpansion
  3. :BEGIN
  4. SET COLOR=0123456789ABCDEF
  5. SET/aBC=!RANDOM!%%16
  6. SET BACK_COLOR=!COLOR:~%BC%,1!
  7. SET COLOR=!COLOR:%BACK_COLOR%=!
  8. SET/aFC=!RANDOM!%%15
  9. SET FRONT_COLOR=!COLOR:~%FC%,1!
  10. COLOR %BACK_COLOR%%FRONT_COLOR%
  11. PAUSE
  12. GOTO :BEGIN
复制代码
SET STR=ABCDEF
首先给字符串“ABCDEF”编号,从 0 开始
A B C D E F
0 1 2 3 4 5


%STR:~M,N%  //这里M,N代表数字
意思就是从 编号M 开始,取出数量 N 个字符。

如:%STR:~2,3%
从 编号2 开始,向右取出数量 3 个字符
编号2 对应字符“C”,“C”也是第一个字符,往后再取 2 个字符,即“DE”
最后为:“CDE”,即 %STR:~2,3%=CDE
作者: Batcher    时间: 2013-7-1 15:49

回复 3# wangjile


批处理命令set截取字符详解
http://www.bathome.net/thread-996-1-1.html

批处理命令set变量字符截取点点通
http://www.bathome.net/thread-40-1-1.html

批处理命令set截取字符练习工具
http://www.bathome.net/thread-1149-1-1.html
作者: wangjile    时间: 2013-7-3 11:40

嗯,谢谢Batcher大大的教程
作者: lateol    时间: 2013-7-4 04:23

我也受教了,顶起。




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2