Cách lặp lại với các màu khác nhau trong dòng lệnh Windows


217

Tôi biết rằng color bflệnh sẽ đặt màu của toàn bộ cửa sổ dòng lệnh nhưng tôi muốn in một dòng duy nhất bằng một màu khác.


1
Dường như tôi không có bất kỳ cách đơn giản nào để thêm mã màu thoát vào dòng lệnh Windows. :(
rui

rui, nếu Win10 là phiên bản HĐH chấp nhận được, hãy xem câu trả lời của Jens - đó phải chính xác là những gì bạn cần, vì câu hỏi này không bao giờ chấp nhận câu trả lời bảy năm trước: stackoverflow.com/a/38617204/3543437
kayleeFrye_onDeck

Câu trả lời:


284

Tôi muốn in một dòng duy nhất bằng một màu khác.

Sử dụng chuỗi thoát ANSI.

Windows trước 10 - không hỗ trợ riêng cho màu ANSI trên bảng điều khiển

Đối với phiên bản Windows dưới 10, bảng điều khiển lệnh Windows không hỗ trợ tô màu đầu ra theo mặc định. Bạn có thể cài đặt Cmder , ConEmu , ANSICON hoặc Mintty (được sử dụng theo mặc định trong GitBash và Cygwin) để thêm hỗ trợ tô màu cho bảng điều khiển lệnh Windows của bạn.

Windows 10 - Màu dòng lệnh

Bắt đầu từ Windows 10, bảng điều khiển Windows hỗ trợ Trình tự thoát ANSI và một số màu theo mặc định. Tính năng được cung cấp cùng với Cập nhật Ngưỡng 2 vào tháng 11 năm 2015.

Tài liệu MSDN

Cập nhật (05-2019): ColorTool cho phép bạn thay đổi bảng màu của bảng điều khiển. Đây là một phần của dự án Microsoft Terminal .

Bản giới thiệu

enter image description here

Lệnh hàng loạt

Các win10colors.cmdđã được viết bởi Michele về vị trí :

@echo off
cls
echo [101;93m STYLES [0m
echo ^<ESC^>[0m [0mReset[0m
echo ^<ESC^>[1m [1mBold[0m
echo ^<ESC^>[4m [4mUnderline[0m
echo ^<ESC^>[7m [7mInverse[0m
echo.
echo [101;93m NORMAL FOREGROUND COLORS [0m
echo ^<ESC^>[30m [30mBlack[0m (black)
echo ^<ESC^>[31m [31mRed[0m
echo ^<ESC^>[32m [32mGreen[0m
echo ^<ESC^>[33m [33mYellow[0m
echo ^<ESC^>[34m [34mBlue[0m
echo ^<ESC^>[35m [35mMagenta[0m
echo ^<ESC^>[36m [36mCyan[0m
echo ^<ESC^>[37m [37mWhite[0m
echo.
echo [101;93m NORMAL BACKGROUND COLORS [0m
echo ^<ESC^>[40m [40mBlack[0m
echo ^<ESC^>[41m [41mRed[0m
echo ^<ESC^>[42m [42mGreen[0m
echo ^<ESC^>[43m [43mYellow[0m
echo ^<ESC^>[44m [44mBlue[0m
echo ^<ESC^>[45m [45mMagenta[0m
echo ^<ESC^>[46m [46mCyan[0m
echo ^<ESC^>[47m [47mWhite[0m (white)
echo.
echo [101;93m STRONG FOREGROUND COLORS [0m
echo ^<ESC^>[90m [90mWhite[0m
echo ^<ESC^>[91m [91mRed[0m
echo ^<ESC^>[92m [92mGreen[0m
echo ^<ESC^>[93m [93mYellow[0m
echo ^<ESC^>[94m [94mBlue[0m
echo ^<ESC^>[95m [95mMagenta[0m
echo ^<ESC^>[96m [96mCyan[0m
echo ^<ESC^>[97m [97mWhite[0m
echo.
echo [101;93m STRONG BACKGROUND COLORS [0m
echo ^<ESC^>[100m [100mBlack[0m
echo ^<ESC^>[101m [101mRed[0m
echo ^<ESC^>[102m [102mGreen[0m
echo ^<ESC^>[103m [103mYellow[0m
echo ^<ESC^>[104m [104mBlue[0m
echo ^<ESC^>[105m [105mMagenta[0m
echo ^<ESC^>[106m [106mCyan[0m
echo ^<ESC^>[107m [107mWhite[0m
echo.
echo [101;93m COMBINATIONS [0m
echo ^<ESC^>[31m                     [31mred foreground color[0m
echo ^<ESC^>[7m                      [7minverse foreground ^<-^> background[0m
echo ^<ESC^>[7;31m                   [7;31minverse red foreground color[0m
echo ^<ESC^>[7m and nested ^<ESC^>[31m [7mbefore [31mnested[0m
echo ^<ESC^>[31m and nested ^<ESC^>[7m [31mbefore [7mnested[0m

11
@Jens A. Koch - nó không hoạt động trong bảng điều khiển windows 10 của tôi (cmd)
user3057544

40
Đồng ý. Cảm ơn vì bạn đã phản hồi. .cmdhoặc .bat- cả hai nên hoạt động. Nhưng, tôi nghĩ rằng tôi biết tại sao nó không hoạt động: có vẻ như biểu tượng thoát bị xóa khi đăng lên StackOverflow. Vui lòng không sao chép nội dung từ câu trả lời của tôi, thay vào đó hãy sử dụng nội dung từ đây: gist.githubusercontent.com/mlocati/iêu
Jens A. Koch

28
Tôi chưa bao giờ phải tạo một ESCnotepad ++ trước đây ... Bạn có thể làm điều này với mã ALT bằng cách sử dụng phím tắt và phím ALT bên trái: L-ALT+ 0+ 2+7
kayleeFrye_onDeck

3
Btw, như một người thực hiện và sử dụng rất nhiều đợt trong hầu hết các ngày, câu trả lời này đã nâng cao bộ công cụ tổng thể của tôi một cách thẩm mỹ! Sử dụng VB? Trời ơi không. Đây là những con đường để đi!
kayleeFrye_onDeck

4
Bạn có thể tạo một ESCký tự trong tệp Batch theo cách này:for /F %%a in ('echo prompt $E ^| cmd') do set "ESC=%%a"
Aacini

56

Đây là một kết hợp bat / .net tự biên dịch (nên được lưu dưới dạng .BAT) có thể được sử dụng trên bất kỳ hệ thống nào đã cài đặt khung .net (rất hiếm khi thấy một cửa sổ không có .NET framework ngay cả đối với XP / 2003 cũ nhất cài đặt). Nó sử dụng trình biên dịch jscript.net để tạo một exe có khả năng in các chuỗi với màu nền / màu nền khác nhau chỉ cho dòng hiện tại.

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

Đây là thông báo trợ giúp:

nhập mô tả hình ảnh ở đây

Ví dụ :

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

Bạn cũng có thể tìm thấy kịch bản này ở đây .

Bạn cũng có thể kiểm tra chức năng màu của carlos -> http://www.dostips.com/forum/viewtopic.php?f=3&t=4453


13
Thật tuyệt làm sao. Một tập tin bat biên dịch jscript có trong đó và chỉ khi nó cần - tôi rất ấn tượng. Thậm chí không biết có một trình biên dịch jscript chỉ ngồi đó chờ được sử dụng. Bạn nhận được "giải thưởng tuyệt vời" của tôi trong tháng. Bạn nên đề cập rằng việc sử dụng đầu tiên của nó sẽ chậm (vì biên dịch).
Graham

4
Tôi không cần màu sắc đủ tệ để đi đến cực điểm này, nhưng kỹ thuật này thực sự ấn tượng và tôi có thể thấy bản thân mình sử dụng nó ở nơi khác.
EM0

47

Đây không phải là một câu trả lời hay, nhưng nếu bạn biết máy trạm mục tiêu có Powershell, bạn có thể làm một cái gì đó như thế này (giả sử tập lệnh BAT / CMD):

CALL:ECHORED "Print me in red!"

:ECHORED
%Windir%\System32\WindowsPowerShell\v1.0\Powershell.exe write-host -foregroundcolor Red %1
goto:eof

Chỉnh sửa: (bây giờ đơn giản hơn!)

Đó là một câu trả lời cũ nhưng tôi đoán tôi sẽ làm rõ và đơn giản hóa một chút

img

PowerShell hiện được bao gồm trong tất cả các phiên bản Windows kể từ 7. Do đó, cú pháp cho câu trả lời này có thể được rút ngắn thành một hình thức đơn giản hơn:

  • những con đường không cần phải được xác định vì nó phải ở trong biến môi trường rồi.
  • các lệnh rõ ràng có thể được viết tắt . Ví dụ bạn có thể:
    • sử dụng -forethay vì-foregroundcolor
    • sử dụng -backthay vì-backgroundcolor
  • về cơ bản, lệnh cũng có thể được sử dụng ' nội tuyến ' echo
    thay vì (thay vì tạo một tệp bó riêng như trên).

Thí dụ:

powershell write-host -fore Cyan This is Cyan text
powershell write-host -back Red This is Red background

Thêm thông tin:

Danh sách đầy đủ các màu và nhiều thông tin có sẵn trong
- Tài liệu PowerShell choWrite-Host



14
Tuyệt vời, nó hoạt động với tôi, nhưng nó rất chậm.
18 giờ 37 phút

4
tôi nhận ra rằng đây là một câu trả lời cung cấp một giải pháp, nhưng powershell? ừm
SgtPooki

2
Đó là lý do tại sao tôi bắt đầu với "Đây không phải là một câu trả lời tuyệt vời". Tôi khá thích Powershell nhưng nó quá mức cho việc này. ANSICON sẽ tốt hơn nếu bạn có thể đối phó với việc triển khai nó cho các máy mục tiêu.
Iain

Cảm ơn bạn cho câu trả lời này. Tôi đã nhìn cao và thấp để tìm cách lặp lại đầu ra có màu từ một tệp bó trong Powershell và đây là cách duy nhất. Không chắc chắn tại sao phải mất quá nhiều thời gian để thực sự in nó (giống như chờ 1 giây với mỗi cuộc gọi) nhưng ít nhất tôi có thể làm được. Cảm ơn bạn!
pizzafilms

29

Windows 10 - TH2 trở lên:

(còn gọi là Phiên bản 1511, bản dựng 10586, phát hành 2015-11-10)

Tại Dấu nhắc lệnh:

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

Sử dụng các phím thực tế: echo Ctrl+ [[32m HI Ctrl+[[0mEnter

Bạn sẽ thấy một chữ "HI" màu xanh lá cây bên dưới nó.

Mã số có thể được tìm thấy ở đây:

Sổ tay:

Để lưu phần này vào notepad, bạn có thể nhập ESC vào nó bằng cách sử dụng: Alt+ 027với numpad, sau đó là [32mphần. Một mẹo khác khi tôi ở trên máy tính xách tay, chuyển hướng dòng trên thành tệp để bắt đầu, sau đó cắt và dán:

echo echo ^[[32m HI ^[[0m >> batch_file.cmd

3
Alt + 027 chính xác là những gì tôi cần!
Aleksander Stelmaczonek

1
Alt + 027 không hoạt động trong Eclipse / Java .. cũng đã thử \033nhưng không ... làm cách nào tôi có thể làm điều này trong Java?
derHugo

trên windows 10 trở lên, cái này hoạt động trong trình soạn thảo DOS và Notepad ++. Cảm ơn!
Thiếu niên Mayhé

17

Bạn chỉ có thể tạo các tệp có tên của từ cần in, sử dụng findstr có thể in màu và sau đó xóa tệp. Hãy thử ví dụ này:

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

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

goto :eof

:ColorText
echo off
<nul set /p ".=%DEL%" > "%~2"
findstr /v /a:%1 /R "^$" "%~2" nul
del "%~2" > nul 2>&1
goto :eof

Chạy color /?để có được một danh sách các màu sắc.


3
Điều này đặt màu trong dòng lệnh windows. Bạn có thể giải thích những gì nó làm?
FeatureCreep

2
Ok, nó chỉ tạo các tệp có tên của từ cần in, sử dụng findstr có thể in màu và sau đó xóa tệp.
FeatureCreep

2
Thật ấn tượng! Lưu ý rằng các mã màu là sai. Chạy "màu /?" để xem mã màu thực tế.
yoyo

3
Lưu ý rằng findstr chỉ có thể ghi tên tập tin , có nghĩa là bạn không thể sử dụng thủ thuật này cho các chuỗi có chứa các ký tự đường dẫn bất hợp pháp.
yoyo

3
Cũng cần lưu ý, điều này sẽ ghi đè lên các tệp trong cùng thư mục nếu chúng chia sẻ tên của những gì bạn đang cố in ... điều đó không tốt chút nào.
BrainSlugs83

14

Bạn có thể sử dụng ANSICON để kích hoạt mã đầu cuối ANSI trong các phiên bản Windows cũ hơn. Có các phiên bản 32 và 64 bit mà tôi đã sử dụng trong Windows XP và Windows 7.


Không thể làm cho nó hoạt động trên windows 8.1. Sự cố mỗi khi tôi cố gắng và cài đặt.
EHerman

@EHerman Có lẽ câu hỏi này sẽ giúp ích.
Bryan Ash

ANSICON không cần thiết trong các phiên bản sau của Win 10. Đừng thử sử dụng nó ở đó.
Gringo Suave

6

Tôi đã rất khó chịu vì thiếu màu sắc thích hợp trong cmd, vì vậy tôi đã tiếp tục và tạo ra cmdcolor . Đây chỉ là một proxy xuất sắc, tìm kiếm một bộ trình tự kiểm soát ANSI / VT100 giới hạn (nói cách khác, như trong bash), nghĩa là echo \033[31m RED \033[0m DEFAULT | cmdcolor.exe.

Sử dụng và tải về .


Điều này thật tuyệt, và tôi đã đưa nó vào hệ thống menu của một kịch bản xây dựng khổng lồ trong công việc của tôi. Chỉ có thịt bò tôi có là nhị phân bạn cung cấp trên trang đó nhắm mục tiêu 64 bit, vì vậy nó sẽ không hoạt động trên máy xây dựng 32 bit của chúng tôi. Nhưng nó không có vấn đề gì chỉ cần lấy nguồn và tự biên dịch.
thóc

Nhưng đó là 32-bit :) Đây là đầu ra của tệp GNU:cmdcolor.exe; PE32 executable for MS Windows (console) Intel 80386 32-bit
Alec Mev

Thật kỳ lạ ... XP Pro đã từ chối chạy nó, nhưng nó chạy tốt trên hộp Win7 64 của tôi. Tôi đã biên dịch bằng Visual C ++, nhắm mục tiêu Win32, và nó vẫn ổn.
thóc

Hả ... có lẽ là vì upx. Bạn có thể liên hệ với tôi qua e-mail không?
Alec Mev

6

Tôi đã xem xét điều này bởi vì tôi muốn giới thiệu một số màu văn bản đơn giản cho tệp Batch Win7. Đây là những gì tôi đã đưa ra. Cảm ơn bạn đã giúp đỡ.

@echo off
cls && color 08

rem .... the following line creates a [DEL] [ASCII 8] [Backspace] character to use later
rem .... All this to remove [:]
for /F "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do rem"') do (set "DEL=%%a")

echo.

<nul set /p="("
call :PainText 09 "BLUE is cold"    && <nul set /p=")  ("
call :PainText 02 "GREEN is earth"  && <nul set /p=")  ("
call :PainText F0 "BLACK is night"  && <nul set /p=")"
echo.
<nul set /p="("
call :PainText 04 "RED is blood"    && <nul set /p=")  ("
call :PainText 0e "YELLOW is pee"   && <nul set /p=")  ("
call :PainText 0F "WHITE all colors"&& <nul set /p=")"

goto :end

:PainText
<nul set /p "=%DEL%" > "%~2"
findstr /v /a:%1 /R "+" "%~2" nul
del "%~2" > nul
goto :eof

:end
echo.
pause

5

Có một câu trả lời được chấp nhận với hơn 250 lượt upvote. Lý do tôi vẫn đang đóng góp làescape nhân vật cần thiết cho tiếng vang không được nhiều biên tập viên (tôi đang sử dụng, ví dụ, MS Code) và tất cả các giải pháp khác yêu cầu một số phần mềm của bên thứ ba (không phải mặc định của Windows).

Công việc xung quanh chỉ sử dụng các lệnh bó đơn giản đang sử dụng PROMPTthay vì ECHO. Các PROMPTlệnh chấp nhận escapenhân vật trong một cách nào-biên tập thân thiện như một $Echuỗi ký tự. (Đơn giản chỉ cần thay thế Esctrong mã ASCII thoát ) với $E.

Đây là một mã demo:

@ECHO OFF

    :: Do not pollute environment with the %prompt.bak% variable
    :: ! forgetting ENDLOCAL at the end of the batch leads to prompt corruption
    SETLOCAL

    :: Old prompt settings backup
    SET prompt.bak=%PROMPT%

    :: Entering the "ECHO"-like section

        :: Forcing prompt to display after every command (see below)
        ECHO ON

        :: Setting the prompt using the ANSI Escape sequence(s)
        :: - Always start with $E[1A, otherwise the text would appear on a next line
        :: - Then the decorated text follows
        :: - And it all ends with $E30;40m, which makes the following command invisible
        ::   - assuming default background color of the screen
        @ PROMPT $E[1A$E[30;42mHELLO$E[30;40m

        :: An "empty" command that forces the prompt to display. 
        :: The word "rem" is displayed along with the prompt text but is made invisible
        rem

        :: Just another text to display
        @ PROMPT $E[1A$E[33;41mWORLD$E[30;40m
        rem

        :: Leaving the "ECHO"-like section
        @ECHO OFF

    :: Or a more readable version utilizing the cursor manipulation ASCII ESC sequences

        :: the initial sequence
        PROMPT $E[1A
        :: formating commands
        PROMPT %PROMPT%$E[32;44m
        :: the text
        PROMPT %PROMPT%This is an "ECHO"ed text...
        :: new line; 2000 is to move to the left "a lot"
        PROMPT %PROMPT%$E[1B$E[2000D
        :: formating commands fro the next line
        PROMPT %PROMPT%$E[33;47m
        :: the text (new line)
        PROMPT %PROMPT%...spreading over two lines
        :: the closing sequence
        PROMPT %PROMPT%$E[30;40m

        :: Looks like this without the intermediate comments:
        :: PROMPT $E[1A
        :: PROMPT %PROMPT%$E[32;44m
        :: PROMPT %PROMPT%This is an "ECHO"ed text...
        :: PROMPT %PROMPT%$E[1B$E[2000D
        :: PROMPT %PROMPT%$E[33;47m
        :: PROMPT %PROMPT%...spreading over two lines
        :: PROMPT %PROMPT%$E[30;40m

        :: show it all at once!
        ECHO ON
        rem
        @ECHO OFF

    :: End of "ECHO"-ing

    :: Setting prompt back to its original value
    :: - We prepend the settings with $E[37;40m in case
    ::   the original prompt settings do not specify color
    ::   (as they don't by default).
    :: - If they do, the $E[37;40m will become overridden, anyway.
    :: ! It is important to write this command 
    ::   as it is with `ENDLOCAL` and in the `&` form.
    ENDLOCAL & PROMPT $E[37;40m%prompt.bak%

EXIT /B 0

LƯU Ý: Hạn chế duy nhất là kỹ thuật này va chạm với cài đặt màu cmd của người dùng ( colorlệnh hoặc cài đặt) nếu không biết rõ.

- Hy vọng điều này sẽ giúp vì thi là giải pháp duy nhất được tôi chấp nhận vì những lý do được đề cập ở đầu. -

BIÊN TẬP:

Dựa trên các nhận xét, tôi kèm theo một đoạn trích khác lấy cảm hứng từ @Jeb. Nó:

  • Chỉ ra cách lấy và sử dụng thời gian chạy ký tự "Esc" (thay vì nhập nó vào trình chỉnh sửa) (giải pháp của Jeb)
  • Sử dụng ECHOlệnh "bản địa"
  • Vì vậy, nó không ảnh hưởng đến PROMPTgiá trị địa phương
  • Chứng tỏ rằng việc tô màu ECHOđầu ra chắc chắn ảnh hưởng đến PROMPTmàu sắc, do đó, màu sắc phải được đặt lại
@ECHO OFF

    :: ! To observe color effects on prompt below in this script
    ::   run the script from a fresh cmd window with no custom
    ::   prompt settings

    :: Only not to pollute the environment with the %\e% variable (see below)
    :: Not needed because of the `PROMPT` variable
    SETLOCAL

        :: Parsing the `escape` character (ASCII 27) to a %\e% variable
        :: Use %\e% in place of `Esc` in the [http://ascii-table.com/ansi-escape-sequences.php]
        FOR /F "delims=#" %%E IN ('"prompt #$E# & FOR %%E IN (1) DO rem"') DO SET "\e=%%E"

        :: Demonstrate that prompt did not get corrupted by the previous FOR
        ECHO ON
        rem : After for
        @ECHO OFF

        :: Some fancy ASCII ESC staff
        ECHO [          ]
        FOR /L %%G IN (1,1,10) DO (
            TIMEOUT /T 1 > NUL
            ECHO %\e%[1A%\e%[%%GC%\e%[31;43m.
            ECHO %\e%[1A%\e%[11C%\e%[37;40m]
        )

        :: ECHO another decorated text
        :: - notice the `%\e%[30C` cursor positioning sequence
        ::   for the sake of the "After ECHO" test below
        ECHO %\e%[1A%\e%[13C%\e%[32;47mHELLO WORLD%\e%[30C

        :: Demonstrate that prompt did not get corrupted by ECHOing
        :: neither does the cursor positioning take effect.
        :: ! But the color settings do.
        ECHO ON
        rem : After ECHO
        @ECHO OFF

    ENDLOCAL

    :: Demonstrate that color settings do not reset
    :: even when out of the SETLOCAL scope
    ECHO ON
    rem : After ENDLOCAL
    @ECHO OFF

    :: Reset the `PROMPT` color
    :: - `PROMPT` itself is untouched so we did not need to backup it.
    :: - Still ECHOING in color apparently collide with user color cmd settings (if any).
    :: ! Resetting `PROMPT` color this way extends the `PROMPT`
    ::   by the initial `$E[37;40m` sequence every time the script runs.
    :: - Better solution then would be to end every (or last) `ECHO` command
    ::   with the `%\e%[37;40m` sequence and avoid setting `PROMPT` altogether.
    ::   which makes this technique preferable to the previous one (before EDIT)
    :: - I am keeping it this way only to be able to
    ::   demonstrate the `ECHO` color effects on the `PROMPT` above.
    PROMPT $E[37;40m%PROMPT%

    ECHO ON
    rem : After PROMPT color reset
    @ECHO OFF

EXIT /B 0

Kỹ thuật rất thú vị. Tôi sẽ xem nếu tôi cần cập nhật github.com/VonC/batcolors với nó. Nâng cao.
VonC

@VonC Bạn chỉ cần tạo một biến, chứa chatacter thoát mà không cần nhập nó vào trình chỉnh sửa. for /F "delims=#" %%E in ('"prompt #$E# & for %%E in (1) do rem"') do set "\e=%%E"
Jeb

@jeb Bạn có nghĩa là "trái ngược với echođược sử dụng trong batcolors / echo.bat "?
VonC

@VonC Có, thay thế set ASCII27=←bằng for /F "delims=#" %%E in ('"prompt #$E# & for %%E in (1) do rem"') do set "ASCII27=%%E". Điều này sử dụng ký tự thoát được tạo bởi lệnh prompt, mà không thay đổi dấu nhắc vĩnh viễn (vì promptlệnh được thực thi trong một tiến trình con). Btw. Bạn echos.batcó một số tiềm năng tối ưu hóa ...
Jeb

@jeb "echos.bat của bạn có một số tiềm năng tối ưu hóa": Tôi chắc chắn về điều đó :) Yêu cầu kéo được chào đón (cả cho ASCII27 và các tối ưu hóa khác)
VonC

4

Tôi đang thêm một câu trả lời để giải quyết một vấn đề được lưu ý trong một số nhận xét ở trên: mã màu ansi nội tuyến có thể hoạt động sai khi ở trong vòng lặp FOR (thực ra, trong bất kỳ khối mã được ngoặc đơn nào). Mã .bat dưới đây thể hiện (1) việc sử dụng mã màu nội tuyến, (2) lỗi màu có thể xảy ra khi mã màu nội tuyến được sử dụng trong vòng lặp FOR hoặc trong khối mã được ngoặc đơn và (3) giải pháp cho vấn đề. Khi mã .bat thực thi, các kiểm tra 2 và 3 chứng minh lỗi mã màu và kiểm tra 4 cho thấy không có lỗi nào vì nó thực hiện giải pháp.

[EDIT 2020-04-07: Tôi tìm thấy một giải pháp khác có lẽ hiệu quả hơn là gọi một chương trình con. Kèm theo cụm từ FINDSTR trong ngoặc đơn, như trong dòng sau:

   echo success | (findstr /R success)

KẾT THÚC]

Lưu ý: Theo kinh nghiệm (giới hạn) của tôi, vấn đề về mã màu chỉ xuất hiện sau khi đầu vào được dẫn đến FINDSTR bên trong khối mã. Đó là cách .bat sau đây tái tạo vấn đề. Có thể vấn đề về mã màu là tổng quát hơn sau khi chuyển sang FINDSTR. Nếu ai đó có thể giải thích bản chất của vấn đề và nếu có cách nào tốt hơn để giải quyết nó, tôi sẽ đánh giá cao nó.

@goto :main
:resetANSI
EXIT /B
rem  The resetANSI subroutine is used to fix the colorcode
rem  bug, even though it appears to do nothing.

:main
@echo off
setlocal EnableDelayedExpansion

rem  Define some useful colorcode vars:
for /F "delims=#" %%E in ('"prompt #$E# & for %%E in (1) do rem"') do set "ESCchar=%%E"
set "green=%ESCchar%[92m"
set "yellow=%ESCchar%[93m"
set "magenta=%ESCchar%[95m"
set "cyan=%ESCchar%[96m"
set "white=%ESCchar%[97m"
set "black=%ESCchar%[30m"

echo %white%Test 1 is NOT in a FOR loop nor within parentheses, and color works right.
   echo %yellow%[Test 1] %green%This is Green, %magenta%this is Magenta, and %yellow%this is Yellow.
   echo %Next, the string 'success' will be piped to FINDSTR...
   echo success | findstr /R success
   echo %magenta%This is magenta and FINDSTR found and displayed 'success'.%yellow%
   echo %green%This is green.
echo %cyan%Test 1 completed.

echo %white%Test 2 is within parentheses, and color stops working after the pipe to FINDSTR.
(  echo %yellow%[Test 2] %green%This is Green, %magenta%this is Magenta, and %yellow%this is Yellow.
   echo %Next, the string 'success' will be piped to FINDSTR...
   echo success | findstr /R success
   echo %magenta%This is supposed to be magenta and FINDSTR found and displayed 'success'.
   echo %green%This is supposed to be green.
)
echo %cyan%Test 2 completed.

echo %white%Test 3 is within a FOR loop, and color stops working after the pipe to FINDSTR.
for /L %%G in (3,1,3) do (
   echo %yellow%[Test %%G] %green%This is Green, %magenta%this is Magenta, and %yellow%this is Yellow.
   echo %Next, the string 'success' will be piped to FINDSTR...
   echo success | findstr /R success
   echo %magenta%This is supposed to be magenta and FINDSTR found and displayed 'success'.
   echo %green%This is supposed to be green.
)
echo %cyan%Test 3 completed.

echo %white%Test 4 is in a FOR loop but color works right because subroutine :resetANSI is 
echo called after the pipe to FINDSTR, before the next color code is used.
for /L %%G in (4,1,4) do (
   echo %yellow%[Test %%G] %green%This is Green, %magenta%this is Magenta, and %yellow%this is Yellow.
   echo %Next, the string 'success' will be piped to FINDSTR...
   echo success | findstr /R success
   call :resetANSI
   echo %magenta%This is magenta and FINDSTR found and displayed 'success'.
   echo %green%This is green.
)
echo %cyan%Test 4 completed.%white%

EXIT /B


1

Tôi vừa chuyển đổi từ Win 7 Home sang Win 10 Pro và muốn thay thế lô tôi gọi từ các lô khác sang thông tin màu. Xem lại những gì được thảo luận ở trên tôi sử dụng những điều sau đây sẽ trực tiếp thay thế đợt trước của tôi. LƯU Ý việc thêm "~" vào tin nhắn để có thể sử dụng tin nhắn có khoảng trắng. Thay vì nhớ mã, tôi sử dụng các chữ cái cho các màu tôi cần.

Nếu% 2 chứa khoảng trắng yêu cầu "..."% 1 Màu mạnh trên màu đen: R = Red G = GREEN Y = YELLOW W = WHITE

ECHO OFF
IF "%1"=="R" ECHO ^[91m%~2[0m
IF "%1"=="G" ECHO ^[92m%~2[0m
IF "%1"=="Y" ECHO ^[93m%~2[0m
IF "%1"=="W" ECHO ^[97m%~2[0m

0

Bạn sẽ cần phải lặp lại một chuỗi mã thoát ANSI để thay đổi màu văn bản: http://en.wikipedia.org/wiki/ANSI_escape_code

Một nguồn rất tốt khác của các mã thoát này là http://ascii-table.com/ansi-escape- resultences.php


Điều đó có vẻ rất hứa hẹn nhưng làm cách nào để tôi phát ra ký tự Escape - ASCII 27 trong lệnh echo?
rui

10
Bảng điều khiển Windows không có trình giả lập Terminal. Trình tự thoát ANSI đơn giản là không thể làm việc. Bạn có thể dỗ Windows 9x làm như vậy bằng cách tải ANSI.SYS nhưng bây giờ chúng ta đã đi được một chút.
Joey

0

Đặt các dòng sau vào một tệp được gọi ColourText.bastrên máy tính để bàn của bạn.

Imports System
Imports System.IO
Imports System.Runtime.InteropServices
Imports Microsoft.Win32

Public Module MyApplication  
Public Declare Function GetStdHandle Lib "kernel32" Alias "GetStdHandle" (ByVal nStdHandle As Long) As Long
Public Declare Function SetConsoleTextAttribute Lib "kernel32" Alias "SetConsoleTextAttribute" (ByVal hConsoleOutput As Long, ByVal wAttributes As Long) As Long
Public Const STD_ERROR_HANDLE = -12&
Public Const STD_INPUT_HANDLE = -10&
Public Const STD_OUTPUT_HANDLE = -11&

Sub Main()
    Dim hOut as Long
    Dim Ret as Long
    Dim Colour As Long
    Dim Colour1 As Long
    Dim Text As String
    hOut  = GetStdHandle(STD_OUTPUT_HANDLE)
    Colour = CLng("&h" & Split(Command(), " ")(0))
    Colour1 = Clng("&h" & Split(Command(), " ")(1))
    Text = Mid(Command(), 7)
    Ret = SetConsoleTextAttribute(hOut,  Colour)
    Console.Out.WriteLine(text)
    Ret = SetConsoleTextAttribute(hOut, Colour1)
End Sub
End Module

Lưu nó và gõ như sau trong một dấu nhắc lệnh.

"C:\Windows\Microsoft.NET\Framework\v4.0.30319\vbc.exe" /target:exe /out:"%userprofile%\desktop\ColourText.exe" "%userprofile%\desktop\ColourText.bas" /verbose

Một tệp có tên ColourText.exe sẽ xuất hiện trên màn hình của bạn. Di chuyển nó vào thư mục Windows .

Để sử dụng, bạn phải sử dụng hai mã ký tự để đặt màu, ví dụ như 01không 1.

ColourText ColourOfText ColourOfTextWhenFinished Text

EG Để đặt màu xanh trên nền trắng bằng cách không chuyển bất kỳ văn bản nào, sau đó màu đỏ trên văn bản màu trắng, kết thúc bằng màu xanh trên màu xám.

ColourText F1 F1
ColourText F2 71 This is green on white

hoặc là

ColourText F1 F1
cls
ColourText F4 F4
Echo Hello
Echo Hello today
ColourText F1 F1

Ngoài ra CLSlệnh trở nên thú vị. Colorlệnh không có tham số đặt lại tất cả các màu để khởi động màu.

Để có được mã màu, thêm các số sau đây với nhau. Sử dụng Máy tính trong chế độ lập trình viên. Đây là những số hex. Chúng có thể được thêm vào với nhau, ví dụ Red + Blue + FG Intense = 13 = D. Vì 10+ không được sử dụng, nền sẽ có màu đen. Mã màu PHẢI là hai ký tự, ví dụ 08không 8.

FOREGROUND_RED = &H4     '  text color contains red.
FOREGROUND_INTENSITY = &H8     '  text color is intensified.
FOREGROUND_GREEN = &H2     '  text color contains green.
FOREGROUND_BLUE = &H1     '  text color contains blue.
BACKGROUND_BLUE = &H10    '  background color contains blue.
BACKGROUND_GREEN = &H20    '  background color contains green.
BACKGROUND_INTENSITY = &H80    '  background color is intensified.
BACKGROUND_RED = &H40    '  background color contains red.

2
Mặc dù thú vị, nhưng không phải ai cũng sẽ cài đặt SDK, nhưng thực tế, rất ít người, tôi nghĩ vậy.
Abel

0

Để làm việc này trên Windows 10, bạn có thể bật cờ này : ENABLE_VIRTUAL_TERMINAL_PROCESSING.

Với khóa đăng ký này, bạn có thể đặt mặc định này

[HKCU\Console] VirtualTerminalLevel dword 0x1


0

Một cách khác là sử dụng NodeJS .

Đây là một ví dụ:

const os = require('os');
const colors = require('colors');

console.log("Operative System:".green,os.type(),os.release());
console.log("Uptime:".blue,os.uptime());

Và đây là kết quả:

nhập mô tả hình ảnh ở đây


0

Như Glenn Slayden đã nói trong câu trả lời này , bạn có thể thêm vào sổ đăng ký giá trị phù hợp để làm cho cmd "nhiều màu sắc hơn".

May mắn thay, mặc định toàn cầu có thể được thay đổi từ chọn tham gia sang từ chối. Khóa đăng ký tại HKEY_CURRENT_USER \ Console \ VirtualTerminalLevel đặt hành vi mặc định toàn cầu để xử lý các chuỗi thoát ANSI. Tạo khóa DWORD (nếu cần) và đặt giá trị của nó thành 1 thành bật toàn cầu (hoặc 0 để vô hiệu hóa `) xử lý ANSI theo mặc định.


0

Đặt màu cho các báo cáo nhật ký trong powershell không phải là một người bạn lớn. bạn có thể sử dụng -ForegroundColortham số.

Để viết một tin nhắn xác nhận.

Write-Host "Process executed Successfully...." -ForegroundColor Magenta

Để viết một thông báo lỗi.

Write-Host "Sorry an unexpected error occurred.." -ForegroundColor Red

Để viết một thông điệp tiến bộ .

Write-Host "Working under pocess..." -ForegroundColor Green

0
call :color_echo "blue" "blue txt"
call :color_echo "red" "red txt"
echo "white txt"


REM : https://www.robvanderwoude.com/ansi.php
:color_echo
    @echo off

    set "color=%~1"
    set "txt=%~2"

    set ESC=
    set black=%ESC%[30m
    set red=%ESC%[31m
    set green=%ESC%[32m
    set yellow=%ESC%[33m
    set blue=%ESC%[34m
    set magenta=%ESC%[35m
    set cyan=%ESC%[36m
    set white=%ESC%[37m

    if "%~1" == "black"   set "color=!black!"
    if "%~1" == "red"     set "color=!red!"
    if "%~1" == "green"   set "color=!green!"
    if "%~1" == "yellow"  set "color=!yellow!"
    if "%~1" == "blue"    set "color=!blue!"
    if "%~1" == "magenta" set "color=!magenta!"
    if "%~1" == "cyan"    set "color=!cyan!"
    if "%~1" == "white"   set "color=!white!"

    echo | set /p="!color!!txt!"
    echo.

    REM : return to standard white color
    echo | set /p="!white!"

    REM : exiting the function only
    EXIT /B 0

%ESC%trống rỗng, vì vậy điều này sẽ không hoạt động. echo !white!đặt màu thành màu trắng. Để trở về màu mặc định (bất kể cài đặt của người dùng là gì): colorlệnh không có tham số thực hiện điều đó.
Stephan

-1

Chúng tôi đã từng làm điều này với mã đầu cuối ANSI . Không chắc chắn nếu chúng vẫn hoạt động, nhưng bạn có thể thử chúng.


1
Đây có thể là một câu trả lời tốt nếu nó giải thích cách sử dụng các mã đầu cuối ANSI này ...
Davor Josipovic

1
Tôi nghĩ rằng bài báo tôi liên kết để giải thích nó. Bạn đã đọc nó? BTW: nó nói rằng họ không làm việc trên win32.
Michael J

Theo đường chéo. Bài viết giải thích mã thiết bị đầu cuối ANSI là gì, nhưng không thực sự sử dụng chúng từ trong cmd, để trả lời câu hỏi. (Vâng ... thực tế là bảng điều khiển Win32 không được hỗ trợ khiến chúng hơi không liên quan đến câu hỏi.)
Davor Josipovic

1
Bạn sẽ chỉ lặp lại mã ANSI đến thiết bị đầu cuối. ví dụ: "echo ← [6m" sẽ đặt màu văn bản của thiết bị đầu cuối thành 6 (màu đỏ). Lưu ý "←" là ASCII 27 (thoát). Bạn có thể nhập nó bằng cách giữ "ALT" và gõ "27" trên bàn phím số. Tôi vừa googled nó và phát hiện ra bạn vẫn có thể sử dụng lệnh "color" để làm điều tương tự (mặc dù các mã số là khác nhau). "Màu 4" giúp bạn có văn bản màu đỏ.
Michael J

-6

Bạn có thể sử dụng lệnh màu để thay đổi màu của toàn bộ bảng điều khiển

Color 0F

Là màu đen và trắng

Color 0A 

Là màu đen và màu xanh lá cây


20
Rất vui được biết. Thật không may, điều này thay đổi màu sắc của toàn bộ bảng điều khiển và câu hỏi là làm thế nào để thay đổi một dòng duy nhất (hoặc một phần của nó) ..
Luke

6
OP đã tuyên bố rằng anh ta quen thuộc với lệnh này và vấn đề là nó thay đổi toàn bộ giao diện điều khiển chứ không phải là một dòng cụ thể.
Randall Flagg

5
Có thực sự không đáp ứng, nhưng điều đó vẫn hữu ích để biết.
CuriousMarc 17/08/2015
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.