2011-10-28 54 views
24

批量处理,每行可以有不同的颜色。 例如,如果你有一个批处理文件,说 “你好” “你好吗?”每行的批量颜色

你有蓝色的“你好”和绿色的“你好吗?

(我知道的颜色命令的方式,以及它的颜色既背景和文本)

+3

重复这个(标题不清)问题:[我怎么能做一个多功能的批处理程序?](http://stackoverflow.com/questions/7290434/how-can-i-make-a-multi-功能批处理程序/ 7302678#7302678) –

+0

@手工食品谢谢。我明白你的称号不好,但是有没有办法做到这一点,而不必设置它?我问,因为我做了一个批处理游戏,这将是一个很好的功能,所以我希望能够将它给予某人而不必更改任何计算机设置 –

+1

您不需要更改计算机设置。只需将此批处理文件包含在与您的游戏相同的文件夹中。另一个问题的海报要求这是系统范围的,所以我将其添加到答案中。所有你需要的是脚本标题** CEcho.bat ** –

回答

28

你可以不用任何外部程序。这是几天前我来的。工作非常好。

@echo off 
SETLOCAL EnableDelayedExpansion 
for /F "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do rem"') do (
    set "DEL=%%a" 
) 
echo say the name of the colors, don't read 

call :ColorText 0a "blue" 
call :ColorText 0C "green" 
call :ColorText 0b "red" 
echo(
call :ColorText 19 "yellow" 
call :ColorText 2F "black" 
call :ColorText 4e "white" 

goto :eof 

:ColorText 
echo off 
<nul set /p ".=%DEL%" > "%~2" 
findstr /v /a:%1 /R "^$" "%~2" nul 
del "%~2" > nul 2>&1 
goto :eof 
Credits to jeb 
His post can be found here
+3

唯一的问题似乎是,你不能使用一些像':*?''' – jeb

+0

这样的字符现在你也可以使用特殊字符,比如':/ * ?<>“'[如何在批处理文件中有多种颜色?](http://stackoverflow.com/a/5344911/463115) – jeb

+1

找不到'findstr' – Veehmot

5

下面的批处理文件创建COLORMSG.COM文件(如你所愿将其重命名),显示色彩的消息是这样的:colormsg color "Message"

@echo off 
(
echo e100 
echo 0F B6 0E 80 00 E3 4F BF 81 00 B0 20 FC F3 AE 74 
echo e110 
echo 45 E3 43 8A 45 FF E8 43 00 80 3D 20 74 0E C0 E0 
echo e120 
echo 04 8A E0 8A 05 E8 34 00 0A C4 47 49 E3 28 32 E4 
echo e130 
echo 50 B0 22 F2 AE 75 1F E3 1D 8B F7 8B D1 F2 AE 75 
echo e140 
echo 01 41 2B D1 74 10 8B CA 5B B0 20 B4 09 CD 10 AC 
echo e150 
echo B4 0E CD 10 E2 F9 32 C0 B4 4C CD 21 3C 61 72 02 
echo e160 
echo 2C 20 3C 41 72 02 2C 07 2C 30 C3 
echo rcx 
echo 6b 
echo w 
echo q 
) | debug colormsg.com > nul 

在消息光标未移动到新行之后,因此几条消息可能显示在同一行中。为了让颜色更简单的方法,你可以使用这些定义:

set Black=0&  set Gray=8 
set Blue=1&  set LightBlue=9 
set Green=2&  set LightGreen=A 
set Aqua=3&  set LightAqua=B 
set Red=4&   set LightRed=C 
set Purple=5&  set LightPurple=D 
set Yellow=6&  set LightYellow=E 
set White=7&  set BrightWhite=F 

例如:

colormsg %Yellow% "Message in yellow " 
colormsg %Blue%%BrightWhite% "Bright white text over blue background" 

这是一个更大的示例:

@echo off 
setlocal EnableDelayedExpansion 
set i=0 
for %%c in (Blk Blu Grn Aqu Red Pur Yel Whi) do (
    set color[!i!]=%%c 
    set /A i+=1 
) 
for /L %%j in (0,1,7) do (
    set color[!i!]=L!color[%%j]:~0,-1! 
    set /A i+=1 
)  
cls 
echo/ 
echo   BACKGROUND/FOREGROUND COMBINATIONS OF AVAILABLE SCREEN COLORS 
echo/ 
echo/ 
colormsg 7 "ForeGrnd:" 
for /L %%i in (0,1,15) do colormsg 7 " !color[%%i]!" 
echo/ 
echo BackGrnd 
set i=0 
for /L %%b in (0,1,9) do call :ShowLine %%b 
for %%b in (A B C D E F) do call :ShowLine %%b 
echo/ 
goto :eof 

:ShowLine 
colormsg 7 " !color[%i%]! " 
set /A i+=1 
for /L %%f in (0,1,9) do colormsg %1%%f " %1%%f " 
for %%f in (A B C D E F) do colormsg %1%%f " %1%%f " 
echo/ 

嘿加雷,这里是一个给你奖励!下面的批处理文件创建TEXTPOS.COM文件(如你所愿重新命名它)是将光标移动到任意行和列这样:textpos line col

@echo off 
(
echo e100 
echo 0F B6 0E 80 00 E3 2D BF 81 00 B0 20 FC F3 AE 74 
echo e110 
echo 23 E3 21 8D 75 FF E8 45 00 3C 20 75 3B 86 F2 E8 
echo e120 
echo 3C 00 86 F2 3C 20 74 04 3C 0D 75 2C 32 FF B4 02 
echo e130 
echo CD 10 EB 24 32 FF B4 03 CD 10 8A C6 8A CA E8 38 
echo e140 
echo 00 B2 20 B4 02 CD 21 8A C1 E8 2D 00 B2 0D B4 02 
echo e150 
echo CD 21 B2 0A B4 02 CD 21 32 C0 B4 4C CD 21 32 E4 
echo e160 
echo AC 3C 20 74 FB 3C 30 72 0D 3C 39 77 09 2C 30 D5 
echo e170 
echo 0A 8A E0 AC EB EF 8A F4 C3 D4 0A 05 30 30 8B D0 
echo e180 
echo 80 FC 30 74 08 86 D6 B4 02 CD 21 8A D6 B4 02 CD 
echo e190 
echo 21 C3 
echo rcx 
echo 92 
echo w 
echo q 
) | debug textpos.com > nul 

例如:

textpos 0 0 
colormsg %Red% "Red message at top left corner of the screen" 
textpos 10 40 
colormsg %Blue%%LightYellow% "This message start in line 10 column 40" 

编辑

我稍微修改了TEXTPOS程序,它显示当前光标位置,如果它没有参数执行;此功能允许以这种方式将光标位置存储在一个变量中:textpos > pipe.txt & set /P pos=< pipe.txt(因为textpos | set /P pos=有错误并且不起作用)。

如果显示的颜色信息的背景和前景颜色的值相同,则文本在屏幕中不可见;此功能允许输入密码。例如,这是getpassword.bat文件:

@echo off 
set password= 
for /L %%i in (1,1,%1) do set password=!password!x 
colormsg 7 "Enter password: " 
textpos > pipe.txt & set /P passpos=< pipe.txt 
colormsg 77 "%password%" 
textpos %passpos% 
set password= 
for /L %%i in (1,1,%1) do (
    getakey 
    set password=!password!!errorlevel! 
    colormsg 7F "*" 
) 

先前批文件允许读取与在参数给出的字符数密码,例如:call getpassword 8;输入的字符被其ASCII码改变,所以密码具有基本的加密。例如,要检查输入的密码是否为“通过”:

call getpassword 4 
if %password% == 8097115115 goto right_password 

我提供了GETAKEY。前一个问题COM程序,但在这里再次是:

@echo off 
(
echo e100 
echo B4 08 CD 21 B4 4C CD 21 
echo rcx 
echo 8 
echo w 
echo q 
) | debug getakey.com > nul 
+0

如果下选举人可能会解释投票的原因...**':(**请注意,这个解决方案发布于2011年10月,当时没有64位版本的Windows,并且这种方法在所有计算机上都正常工作! – Aacini

3

你可以试试这个 只是命令的一点点:

@echo off 
chcp 437>nul&&graftabl 936>nul 
ren %WinDir%\System32\config.nt config.nt.bak 2>nul 
<"%~f0" more +6 >%WinDir%\System32\config.nt 
command /cecho [1;31mHel[32mlo [33mHow[35mare[36myou[m 
pause>nul&exit 
DOSONLY 
dos=high, umb 
device=%SystemRoot%\system32\himem.sys 
DEVICE==%SystemRoot%\System32\ANSI.SYS /x 
files=40 
2
@echo off 

REM You can do it easely by typing this at the bottom of your file. 

:[any color] 
powershell -Command Write-Host "%*" -foreground "[any color]" -background "[any color]" 

:[any color] 
powershell -Command Write-Host "%*" -foreground "[any color]" -background "[any color]" 

REM for typing text in different colors you just need to write this 

call :[any color] "[any message]" 
call :[any color] "[any other message]" 
pause 

REM if you want to know more, send a mail to maupie42 at gmail dot com 

exit 
+0

这个答案有什么错误?它至少作品 - 我对它为什么被低估感兴趣 - 这里有什么缺点? –

1

是的,这是可能的cmdcolor

echo \033[94mHello 
echo \033[92mHow are you 
3

将此代码保存为.bat(它是自编的.net混合型):

@if (@X)==(@Y) @end /* JScript comment 
@echo off 
setlocal 

for /f "tokens=* delims=" %%v in ('dir /b /s /a:-d /o:-n "%SystemRoot%\Microsoft.NET\Framework\*jsc.exe"') do (
    set "jsc=%%v" 
) 

if not exist "%~n0.exe" (
    "%jsc%" /nologo /out:"%~n0.exe" "%~dpsfnx0" 
) 

%~n0.exe %* 

endlocal & exit /b %errorlevel% 

*/ 

import System; 

var arguments:String[] = Environment.GetCommandLineArgs(); 

var newLine = false; 
var output = ""; 
var foregroundColor = Console.ForegroundColor; 
var backgroundColor = Console.BackgroundColor; 
var evaluate = false; 
var currentBackground=Console.BackgroundColor; 
var currentForeground=Console.ForegroundColor; 


//http://stackoverflow.com/a/24294348/388389 
var jsEscapes = { 
    'n': '\n', 
    'r': '\r', 
    't': '\t', 
    'f': '\f', 
    'v': '\v', 
    'b': '\b' 
}; 

function decodeJsEscape(_, hex0, hex1, octal, other) { 
    var hex = hex0 || hex1; 
    if (hex) { return String.fromCharCode(parseInt(hex, 16)); } 
    if (octal) { return String.fromCharCode(parseInt(octal, 8)); } 
    return jsEscapes[other] || other; 
} 

function decodeJsString(s) { 
    return s.replace(
     // Matches an escape sequence with UTF-16 in group 1, single byte hex in group 2, 
     // octal in group 3, and arbitrary other single-character escapes in group 4. 
     /\\(?:u([0-9A-Fa-f]{4})|x([0-9A-Fa-f]{2})|([0-3][0-7]{0,2}|[4-7][0-7]?)|(.))/g, 
     decodeJsEscape); 
} 


function printHelp() { 
    print(arguments[0] + " -s string [-f foreground] [-b background] [-n] [-e]"); 
    print(" "); 
    print(" string   String to be printed"); 
    print(" foreground  Foreground color - a "); 
    print("    number between 0 and 15."); 
    print(" background  Background color - a "); 
    print("    number between 0 and 15."); 
    print(" -n    Indicates if a new line should"); 
    print("    be written at the end of the "); 
    print("    string(by default - no)."); 
    print(" -e    Evaluates special character "); 
    print("    sequences like \\n\\b\\r and etc "); 
    print(""); 
    print("Colors :"); 
    for (var c = 0 ; c < 16 ; c++) { 

     Console.BackgroundColor = c; 
     Console.Write(" "); 
     Console.BackgroundColor=currentBackground; 
     Console.Write("-"+c); 
     Console.WriteLine(""); 
    } 
    Console.BackgroundColor=currentBackground; 



} 

function errorChecker(e:Error) { 
     if (e.message == "Input string was not in a correct format.") { 
     print("the color parameters should be numbers between 0 and 15"); 
     Environment.Exit(1); 
     } else if (e.message == "Index was outside the bounds of the array.") { 
     print("invalid arguments"); 
     Environment.Exit(2); 
     } else { 
     print ("Error Message: " + e.message); 
     print ("Error Code: " + (e.number & 0xFFFF)); 
     print ("Error Name: " + e.name); 
     Environment.Exit(666); 
     } 
} 

function numberChecker(i:Int32){ 
    if(i > 15 || i < 0) { 
     print("the color parameters should be numbers between 0 and 15"); 
     Environment.Exit(1); 
    } 
} 


if (arguments.length == 1 || arguments[1].toLowerCase() == "-help" || arguments[1].toLowerCase() == "-help" ) { 
    printHelp(); 
    Environment.Exit(0); 
} 

for (var arg = 1; arg <= arguments.length-1; arg++) { 
    if (arguments[arg].toLowerCase() == "-n") { 
     newLine=true; 
    } 

    if (arguments[arg].toLowerCase() == "-e") { 
     evaluate=true; 
    } 

    if (arguments[arg].toLowerCase() == "-s") { 
     output=arguments[arg+1]; 
    } 


    if (arguments[arg].toLowerCase() == "-b") { 

     try { 
     backgroundColor=Int32.Parse(arguments[arg+1]); 
     } catch(e) { 
     errorChecker(e); 
     } 
    } 

    if (arguments[arg].toLowerCase() == "-f") { 
     try { 
     foregroundColor=Int32.Parse(arguments[arg+1]); 
     } catch(e) { 
     errorChecker(e); 
     } 
    } 
} 

Console.BackgroundColor = backgroundColor ; 
Console.ForegroundColor = foregroundColor ; 

if (evaluate) { 
    output=decodeJsString(output); 
} 

if (newLine) { 
    Console.WriteLine(output); 
} else { 
    Console.Write(output); 

} 

Console.BackgroundColor = currentBackground; 
Console.ForegroundColor = currentForeground; 
2

保存为colormsg.bat

@echo off 
if "%~3" == "" goto usage 
powershell -command write-host -foreground "%~1" -background "%~2" -nonewline "%~3" 
exit /b 
:usage 
echo. 
echo Usage: call colormsg foreground background "message" 
echo. 
echo Examples: 
echo call colormsg white blue "example1" 
echo call colormsg 4 2 "example2" 

例子:

@echo off 
for /f %%a in ('"prompt $H & for %%a in (-) do rem"') do set "BS=%%a" 
call colormsg blue 0 "Hello" 
<nul set /p "=.%BS% " 
call colormsg green 0 "How are you?" 
echo. 
pause 
-1

只需要COLORMSG的:

@echo off 
(
echo e100 
echo 0F B6 0E 80 00 E3 4F BF 81 00 B0 20 FC F3 AE 74 
echo e110 
echo 45 E3 43 8A 45 FF E8 43 00 80 3D 20 74 0E C0 E0 
echo e120 
echo 04 8A E0 8A 05 E8 34 00 0A C4 47 49 E3 28 32 E4 
echo e130 
echo 50 B0 22 F2 AE 75 1F E3 1D 8B F7 8B D1 F2 AE 75 
echo e140 
echo 01 41 2B D1 74 10 8B CA 5B B0 20 B4 09 CD 10 AC 
echo e150 
echo B4 0E CD 10 E2 F9 32 C0 B4 4C CD 21 3C 61 72 02 
echo e160 
echo 2C 20 3C 41 72 02 2C 07 2C 30 C3 
echo rcx 
echo 6b 
echo w 
echo q 
) | debug colormsg.com > nul 
ren colormsg.com colormsg.exe 

使用的颜色CMD默认:

color /? 

使用echo.打破行

使用空格键来移动味精水平

例子:

@echo off 

REM one color in line 
echo. 
colormsg a "green color" 

REM break line 
echo. 

REM two colors in line 
colormsg b "color blue" 
colormsg c "color red" 

REM break line 
echo. 

REM two colors with spacing horizontally (no use tab) 
colormsg d "purple color" 
colormsg e "    yellow color" 
echo. 
echo. 
pause 

这一切!

1

你可以试试这个简单的脚本。它不使用临时文件。只要确保在“%path%”环境变量中列出的任何文件夹中都有“debug.exe”可执行文件。

@echo off 
rem Script written by BrendanSilva [bl8086] 
rem You need DEBUG.EXE executable in your system. 
setlocal enabledelayedexpansion 
set /a _er=0 
set /a _n=0 
set _ln=%~4 
goto init 
:howuse ------------------------------------------------------------------------ 
    echo. 
    echo ECOL.BAT - v2.0 
    echo Print colored text as batch script without temporary files. 
    echo Written by bl8086 
    echo. 
    echo Syntax: 
    echo ECOL.BAT [COLOR] [X] [Y] "Insert your text here" 
    echo COLOR value must be a hexadecimal number like "color /?" information 
    echo. 
    echo Example: 
    echo ECOL.BAT F0 20 30 "640K ought to be enough for anybody." 
    echo. 
    goto :eof 
:error ------------------------------------------------------------------------ 
    set /a "_er=_er | (%~1)" 
    goto :eof 
:gcnvhx ------------------------------------------------------------------------ 
    set _cvhx= 
    set /a _cvint=%~1 
:cnvhx 
    set /a "_gch = _cvint & 0xF" 
    set _cvhx=!nsys:~%_gch%,1!%_cvhx% 
    set /a "_cvint = _cvint >> 4" 
    if !_cvint! neq 0 goto cnvhx 
    goto :eof 
:init -------------------------------------------------------------------------- 
    if "%~4"=="" call :error 0xff 
    (
     set /a _cl=0x%1 
     call :error !errorlevel! 
     set _cl=%1 
     call :error "0x!_cl! ^>^> 8" 
     set /a _px=%2 
     call :error !errorlevel! 
     set /a _py=%3 
     call :error !errorlevel! 
    ) 2>nul 1>&2 
    if !_er! neq 0 (
     echo. 
     echo ERROR: value exception "!_er!" occurred. Check memory out. 
     echo. 
     goto howuse 
    ) 
    set nsys=ABCDEF 
    set /a cnb=0 
    set /a cnl=0 
    set _cvhx=0 
    set _cvint=0 
    set _cvmhx=0 
:parse ------------------------------------------------------------------------- 
    set _ch=!_ln:~%_n%,1! 
    if "%_ch%"=="" goto perform 
    set /a "cnb += 1" 
    if %cnb% gtr 7 (
     set /a cnb=0 
     set /a "cnl += 1" 
    ) 
    set bln%cnl%=!bln%cnl%! "!_ch!" %_cl% 
    set /a "_n += 1" 
    goto parse 
:perform ----------------------------------------------------------------------- 
    set /a "in = ((_py * 0xA0) + (_px << 1)) & 0xFFFF" 
    call :gcnvhx %in% 
    set ntr=!_cvhx! 
    set /a jmp=0xe 
    set bl8086str=echo.h 0 0 
    @for /l %%x in (0,1,%cnl%) do (
     set bl8086str=!bl8086str!^&echo.eb800:!ntr! !bln%%x! 
     set /a "in=!jmp! + 0x!ntr!" 
     call :gcnvhx !in! 
     set ntr=!_cvhx! 
     set /a jmp=0x10 
    ) 
    (
    echo %bl8086str% 
    echo.q 
    ) |debug >nul 2>&1 

此脚本可以在任何屏幕位置编写您的文本。也使用任何颜色。