How to have multiple colors in a Windows batch file?

前端 未结 12 1468
我寻月下人不归
我寻月下人不归 2020-11-22 01:05

I was wondering if its possible to have different colored text on the same line in a Windows batch file, for example if it says

echo hi world
相关标签:
12条回答
  • 2020-11-22 01:18

    Without external tools.This is a self-compiled bat/.net hybrid (should be saved as .BAT) that can be used on any system that have installed .net framework (it's a rare thing to see an windows without .NET framework even for the oldest XP/2003 installations) . It uses jscript.net compiler to create an exe capable to print strings with different background/foreground color only for the current line.

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

    Example coloroutput.bat -s "aa\nbb\n\u0025cc" -b 10 -f 3 -n -e

    You can also check carlos' color function -> http://www.dostips.com/forum/viewtopic.php?f=3&t=4453

    0 讨论(0)
  • 2020-11-22 01:19

    Windows 10 ((Version 1511, build 10586, release 2015-11-10)) supports ANSI colors.
    You can use the escape key to trigger the color codes.

    In the Command Prompt:

    echo ^[[32m HI ^[[0m
    

    echo Ctrl+[[32m HI Ctrl+[[0mEnter

    When using a text editor, you can use ALT key codes.
    The ESC key code can be created using ALT and NUMPAD numbers : Alt+027

    [32m  HI  [0m
    
    0 讨论(0)
  • 2020-11-22 01:20

    You should download chgcolor.zip from http://www.mailsend-online.com/blog/setting-text-color-in-a-batch-file.html and also download echoj.zip from www.mailsend-online.com/blog/?p=41 They're both towards the bottom of the page. Extract both folders to the desktop and copy the executables(.exe files) from inside the extracted folders to the C:\Windows directory. This will allow them to be executed from the command line. Open up notepad and copy the following into it:

    @echo off

    chgcolor 03

    echoj "hi "

    chgcolor 0d

    echoj "world"

    chgcolor 07

    echoj $0a

    Save the file to the Desktop as hi.bat. Now open the command prompt and navigate to your Desktop folder and type "hi.bat" without the quotes. That should get you started besure to read both webpages to get a full tutorial.

    0 讨论(0)
  • 2020-11-22 01:24

    Several methods are covered in
    "51} How can I echo lines in different colors in NT scripts?"
    http://www.netikka.net/tsneti/info/tscmd051.htm

    One of the alternatives: If you can get hold of QBASIC, using colors is relatively easy:

      @echo off & setlocal enableextensions
      for /f "tokens=*" %%f in ("%temp%") do set temp_=%%~sf
      set skip=
      findstr "'%skip%QB" "%~f0" > %temp_%\tmp$$$.bas
      qbasic /run %temp_%\tmp$$$.bas
      for %%f in (%temp_%\tmp$$$.bas) do if exist %%f del %%f
      endlocal & goto :EOF
      ::
      CLS 'QB
      COLOR 14,0 'QB
      PRINT "A simple "; 'QB
      COLOR 13,0 'QB
      PRINT "color "; 'QB
      COLOR 14,0 'QB
      PRINT "demonstration" 'QB
      PRINT "By Prof. (emer.) Timo Salmi" 'QB
      PRINT 'QB
      FOR j = 0 TO 7 'QB
        FOR i = 0 TO 15 'QB
          COLOR i, j 'QB
          PRINT LTRIM$(STR$(i)); " "; LTRIM$(STR$(j)); 'QB
          COLOR 1, 0 'QB
          PRINT " "; 'QB
        NEXT i 'QB
        PRINT 'QB
      NEXT j 'QB
      SYSTEM 'QB
    
    0 讨论(0)
  • 2020-11-22 01:26

    If you have a modern Windows (that has powershell installed), the following may work fine as well

    call :PrintBright Something Something
    
      (do actual batch stuff here)
    
    call :PrintBright Done!
    goto :eof
    
    
    :PrintBright
    powershell -Command Write-Host "%*" -foreground "White"
    

    Adjust the color as you see fit.

    0 讨论(0)
  • 2020-11-22 01:28

    You can do multicolor outputs without any external programs.

    @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
    

    It uses the color feature of the findstr command.

    Findstr can be configured to output line numbers or filenames in a defined color.
    So I first create a file with the text as filename, and the content is a single <backspace> character (ASCII 8).
    Then I search all non empty lines in the file and in nul, so the filename will be output in the correct color appended with a colon, but the colon is immediatly removed by the <backspace>.

    EDIT: One year later ... all characters are valid

    @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"
    )
    
    rem Prepare a file "X" with only one dot
    <nul > X set /p ".=."
    
    call :color 1a "a"
    call :color 1b "b"
    call :color 1c "^!<>&| %%%%"*?"
    exit /b
    
    :color
    set "param=^%~2" !
    set "param=!param:"=\"!"
    findstr /p /A:%1 "." "!param!\..\X" nul
    <nul set /p ".=%DEL%%DEL%%DEL%%DEL%%DEL%%DEL%%DEL%"
    exit /b
    

    This uses the rule for valid path/filenames.
    If a \..\ is in the path the prefixed elemet will be removed completly and it's not necessary that this element contains only valid filename characters.

    0 讨论(0)
提交回复
热议问题