Цвет партии в строке - PullRequest
       3

Цвет партии в строке

24 голосов
/ 28 октября 2011

В пакете, вы можете иметь разные цвета в строке.Например, если у вас есть пакетный файл, скажите «Привет», «Как дела?»

Не могли бы вы иметь «Привет» синим цветом и «Как дела» зеленым?

(я знаюо команде color и о том, как она окрашивает фон и текст)

Ответы [ 9 ]

28 голосов
/ 28 октября 2011

Вы можете сделать это без какой-либо внешней программы.Вот то, к чему я пришел пару дней назад.Работает очень хорошо.

@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 <a href="https://stackoverflow.com/users/463115/jeb">jeb</a>
<a href="/2999517/kak-imet-neskolko-tsvetov-v-komandnom-faile-windows#2999536">His post can be found here</a>
5 голосов
/ 29 октября 2011

Пакетный файл ниже создает файл 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"

EDIT

Я немного изменил программу 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, поэтому пароль имеет элементарное шифрование.Например, чтобы проверить, был ли введенный пароль «Pass»:

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
3 голосов
/ 06 июля 2014

Сохранить этот код как .bat (это самокомпилируемый .net hybrid):

@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;
3 голосов
/ 05 ноября 2011

Вы можете попробовать это с небольшой командой:

@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 голосов
/ 12 августа 2015

Сохранить как 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
2 голосов
/ 22 января 2014
@echo off

REM You can do it easily 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

exit
1 голос
/ 22 апреля 2016

Вы можете попробовать этот простой скрипт.Он не использует временные файлы.Просто убедитесь, что у вас есть исполняемый файл «debug.exe» в любой папке, указанной в переменной среды «% 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=0123456789ABCDEF
    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

Этот сценарий может написать ваш текст в любой позиции на экране.Также используя любой цвет.

1 голос
/ 13 февраля 2014

Да, это возможно с cmdcolor :

echo \033[94mHello
echo \033[92mHow are you
0 голосов
/ 29 сентября 2015

Просто нужно 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

это все !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...