2011-10-28 16 views
24

En lote, puede tener diferentes colores por línea. Por ejemplo, si tiene un archivo por lotes, diga "Hola" "¿Cómo está?"Lote Color por línea

¿Podría tener "Hello" en azul y "How are you" en verde?

(lo que sé sobre el comando del color y la forma en que los colores tanto en el fondo y el texto)

+3

Duplicado de esta pregunta (mal titulada): [¿cómo puedo hacer un programa por lotes multifuncional?] (Http://stackoverflow.com/questions/7290434/how-can-i-make-a-multi- functional-batch-program/7302678 # 7302678) –

+0

@ Hand-E-Food Gracias. Veo lo que quiere decir con un título pobre. ¿Hay alguna forma de hacerlo sin tener que configurarlo? Pregunto porque estoy haciendo un juego por lotes si esta fuera una buena característica, y por eso quiero poder dársela a alguien sin tener que cambiar ninguna configuración de la computadora –

+1

No es necesario que cambie la configuración de la computadora. Solo incluye este archivo por lotes en la misma carpeta que tu juego. El póster de la otra pregunta quería que fuera todo el sistema, así que lo agregué a la respuesta. Todo lo que necesita es el script titulado ** CEcho.bat ** –

Respuesta

28

Usted puede hacerlo sin ningún programa externo. Aquí hay algo de lo que vine hace un par de días. Funciona muy bien

@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

El único problema parece ser que no puede usar algunos caracteres como ': *?" ' – jeb

+0

Ahora puede usar también caracteres especiales como':/* ? <> "' [¿cómo tener múltiples colores en un archivo de proceso por lotes?] (http://stackoverflow.com/a/5344911/463115) – jeb

+1

No se puede encontrar 'findstr' – Veehmot

5

el archivo por lotes a continuación crear el archivo COLORMSG.COM (cambiarle el nombre como desee) que muestran un mensaje con el color de esta manera: 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 

Después de que el mensaje que el cursor no se mueve a la nueva línea, por lo que varios mensajes pueden ser presentados en la misma línea. Para dar a los colores de una manera más fácil, es posible utilizar estas definiciones:

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 

Por ejemplo:

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

Este es un ejemplo más extenso:

@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/ 

Hey Gareth, aquí es una ¡bonificación para ti! El siguiente archivo por lotes crear el archivo TEXTPOS.COM (cambiarle el nombre que desee) que mueven el cursor a cualquier línea y la columna de esta manera: 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 

Por ejemplo:

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" 

EDITAR

Modifiqué ligeramente el programa TEXTPOS para que muestre la posición actual del cursor si se ejecuta sin parámetros; esta característica permite almacenar la posición del cursor en una variable de esta manera: textpos > pipe.txt & set /P pos=< pipe.txt (porque textpos | set /P pos= tiene un error y no funciona).

Si se muestra un mensaje de color con el mismo valor para los colores de fondo y primer plano, el texto no estará visible en la pantalla; esta característica permite ingresar una contraseña. Por ejemplo, este es getpassword.bat archivo:

@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 "*" 
) 

archivo por lotes anterior permite leer una contraseña con el número de caracteres que figuran en el parámetro, por ejemplo: call getpassword 8; los caracteres ingresados ​​se modifican por su código ASCII, por lo que la contraseña tiene un cifrado rudimentario. Por ejemplo, para verificar si la contraseña introducida fue "Pasar":

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

He proporcionado el GETAKEY.programa COM en una pregunta anterior, pero aquí está de nuevo:

@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

Lo agradeceré si el votante de abajo puede explica los motivos del voto a la baja ...** ': (' ** Tenga en cuenta que esta solución se publicó en octubre de 2011, cuando no había una versión de Windows de 64 bits y este método funciona correctamente en todas las computadoras! – Aacini

3

puede probar esta sólo con un poco de comando:

@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

¿Qué le sucede a esta respuesta? funciona - Me interesa saber por qué se votó negativamente: ¿cuál es la falla aquí? –

1

Sí, es posible con cmdcolor :

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

Guardar este código como .bat (es .net auto-compilado híbrido):

@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

Guardar como 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" 

Ejemplo:

@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

Sólo necesidad de 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 

utilizar los colores por defecto cmd:

color /? 

Uso echo. para romper la línea

Uso barra espaciadora para mover msg horizontalmente

Ejemplo:

@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 

eso es todo !!

1

Puede probar este sencillo script. No usa archivos temporales. Solo asegúrese de tener el ejecutable "debug.exe" en cualquier carpeta listada en la variable de entorno "% path%".

@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 

Este script puede escribir su texto en cualquier posición de pantalla. También usando cualquier color.