วิธี echo ด้วยสีที่ต่างกันในบรรทัดคำสั่ง Windows


217

ฉันรู้ว่าcolor bfคำสั่งตั้งค่าสีของหน้าต่างบรรทัดคำสั่งทั้งหมด แต่ฉันต้องการพิมพ์หนึ่งบรรทัดในสีอื่น


1
ดูเหมือนว่าฉันไม่มีวิธีง่ายๆในการเพิ่มรหัสสีที่ใช้ Escape ในบรรทัดคำสั่งของ Windows :(
rui

rui ถ้า Win10 เป็นระบบปฏิบัติการที่ยอมรับได้ให้ตรวจสอบคำตอบของ Jens - มันควรเป็นอย่างที่คุณต้องการเพราะคำถามนี้ไม่เคยยอมรับคำตอบเมื่อเจ็ดปีที่แล้ว: stackoverflow.com/a/38617204/3543437
kayleeFrye_onDeck

คำตอบ:


284

ฉันต้องการพิมพ์หนึ่งบรรทัดในสีอื่น

ใช้ ANSI Escape Sequences

Windows ก่อน 10 - ไม่รองรับสีมาตรฐาน ANSI บนคอนโซล

สำหรับเวอร์ชั่น Windows ต่ำกว่า 10 คอนโซลคำสั่ง Windows ไม่รองรับการระบายสีเอาท์พุทตามค่าเริ่มต้น คุณสามารถติดตั้งCmder , ConEmu , ANSICONหรือMintty (ใช้เป็นค่าเริ่มต้นใน GitBash และ Cygwin) เพื่อเพิ่มการรองรับการระบายสีให้กับคอนโซลคำสั่ง Windows ของคุณ

Windows 10 - สีของบรรทัดคำสั่ง

เริ่มต้นจาก Windows 10 คอนโซล Windows รองรับ ANSI Escape Sequences และบางสีตามค่าเริ่มต้น คุณลักษณะนี้มาพร้อมกับการอัพเดท Threshold 2 ในเดือนพฤศจิกายน 2558

เอกสาร MSDN

Update (05-2019): ColorToolช่วยให้คุณสามารถเปลี่ยนชุดรูปแบบสีของคอนโซล มันเป็นส่วนหนึ่งของไมโครซอฟท์เทอร์มิโครงการ

การสาธิต

ป้อนคำอธิบายรูปภาพที่นี่

ชุดคำสั่ง

win10colors.cmdเขียนโดยMichele Locati :

@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 - มันไม่ทำงานในคอนโซล windows 10 ของฉัน (cmd)
3057544

40
ตกลง. ขอบคุณสำหรับความคิดเห็น. .cmdหรือ.bat- ทั้งสองควรทำงาน แต่ฉันคิดว่าฉันรู้ว่าทำไมมันไม่ทำงาน: ดูเหมือนว่าจะมีการลบสัญลักษณ์หนีออกเมื่อโพสต์ไปที่ StackOverflow โปรดอย่าคัดลอกเนื้อหาจากคำตอบของฉันใช้เนื้อหาจากที่นี่แทน: gist.githubusercontent.com/mlocati/ …
Jens A. Koch

28
ฉันไม่เคยสร้าง a ESCnotepad ++ มาก่อน ... คุณสามารถทำได้ด้วย ALT-codes โดยใช้ numpad และปุ่ม ALT ด้านซ้าย: L-ALT+ 0+ 2+7
kayleeFrye_onDeck

3
Btw ในฐานะคนที่สร้างและใช้งานหลายวันเกือบทุกคำตอบนี้ได้ปรับปรุงชุดเครื่องมือโดยรวมของฉันอย่างสวยงาม! ใช้ VB? ไม่มีทาง. นี่คือวิธีที่จะไป!
kayleeFrye_onDeck

4
คุณสามารถสร้างESCตัวละครในไฟล์แบทช์ด้วยวิธีนี้:for /F %%a in ('echo prompt $E ^| cmd') do set "ESC=%%a"
Aacini

56

นี่คือค้างคาวไฮบริด / .net ที่คอมไพล์ด้วยตัวเอง(ควรบันทึกเป็น.BAT) ที่สามารถใช้กับระบบใด ๆ ที่ติดตั้งเฟรมเวิร์ก. net (เป็นเรื่องยากที่จะเห็นหน้าต่างที่ไม่มีเฟรมเวิร์ก. NET แม้กระทั่ง XP / 2003 ที่เก่าแก่ที่สุด การติดตั้ง) มันใช้คอมไพเลอร์ jscript.net เพื่อสร้าง exe ที่สามารถพิมพ์สตริงที่มีสีพื้นหลัง / พื้นหน้าต่างกันสำหรับบรรทัดปัจจุบันเท่านั้น

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

นี่คือข้อความช่วยเหลือ:

ป้อนคำอธิบายรูปภาพที่นี่

ตัวอย่าง :

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

นอกจากนี้คุณยังสามารถหาสคริปต์นี้ที่นี่

นอกจากนี้คุณยังสามารถตรวจสอบฟังก์ชั่นสีของ carlos -> http://www.dostips.com/forum/viewtopic.php?f=3&t=4453


13
เท่ห์แค่ไหน ไฟล์ค้างคาวที่รวบรวม jscript ที่อยู่ในนั้นและหากจำเป็นต้องใช้ - ฉันประทับใจมาก ไม่รู้ด้วยซ้ำว่ามี jscript compiler แค่นั่งรอที่จะใช้ คุณได้รับ "สุดยอดรางวัล" ในเดือนนี้ คุณควรพูดถึงว่าการใช้ครั้งแรกมันจะช้า (เพราะคอมไพล์)
เกรแฮม

4
ฉันไม่ต้องการสีที่ไม่ดีพอที่จะไปถึงจุดสุดยอดนี้ แต่เทคนิคนั้นน่าประทับใจจริงๆและฉันสามารถเห็นตัวเองใช้ที่อื่น
EM0

47

นี่ไม่ใช่คำตอบที่ดี แต่ถ้าคุณรู้ว่าเวิร์กสเตชันเป้าหมายมี Powershell คุณสามารถทำสิ่งนี้ได้ (สมมติว่าเป็น BAT / CMD script):

CALL:ECHORED "Print me in red!"

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

แก้ไข: (ตอนนี้ง่ายกว่า!)

มันเป็นคำตอบเก่า แต่ฉันคิดว่าฉันจะชี้แจงและลดความซับซ้อนเล็กน้อย

img

PowerShellอยู่ในขณะนี้รวมอยู่ในทุกรุ่นที่ใช้ Windows 7 ตั้งแต่ดังนั้นไวยากรณ์สำหรับคำตอบนี้สามารถลงไปเป็นรูปแบบที่เรียบง่าย:

  • เส้นทางไม่จำเป็นต้องมีการระบุเพราะมันควรจะอยู่ในตัวแปรสภาพแวดล้อมที่มีอยู่แล้ว
  • ชัดเจนคำสั่งสามารถย่อ ตัวอย่างเช่นคุณสามารถ:
    • ใช้-foreแทน-foregroundcolor
    • ใช้-backแทน-backgroundcolor
  • คำสั่งนั้นยังสามารถใช้ ' inline ' แทนecho
    (แทนที่จะสร้างไฟล์แบตช์แยกดังด้านบน)

ตัวอย่าง:

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

ข้อมูลมากกว่านี้:

รายการสีที่สมบูรณ์และข้อมูลเพิ่มเติมมีอยู่ใน
- PowerShell Documentation สำหรับWrite-Host



14
Greate มันใช้งานได้สำหรับฉัน แต่ช้ามาก ๆ tooooooooooooooooo
Wener

4
ฉันรู้ว่านี่เป็นคำตอบให้แก้ปัญหา แต่ PowerShell? ฮึ.
SgtPooki

2
นั่นเป็นเหตุผลที่ฉันเริ่มต้นด้วย "นี่ไม่ใช่คำตอบที่ดี" ฉันค่อนข้างชอบ Powershell แต่มันเกินความสามารถสำหรับเรื่องนี้ ANSICON จะดีกว่าถ้าคุณสามารถรับมือกับการปรับใช้กับเครื่องเป้าหมายได้
เลน

ขอบคุณสำหรับคำตอบนี้ ฉันดูสูงและต่ำเพื่อหาวิธีแสดงผลสีจากไฟล์แบตช์ใน Powershell และนี่เป็นเพียงไฟล์เดียว ไม่แน่ใจว่าทำไมใช้เวลานานกว่าจะพิมพ์จริง (มีรอ 1 วินาทีต่อการโทรแต่ละครั้ง) แต่อย่างน้อยฉันก็ทำได้ ขอบคุณ!
pizzafilms

29

Windows 10 - TH2 ขึ้นไป:

(aka เวอร์ชัน 1511, สร้าง 10586, เปิดตัว 2015-11-10)

ที่พร้อมท์คำสั่ง:

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

ใช้ปุ่มจริง: echo Ctrl+ [[32m HI Ctrl+[[0mEnter

คุณควรเห็นสีเขียว "HI" อยู่ด้านล่าง

หมายเลขรหัสสามารถพบได้ที่นี่:

แผ่นจดบันทึก:

หากต้องการบันทึกสิ่งนี้ลงในแผ่นจดบันทึกคุณสามารถพิมพ์ ESC ลงไปโดยใช้: Alt+ 027ด้วย numpad จากนั้นเป็น[32mส่วน เคล็ดลับอีกข้อเมื่อฉันใช้งานแล็ปท็อปเปลี่ยนเส้นทางด้านบนเป็นไฟล์เพื่อเริ่มต้นจากนั้นตัดและวาง:

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

3
Alt + 027 เป็นสิ่งที่ฉันต้องการจริงๆ!
Aleksander Stelmaczonek

1
Alt + 027 dos't ทำงานใน Eclipse / Java .. ได้ลองแล้ว\033แต่ไม่ ... ฉันจะทำยังไงใน Java?
derHugo

บน windows 10 ขึ้นไปทำงานได้ในตัวแก้ไข DOS และ Notepad ++ ขอบคุณ!
Junior Mayhé

17

คุณสามารถสร้างไฟล์ด้วยชื่อของคำที่จะพิมพ์ใช้ findstr ซึ่งสามารถพิมพ์สีแล้วลบไฟล์ ลองตัวอย่างนี้:

@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

เรียกใช้color /?เพื่อรับรายการสี


3
ชุดนี้สีในบรรทัดคำสั่งของ windows คุณช่วยอธิบายสิ่งที่มันทำ?
FeatureCreep

2
ตกลงมันเพิ่งสร้างไฟล์ที่มีชื่อของคำที่จะพิมพ์ใช้ findstr ซึ่งสามารถพิมพ์สีแล้วลบไฟล์
FeatureCreep

2
นั่นเป็นเรื่องที่น่าประทับใจ! โปรดทราบว่ารหัสสีผิด เรียกใช้ "color /?" เพื่อดูรหัสสีจริง
yoyo

3
โปรดทราบว่า findstr สามารถใส่ชื่อไฟล์ได้เท่านั้นซึ่งหมายความว่าคุณไม่สามารถใช้เคล็ดลับนี้สำหรับสตริงที่มีอักขระพา ธ ที่ผิดกฎหมาย
yoyo

3
นอกจากนี้โปรดทราบว่าสิ่งนี้จะเขียนทับไฟล์ในไดเรกทอรีเดียวกันหากพวกเขาแบ่งปันชื่อของสิ่งที่คุณพยายามพิมพ์ ... ซึ่งไม่ดีเลย
BrainSlugs83

14

คุณสามารถใช้ANSICONเพื่อเปิดใช้งานรหัสเทอร์มินัล ANSI ใน Windows เวอร์ชั่นที่เก่ากว่า มีรุ่น 32 และ 64 บิตที่ฉันใช้ใน Windows XP และ Windows 7


ไม่สามารถทำให้มันทำงานบน windows 8.1 ได้ ขัดข้องทุกครั้งที่ฉันลองและติดตั้ง
EHerman

@EHerman บางทีคำถามนี้อาจช่วยได้
ไบรอันแอช

ANSICON ไม่จำเป็นใน Win 10 รุ่นที่ใหม่กว่าอย่าพยายามใช้งานที่นั่น
Gringo Suave

6

ผมรำคาญจากการขาดสีที่เหมาะสมใน cmd เกินไปดังนั้นฉันไปข้างหน้าและสร้างcmdcolor มันเป็นเพียงแค่พร็อกซี่ stdout ซึ่งมีลักษณะเป็นชุด จำกัด ของ ANSI / VT100 ลำดับการควบคุม (ในคำอื่น ๆ เช่นในทุบตี) echo \033[31m RED \033[0m DEFAULT | cmdcolor.exeคือ

การใช้งานและการดาวน์โหลด


มันเจ๋งมากและฉันได้ใส่มันลงในระบบเมนูของสคริปต์บิลด์ขนาดยักษ์ในงานของฉัน สิ่งเดียวที่ฉันมีคือไบนารีที่คุณให้ในหน้านั้นมีเป้าหมาย 64- บิตดังนั้นมันจะไม่ทำงานบนเครื่องสร้าง 32 บิตของเรา แต่มันก็ไม่มีปัญหาที่จะดึงแหล่งที่มาและรวบรวมตัวเอง
ข้าวเปลือก

แต่มันเป็น 32- บิต :) นี่คือผลลัพธ์ของไฟล์ GNU:cmdcolor.exe; PE32 executable for MS Windows (console) Intel 80386 32-bit
Alec Mev

มันแปลก ... XP Pro ปฏิเสธที่จะใช้งาน แต่มันก็ทำงานได้ดีบนกล่อง Win7 64 ของฉัน ฉันคอมไพล์ด้วย Visual C ++, กำหนดเป้าหมาย Win32 และมันก็ใช้ได้
ข้าวเปลือก

อืมมม ... upxอาจจะเป็นเพราะ กรุณาติดต่อฉันทางอีเมลได้ไหม
Alec Mev

6

ฉันดูที่นี้เพราะฉันต้องการแนะนำสีข้อความง่ายๆให้กับไฟล์ Win7 Batch นี่คือสิ่งที่ฉันมาด้วย ขอบคุณสำหรับความช่วยเหลือของคุณ.

@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

มีคำตอบที่ยอมรับพร้อมผู้อัปโหลดมากกว่า 250 รายแล้ว เหตุผลที่ฉันยังมีส่วนร่วมคือescapeตัวละครที่จำเป็นสำหรับการสะท้อนไม่ได้รับการยอมรับจากบรรณาธิการหลายคน (ฉันใช้เช่นรหัส MS) และการแก้ปัญหาอื่น ๆ ทั้งหมดต้องใช้ซอฟต์แวร์บางส่วนของบุคคลที่สาม (ไม่ใช่ Windows)

การทำงานรอบกับการใช้คำสั่งชุดธรรมดาเพียงใช้แทนPROMPT คำสั่งยอมรับตัวละครในทางใดทางหนึ่งบรรณาธิการง่ายเป็นลำดับตัวอักษร (เพียงแค่แทนที่ในรหัส ASCII หนี ) ด้วยECHOPROMPTescape$EEsc$E

นี่คือตัวอย่างรหัส:

@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

หมายเหตุ: ข้อเสียเปรียบเพียงอย่างเดียวคือเทคนิคนี้ชนกับการตั้งค่าสี cmd ผู้ใช้ ( colorคำสั่งหรือการตั้งค่า) หากไม่ทราบอย่างชัดเจน

- หวังว่านี่จะช่วยได้เพราะนี่เป็นทางออกเดียวที่ฉันยอมรับได้สำหรับเหตุผลที่กล่าวถึงในตอนต้น -

แก้ไข:

จากความคิดเห็นฉันกำลังแนบตัวอย่างอื่นที่ได้แรงบันดาลใจจาก @Jeb มัน:

  • แสดงวิธีรับและใช้งานอักขระ "Esc" (แทนที่จะป้อนลงในโปรแกรมแก้ไข) (โซลูชันของ Jeb)
  • ใช้ECHOคำสั่ง"ดั้งเดิม"
  • ดังนั้นจึงไม่ส่งผลกระทบต่อPROMPTมูลค่าท้องถิ่น
  • แสดงให้เห็นว่าการระบายสีECHOเอาท์พุทมีผลต่อPROMPTสีอย่างหลีกเลี่ยงไม่ได้ดังนั้นจึงต้องรีเซ็ตสี
@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

เทคนิคที่น่าสนใจมาก ๆ ฉันจะดูว่าฉันต้องอัปเดตgithub.com/VonC/batcolorsหรือไม่ upvoted
VonC

@VonC คุณสามารถสร้างตัวแปรที่มี escape chatacter โดยไม่จำเป็นต้องใส่มันลงในโปรแกรมแก้ไข for /F "delims=#" %%E in ('"prompt #$E# & for %%E in (1) do rem"') do set "\e=%%E"
jeb

@jeb คุณหมายถึง "ตรงข้ามกับที่echoใช้ในbatcolors / echo.bat " หรือไม่
VonC

@VonC ใช่แทนที่ของคุณด้วยset ASCII27=← for /F "delims=#" %%E in ('"prompt #$E# & for %%E in (1) do rem"') do set "ASCII27=%%E"สิ่งนี้ใช้อักขระเลี่ยงที่สร้างโดยคำสั่งพรอมต์โดยไม่เปลี่ยนพรอมต์อย่างถาวร (เนื่องจากpromptคำสั่งถูกดำเนินการในกระบวนการย่อย) Btw คุณechos.batมีศักยภาพในการเพิ่มประสิทธิภาพบางอย่าง ...
Jeb

@jeb "echos.bat ของคุณมีศักยภาพในการเพิ่มประสิทธิภาพ": ฉันแน่ใจว่ามัน :) คำขอการร้องขอแบบดึงยินดีต้อนรับ (ทั้ง ASCII27 และการเพิ่มประสิทธิภาพอื่น ๆ )
VonC

4

ฉันกำลังเพิ่มคำตอบเพื่อแก้ไขปัญหาที่ระบุไว้ในความคิดเห็นบางส่วนด้านบน: รหัสสีแบบอินไลน์ ansi สามารถทำงานผิดปกติได้เมื่ออยู่ในวงวน FOR (ที่จริงแล้วภายในบล็อกที่ใส่เครื่องหมายวงเล็บ) รหัส. bat ด้านล่างแสดง (1) การใช้รหัสสีแบบอินไลน์ (2) ความล้มเหลวของสีที่สามารถเกิดขึ้นได้เมื่อใช้รหัสสีแบบอินไลน์ในลูป FOR หรือภายในบล็อกที่ใส่วงเล็บของรหัสและ (3) วิธีแก้ปัญหา ปัญหา. เมื่อรหัส. bat ดำเนินการทดสอบที่ 2 และ 3 แสดงให้เห็นถึงความล้มเหลวของรหัสสีและการทดสอบ 4 จะไม่แสดงความล้มเหลวเนื่องจากจะใช้วิธีแก้ไขปัญหา

[แก้ไข 2020-04-07: ฉันพบโซลูชันอื่นที่น่าจะมีประสิทธิภาพมากกว่าการเรียกรูทีนย่อย ใส่วลี FINDSTR ในวงเล็บเช่นเดียวกับในบรรทัดต่อไปนี้:

   echo success | (findstr /R success)

EndEdit]

หมายเหตุ: จากประสบการณ์ของฉัน (มี จำกัด ) ปัญหารหัสสีจะปรากฏขึ้นหลังจากป้อนข้อมูลไปยัง FINDSTR ภายในบล็อกโค้ดเท่านั้น นั่นคือวิธีที่. bat สร้างปัญหาขึ้นมาใหม่ เป็นไปได้ว่าปัญหารหัสสีเป็นเรื่องทั่วไปมากกว่าหลังจากไปป์ไลน์ที่ FINDSTR หากใครบางคนสามารถอธิบายลักษณะของปัญหาและถ้ามีวิธีที่ดีกว่าในการแก้ปัญหาฉันก็ยินดี

@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

ฉันเพิ่งแปลงจาก Win 7 Home เป็น Win 10 Pro และต้องการแทนที่แบตช์ที่ฉันโทรจากแบตช์อื่นเป็นเสียงสะท้อนข้อมูลเป็นสี ตรวจสอบสิ่งที่กล่าวถึงข้างต้นฉันใช้ต่อไปนี้ซึ่งจะแทนที่ชุดก่อนหน้าของฉันโดยตรง หมายเหตุการเพิ่ม "~" ในข้อความเพื่อให้สามารถใช้ข้อความที่มีช่องว่างได้ แทนที่จะจำรหัสฉันใช้ตัวอักษรสำหรับสีที่ฉันต้องการ

ถ้า% 2 มีช่องว่างต้องใช้ "... "% 1 สีที่เข้มบนพื้นดำ: R = แดง G = สีเขียว Y = สีเหลือง W = สีขาว

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

คุณจะต้องสะท้อนลำดับรหัสหลีกเลี่ยง ANSI เพื่อเปลี่ยนสีข้อความ: http://en.wikipedia.org/wiki/ANSI_escape_code

อีกแหล่งที่ดีมากของรหัสหลบหนีเหล่านี้คือhttp://ascii-table.com/ansi-escape-sequences.php


ดูดีมาก แต่ฉันจะปล่อยตัวละคร Escape - ASCII 27 ในคำสั่ง echo ได้อย่างไร?
rui

10
คอนโซล Windows ไม่มีเทอร์มินัลอีมูเลเตอร์ ANSI escape sequences นั้นใช้งานไม่ได้ คุณสามารถเกลี้ยกล่อมให้ Windows 9x ทำเช่นนั้นได้โดยการโหลด ANSI.SYS แต่ตอนนี้เราก็ผ่านไปแล้ว
Joey

0

ใส่บรรทัดต่อไปนี้ลงในไฟล์ที่เรียกว่าColourText.basบนเดสก์ท็อปของคุณ

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

บันทึกและพิมพ์คำสั่งต่อไปนี้ในพร้อมท์คำสั่ง

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

ไฟล์ชื่อ ColourText.exe จะปรากฏบนเดสก์ท็อปของคุณ ย้ายไปยังโฟลเดอร์ Windows

หากต้องการใช้คุณต้องใช้สองรหัสตัวอักษรที่ต้องการเช่นสีชุดไม่ได้011

ColourText ColourOfText ColourOfTextWhenFinished Text

EG หากต้องการตั้งค่าสีน้ำเงินเป็นสีขาวโดยไม่ผ่านข้อความใด ๆ จากนั้นให้เปลี่ยนเป็นสีขาวบนตัวอักษรและจบด้วยสีน้ำเงินเป็นสีเทา

ColourText F1 F1
ColourText F2 71 This is green on white

หรือ

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

นอกจากนี้ยังมีCLSคำสั่งกลายเป็นที่น่าสนใจ Colorคำสั่งโดยไม่มีพารามิเตอร์รีเซ็ตสีทั้งหมดเป็นสีเริ่มต้น

ในการรับรหัสสีให้เพิ่มหมายเลขต่อไปนี้เข้าด้วยกัน ใช้เครื่องคิดเลขในโหมดโปรแกรมเมอร์ นี่คือเลขฐานสิบหก สามารถรวมเข้าด้วยกันได้เช่น Red + Blue + FG Intensity = 13 = D เนื่องจาก 10+ ที่ไม่ได้ใช้พื้นหลังจะเป็นสีดำ รหัสสีต้องเป็นตัวละครสองตัวเช่นไม่ได้088

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
ในขณะที่น่าสนใจไม่ใช่ทุกคนที่จะติดตั้ง SDK แต่จริงๆแล้วมีคนน้อยมาก
อาเบล

0

ที่จะได้รับการทำงานนี้ใน Windows 10 ENABLE_VIRTUAL_TERMINAL_PROCESSINGคุณสามารถเปิดใช้ธงนี้:

ด้วยคีย์รีจิสทรีนี้คุณสามารถตั้งค่านี้ได้ตามค่าเริ่มต้น

[HKCU\Console] VirtualTerminalLevel dword 0x1


0

ทางเลือกคือการใช้NodeJS

นี่คือตัวอย่าง:

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

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

และนี่คือผลลัพธ์ที่ได้:

ป้อนคำอธิบายรูปภาพที่นี่


0

ดังที่Glenn Slaydenกล่าวไว้ในคำตอบนี้คุณสามารถเพิ่มค่าที่เหมาะสมในการทำให้ cmd มีสีสันมากขึ้นในรีจิสตรี

โชคดีที่ค่าเริ่มต้นทั่วโลกสามารถเปลี่ยนจากการไม่ใช้เป็นการยกเลิก รีจิสตรีคีย์ที่ HKEY_CURRENT_USER \ Console \ VirtualTerminalLevel ตั้งค่าลักษณะการทำงานเริ่มต้นส่วนกลางสำหรับการประมวลผล ANSI escape sequences สร้างคีย์ DWORD (ถ้าจำเป็น) และตั้งค่าเป็น 1 เพื่อเปิดใช้งานทั่วโลก (หรือ 0 เพื่อปิดใช้งานการประมวลผล ANSI) โดยค่าเริ่มต้น


0

การตั้งค่าสีในข้อความสั่งการใน PowerShell ไม่ใช่เรื่องใหญ่ คุณสามารถใช้-ForegroundColorพารามิเตอร์

เพื่อเขียนข้อความยืนยัน

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

เพื่อเขียนข้อความแสดงข้อผิดพลาด

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

การเขียนข้อความความคืบหน้า

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%ว่างเปล่าดังนั้นจึงใช้งานไม่ได้ echo !white!ตั้งค่าสีเป็นสีขาว หากต้องการกลับไปเป็นสีเริ่มต้น (สิ่งที่การตั้งค่าของผู้ใช้กำหนดไว้): colorคำสั่งที่ไม่มีพารามิเตอร์ทำ
เตฟาน

-1

เราใช้ในการทำเช่นนี้กับรหัสขั้ว ANSI ไม่แน่ใจว่ายังใช้งานได้หรือไม่ แต่คุณสามารถลองใช้ได้


1
นี่อาจเป็นคำตอบที่ดีถ้ามันอธิบายวิธีใช้เทอร์มินัล ANSI เหล่านี้ ...
Davor Josipovic

1
ฉันคิดว่าบทความที่ฉันเชื่อมโยงเพื่ออธิบาย คุณอ่านมาแล้วเหรอ? BTW: มันบอกว่าพวกเขาไม่ทำงานบน win32
Michael J

เฉลียง บทความอธิบายว่าเทอร์มินัลรหัส ANSI คืออะไร แต่ไม่ใช่วิธีการใช้รหัสภายในอย่างแท้จริงเพื่อตอบคำถาม (ใช่ ... ความจริงที่ว่าคอนโซล Win32 ไม่ได้รับการสนับสนุนทำให้พวกเขาไม่เกี่ยวข้องกับคำถาม)
Davor Josipovic

1
คุณเพียงแค่จะสะท้อนรหัส ANSI ไปยังสถานี เช่น "echo ← [6m" จะตั้งค่าสีข้อความของเทอร์มินัลเป็น 6 (สีแดง) หมายเหตุ "←" คือ ASCII 27 (หลบหนี) คุณสามารถพิมพ์ได้โดยกด "ALT" ค้างไว้แล้วพิมพ์ "27" บนแป้นตัวเลข ฉันเพิ่ง googled มันและพบว่าคุณยังสามารถใช้คำสั่ง "color" เพื่อทำสิ่งเดียวกัน (แม้ว่ารหัสตัวเลขจะแตกต่างกัน) "color 4" ทำให้คุณได้รับข้อความสีแดง
Michael J

-6

คุณสามารถใช้คำสั่ง color เพื่อเปลี่ยนสีของทั้งคอนโซล

Color 0F

เป็นขาวดำ

Color 0A 

เป็นสีดำและสีเขียว


20
ดีที่รู้. แต่น่าเสียดายที่นี้เปลี่ยนสีของคอนโซลทั้งหมดและคำถามคือวิธีการเปลี่ยนเส้นเดียว (หรือส่วนหนึ่งของมัน) ..
ลุค

6
OP ระบุว่าเขาคุ้นเคยกับคำสั่งนี้และปัญหาคือว่ามันเปลี่ยนคอนโซลทั้งหมดไม่ใช่บรรทัดที่ระบุ
Randall Flagg

5
ใช่แน่นอนไม่ตอบสนองอย่างแท้จริง แต่ก็ยังมีประโยชน์ที่จะรู้
CuriousMarc
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.