Windows 명령 행에서 다른 색상으로 에코하는 방법


217

나는 color bf명령이 전체 명령 줄 창의 색상을 설정 있지만 한 줄을 다른 색상으로 인쇄하고 싶었습니다.


1
탈출 된 색상 코드를 Windows 명령 줄에 추가하는 간단한 방법이없는 것 같습니다. :(
rui

rui, Win10이 수용 가능한 OS 버전 인 경우 Jens의 답변을 확인하십시오. 7 년 전에는이 질문에 대한 답변을 절대 수락하지 않았으므로 꼭 필요한 것이어야합니다. stackoverflow.com/a/38617204/3543437
kayleeFrye_onDeck

답변:


284

한 줄을 다른 색상으로 인쇄하고 싶었습니다.

ANSI 이스케이프 시퀀스를 사용하십시오.

10 이전 Windows-콘솔에서 ANSI 색상을 기본적으로 지원하지 않음

Windows 버전 10 미만의 경우 Windows 명령 콘솔은 기본적으로 출력 색상을 지원하지 않습니다. Cmder , ConEmu , ANSICON 또는 Mintty를 설치할 수 있습니다 (GitBash와 Cygwin에서에서 기본적으로 사용되는) 당신의 Windows 명령 콘솔에 지원을 착색 추가 할 수 있습니다.

Windows 10-명령 줄 색상

Windows 10부터 Windows 콘솔은 기본적으로 ANSI 이스케이프 시퀀스 및 일부 색상을 지원합니다. 이 기능은 2015 년 11 월 Threshold 2 업데이트와 함께 제공되었습니다.

MSDN 설명서

업데이트 (05-2019) : ColorTool을 사용하면 콘솔의 색 구성표를 변경할 수 있습니다. Microsoft 터미널 프로젝트 의 일부입니다 .

데모

여기에 이미지 설명을 입력하십시오

배치 명령

win10colors.cmd에 의해 작성되었습니다 미셸 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)
user3057544

40
확인. 피드백 감사드립니다. .cmd또는 .bat둘 다 작동해야합니다. 그러나 왜 작동하지 않는지 알고 있습니다 .StackOverflow에 게시 할 때 이스케이프 기호가 제거 된 것 같습니다. 내 답변의 내용을 복사하지 말고 대신 여기의 내용을 사용하십시오. gist.githubusercontent.com/mlocati/…
Jens A. Koch

28
나는를 생성 할 수 없었 ESC: 당신은 숫자 키패드 왼쪽 ALT 키를 사용하여 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 하이브리드 (로 저장해야 함 .BAT)입니다. 설치). 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

이 스크립트는 여기 에서도 찾을 수 있습니다 .

카를로스의 색상 기능을 확인할 수도 있습니다-> http://www.dostips.com/forum/viewtopic.php?f=3&t=4453


13
얼마나 멋진가요? 그 안에있는 jscript를 컴파일하고 필요한 경우에만 컴파일하는 박쥐 파일-나는 깊은 인상을 받았습니다. 심지어 사용하기를 기다리는 jscript 컴파일러가 있다는 것을 몰랐습니다. 당신은 한 달 동안 나의 "굉장한 상"을받습니다. (컴파일 때문에) 처음 사용하는 것이 느리다는 것을 언급해야합니다.
Graham

4
나는이 극단으로 갈 정도로 심하게 색상이 필요하지 않지만 기술은 정말 인상적이며 다른 곳에서 사용하는 것을 볼 수 있습니다.
EM0

47

이것은 훌륭한 대답은 아니지만 대상 워크 스테이션에 Powershell이 ​​있다는 것을 알고 있다면 다음과 같은 작업을 수행 할 수 있습니다 (BAT / CMD 스크립트 가정).

CALL:ECHORED "Print me in red!"

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

편집 : (이제 더 간단합니다!)

그것은 오래된 대답이지만 나는 명확히하고 단순화 할 것이라고 생각했습니다.

img

PowerShell 은 이제 7 이후 모든 Windows 버전포함되어 있습니다 . 따라서이 답변의 구문을보다 간단한 형식으로 줄일 수 있습니다.

  • 경로는 이미 환경 변수에 있어야하기 때문에 지정할 필요가 없습니다.
  • 모호하지 않은 명령은 생략 할 수 있습니다 . 예를 들어 다음을 수행 할 수 있습니다.
    • -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 설명서
-Write-Host



14
그레이트, 그것은 나를 위해 작동하지만 너무 oooooooooooooooo입니다.
wener

4
나는 이것이 해결책을 제공하는 대답이지만 powershell입니까? 우와
SgtPooki

2
그렇기 때문에 "이것은 큰 대답이 아닙니다"로 시작했습니다. 나는 Powershell을 매우 좋아하지만 이것으로 너무 과잉입니다. 대상 시스템에 배치하는 데 대처할 수 있으면 ANSICON이 더 좋습니다.
Iain

이 답변에 감사드립니다. Powershell의 배치 파일에서 컬러 출력을 에코하는 방법에 대해 높고 낮은 것으로 보았으며 이것이 유일한 방법이었습니다. 실제로 인쇄하는 데 시간이 오래 걸리는 이유는 확실하지 않지만 (각 호출마다 1 초 정도 기다립니다) 적어도 나는 할 수 있습니다. 감사합니다!
피자 필름

29

Windows 10-TH2 이상 :

(일명 버전 1511, 빌드 10586, 릴리스 2015-11-10)

명령 프롬프트에서 :

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

실제 키 사용 : echo Ctrl+ [[32m HI Ctrl+[[0mEnter

아래에 녹색 "HI"가 표시되어야합니다.

코드 번호는 여기에서 찾을 수 있습니다.

메모장 :

: 메모장에이를 저장하려면 사용하여에 ESC를 입력 할 수 있습니다 Alt+를 027누른 다음 숫자 키패드의와 [32m부분. 노트북에있을 때의 또 다른 요령은 위의 줄을 파일로 리디렉션하여 시작한 다음 잘라내어 붙여 넣습니다.

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

3
Alt + 027은 내가 필요한 것입니다!
Aleksander Stelmaczonek

1
Alt + 027은 Eclipse / Java에서 작동 \033하지 않습니다 .. 또한 시도 했지만 nope ... Java로 어떻게 할 수 있습니까?
derHugo

Windows 10 이상에서는 DOS 및 메모장 ++ 편집기에서 작동합니다. 감사!
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은 filename 만 채색 할 수 있으므로 잘못된 경로 문자가 포함 된 문자열에는이 트릭을 사용할 수 없습니다.
yoyo

3
또한 인쇄하려는 파일의 이름을 공유하면 동일한 디렉토리의 파일을 덮어 씁니다 ... 아직 좋지 않습니다.
BrainSlugs83

14

이전 버전의 Windows에서 ANSICON 을 사용하여 ANSI 터미널 코드를 활성화 할 수 있습니다 . Windows XP 및 Windows 7에서 사용한 32 비트 및 64 비트 버전이 있습니다.


Windows 8.1에서 작동하지 않습니다. 설치하려고 할 때마다 충돌이 발생합니다.
EHerman 2016 년

@EHerman 아마도이 질문 이 도움 될 것입니다.
Bryan Ash

이후 버전의 Win 10에서는 ANSICON이 필요하지 않습니다. ANSICON은 사용하지 마십시오.
Gringo Suave

6

cmd에 적절한 색상이 부족하여 화가 났으므로 cmdcolor를 만들었 습니다 . 그것은 stdout 프록시 일뿐이며 제한된 ANSI / VT100 제어 시퀀스 세트 (즉, bash와 같은)를 찾습니다 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 박스에서 제대로 작동했다. Win32를 대상으로 Visual C ++로 컴파일했으며 괜찮 았습니다.
paddy

어쩌면 아마도 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하는 해결 방법은 대신을 사용 하고 ECHO있습니다. 이 PROMPT명령은 모든 escape문자를 편집하기 쉬운 방식으로 $E문자 순서 로 받아들 입니다. ( ASCII Escape 코드Esc 에서 간단히 교체 )를로 바꿉니다$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 명시 적으로 알려지지 않은 경우 명령 또는 설정) 입니다.

-처음에 언급 한 이유로 thi가 허용되는 유일한 솔루션이므로 이것이 도움이되기를 바랍니다. -

편집하다:

의견을 바탕으로 @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 를 업데이트 해야하는지 확인할 것입니다. 공감.
VonC

@VonC 이스케이프 채트 커터를 포함하는 변수를 편집기에 입력하지 않고 간단히 만들 수 있습니다. for /F "delims=#" %%E in ('"prompt #$E# & for %%E in (1) do rem"') do set "\e=%%E"
jeb

@jeb " batcolors / echo.batecho 에서 사용되는 것과 반대 되는 것 "을 의미 합니까?
VonC

@VonC 예, 당신의 교체 set ASCII27=←와 함께 for /F "delims=#" %%E in ('"prompt #$E# & for %%E in (1) do rem"') do set "ASCII27=%%E". 이것은 프롬프트를 영구적으로 변경하지 않고 prompt 명령으로 작성된 이스케이프 문자를 사용합니다 ( prompt명령이 하위 프로세스에서 실행 되기 때문에 ). Btw. 당신의 echos.bat최적화 가능성이 있습니다 ...
jeb

@jeb "당신의 echos.bat에 최적화 가능성이 있습니다": 확실합니다 :) 풀 요청을 환영합니다 (ASCII27 및 기타 최적화를 위해)
VonC

4

위의 일부 주석에서 언급 된 문제를 해결하기위한 답변을 추가하고 있습니다. 인라인 ansi 색상 코드는 FOR 루프 내부 (실제로 괄호 안에있는 코드 블록 내)에서 오작동 할 수 있습니다. 아래 .bat 코드는 (1) 인라인 색상 코드 사용, (2) 인라인 색상 코드가 FOR 루프 또는 괄호 안에있는 코드 블록 내에서 사용될 때 발생할 수있는 색상 오류 및 (3) 문제. .bat 코드가 실행될 때 테스트 2와 3은 색상 코드 오류를 보여주고 테스트 4는 솔루션을 구현하므로 오류가 없음을 보여줍니다.

[EDIT 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입니다.


정말 유망 해 보이지만 에코 명령으로 이스케이프 문자-ASCII 27을 어떻게 방출합니까?
rui

10
Windows 콘솔은 터미널 에뮬레이터 가 아닙니다 . ANSI 이스케이프 시퀀스는 작동하지 않습니다. ANSI.SYS를로드하여 Windows 9x를 동축 할 수는 있지만 지금은 조금 지나갔습니다.
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 폴더로 이동하십시오 .

사용하려면 색상을 설정하기 위해 두 개의 문자 코드를 사용해야합니다 (예 : 01not) 1.

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매개 변수가없는 명령은 모든 색상을 시작 색상으로 재설정합니다.

색상 코드를 얻으려면 다음 숫자를 함께 추가하십시오. 프로그래머 모드에서 계산기를 사용하십시오. 이들은 16 진수입니다. 예를 들어 Red + Blue + FG Intensity = 13 = D와 같이 추가 할 수 있습니다. 10+를 사용하지 않으면 배경이 검은 색이됩니다. 색상 코드는 2 자 여야합니다 (예 : 08not) 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
흥미롭지 만 모든 사람이 SDK를 설치하지는 않지만 실제로는 거의 사람이 아니라고 생각합니다.
Abel

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

으로 글렌 Slayden는 말했다 이 답변 , 당신은 cmd를 "더 다채로운"확인하기 위해 레지스트리에 적절한 값을 추가 할 수 있습니다.

다행히 전역 기본값을 옵트 인에서 옵트 아웃으로 변경할 수 있습니다. HKEY_CURRENT_USER \ Console \ VirtualTerminalLevel의 레지스트리 키는 ANSI 이스케이프 시퀀스 처리를위한 전역 기본 동작을 설정합니다. DWORD 키를 작성하고 (필요한 경우) 기본적으로 ANSI 처리를 전체적으로 사용 가능하게하거나 0을 사용 불가능하게하려면 값을 1로 설정하십시오.


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매개 변수가없는 명령이이를 수행합니다.
Stephan

-1

우리는 이것을 ANSI 터미널 코드로 사용했습니다 . 여전히 작동하는지 확실하지 않지만 시도해 볼 수 있습니다.


1
이 ANSI 터미널 코드를 사용하는 방법을 설명하면 좋은 대답이 될 수 있습니다 ...
Davor Josipovic

1
나는 연결 된 기사가 그것을 설명했다고 생각했다. 읽었 어? BTW : win32에서는 작동하지 않는다고 말합니다.
Michael J

대각선으로. 이 기사에서는 ANSI 터미널 코드가 무엇인지 설명하지만 실제로 cmd 내에서 코드를 사용하는 방법을 설명하지 않으므로 질문에 대답하십시오. (예. Win32 콘솔이 지원되지 않는다는 사실은 질문과 관련이 없습니다.)
Davor Josipovic

1
ANSI 코드를 터미널에 에코하면됩니다. 예를 들어 "echo ← [6m"은 터미널의 텍스트 색상을 6 (빨간색)으로 설정합니다. 참고 "←"는 ASCII 27 (이스케이프)입니다. "ALT"를 누른 상태에서 숫자 키패드에서 "27"을 입력하여 입력 할 수 있습니다. 방금 googled하고 "color"명령을 사용하여 동일한 작업을 수행 할 수 있음을 알았습니다 (숫자 코드는 다르지만). "컬러 4"는 빨간색 텍스트를 표시합니다.
Michael J

-6

color 명령을 사용하여 전체 콘솔의 색상을 변경할 수 있습니다

Color 0F

흑백입니다

Color 0A 

검은 색과 녹색


20
알고 반갑습니다. 불행히도 이것은 전체 콘솔의 색상을 바꾸고 문제는 한 줄 (또는 그 일부)을 바꾸는 방법입니다.
Luke

6
OP는이 명령에 익숙하며 문제는 특정 콘솔이 아니라 전체 콘솔을 변경한다는 점입니다.
랜달 플래그

5
예, 실제로 반응이 좋지는 않지만 여전히 유용합니다.
CuriousMarc
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.