Windows komut satırında farklı renklerle yankı nasıl yapılır


217

color bfKomutun tüm komut satırı penceresinin renklerini ayarladığını biliyorum, ancak tek bir satırı farklı bir renkte yazdırmak istedim.


1
Görünüşe göre, kaçan renk kodlarını Windows komut satırına eklemenin basit bir yolu yok. :(
rui

rui, Win10 kabul edilebilir bir işletim sistemi sürümü ise, Jens'in cevabına göz atın - bu sorunun yedi yıl önce hiç bir cevap kabul etmediğini görmek tam olarak ihtiyacınız olan şey olmalı: stackoverflow.com/a/38617204/3543437
kayleeFrye_onDeck

Yanıtlar:


284

Tek bir satırı farklı renkte basmak istedim.

ANSI Kaçış Dizileri kullanın.

10'dan önceki Windows - konsoldaki ANSI renkleri için yerel destek yok

10'un altındaki Windows sürümü için, Windows komut konsolu varsayılan olarak çıktı renklendirmeyi desteklemez. Sen yükleyebilir ya Cmder , ConEmu , ANSICON veya mintty (GitBash ve Cygwin varsayılan olarak kullanılır) Windows komut konsoluna destek boyama ekleyin.

Windows 10 - Komut Satırı Renkleri

Windows 10'dan başlayarak, Windows konsolu varsayılan olarak ANSI Kaçış Dizilerini ve bazı renkleri destekler. Özellik, Kasım 2015'te Eşik 2 Güncellemesi ile birlikte gönderildi.

MSDN Belgeleri

Güncelleme (05-2019): ColorTool , konsolun renk düzenini değiştirmenizi sağlar. Microsoft Terminal projesinin bir parçası .

gösteri

resim açıklamasını buraya girin

Toplu Komut

win10colors.cmdTarafından yazılmıştır 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 konsolumda çalışmıyor (cmd)
user3057544

40
Tamam. Geri dönüşünüz için teşekkür ederiz. .cmdveya .bat- her ikisi de çalışmalıdır. Ama, neden işe yaramadığını biliyorum düşünüyorum: StackOverflow gönderirken kaçış sembolü kaldırıldı görünüyor. Lütfen içeriği cevabımdan
Jens A. Koch

28
Daha önce hiç bir ESCnotepad ++ oluşturmak zorunda kaldım ... Bu numpad ve sol ALT anahtarını kullanarak ALT kodları ile yapabilirsiniz: L-ALT+ 0+ 2+7
kayleeFrye_onDeck 21:17

3
Btw, çoğu gün çok parti yapan ve kullanan biri olarak, bu cevap genel araç setimi estetik bir şekilde geliştirdi! VB mi kullanıyorsunuz? Asla. Bu gitmek için yolu!
kayleeFrye_onDeck

4
ESCBir Batch dosyasında şu şekilde bir karakter oluşturabilirsiniz :for /F %%a in ('echo prompt $E ^| cmd') do set "ESC=%%a"
Aacini

56

Bu, .net framework yüklü herhangi bir sistemde kullanılabilen kendi kendine derlenmiş bir bat / .net hibritidir (olarak kaydedilmelidir .BAT) (en eski XP / 2003 için bile .NET framework içermeyen pencereleri görmek nadir bir şeydir) kurulumlar). Yalnızca geçerli satır için farklı arka plan / ön plan rengine sahip dizeleri yazdırabilen bir exe oluşturmak için jscript.net derleyicisini kullanır.

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

İşte yardım mesajı:

resim açıklamasını buraya girin

Örnek :

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

Bu betiği burada da bulabilirsiniz .

Ayrıca carlos'ın renk işlevini de kontrol edebilirsiniz -> http://www.dostips.com/forum/viewtopic.php?f=3&t=4453


13
Ne kadar serin. İçinde jscript derleyen bir yarasa dosyası ve sadece gerekiyorsa - çok etkilendim. Kullanılmayı bekleyen sadece orada oturan bir jscript derleyicisi olduğunu bile bilmiyordum. Ay için "müthiş ödülümü" aldın. İlk kullanımının yavaş olacağından bahsetmelisiniz (derleme nedeniyle).
Graham

4
Bu uç noktaya gitmek için yeterince renge ihtiyacım yok, ama teknik gerçekten etkileyici ve kendimi başka bir yerde kullandığımı görebiliyorum.
EM0

47

Bu harika bir cevap değil, ancak hedef iş istasyonunun Powershell'e sahip olduğunu biliyorsanız, böyle bir şey yapabilirsiniz (BAT / CMD komut dosyası varsayarak):

CALL:ECHORED "Print me in red!"

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

Düzenleme: (şimdi daha basit!)

Bu eski bir cevap ama biraz açıklığa kavuşturacağımı ve basitleştireceğimi düşündüm

img

PowerShell şimdi olduğu dahil tüm sürümlerinde nedenle bu yanıt için sözdizimi daha basit forma kısaltılabilir 7'ye beri Windows'un:

  • zaten ortam değişkeninde olması gerektiği için yolun belirtilmesi gerekmez.
  • açık komutlar kısaltılabilir . Örneğin:
    • -foreyerine kullan-foregroundcolor
    • -backyerine kullan-backgroundcolor
  • komut temel olarak ' satır içi ' echo
    yerine de kullanılabilir (yukarıdaki gibi ayrı bir toplu iş dosyası oluşturmak yerine).

Misal:

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

Daha fazla bilgi:

Renklerin tam listesi ve daha fazla bilgi için
- PowerShell BelgeleriWrite-Host



15
Greate, benim için işe yarıyor, ama tooooooooooooooo yavaş.
wener

4
Bu bir çözüm, ancak powershell sağlayan bir cevap olduğunu fark? öf.
SgtPooki

2
Bu yüzden "Bu harika bir cevap değil" ile başladım. Powershell'i çok seviyorum ama bunun için aşırıya kaçıyor. ANSICON, hedef makinelere dağıtmakla başa çıkabiliyorsanız daha iyidir.
Iain

Bu cevap için teşekkürler. Powershell'deki bir toplu iş dosyasından renkli çıktıları yankılamanın bir yolu için yüksek ve alçak baktım ve bu sadece biriydi. Aslında yazdırmak için neden bu kadar uzun sürdüğünden emin değilim (her çağrıda 1 saniye beklemek gibi) ama en azından yapabilirim. Teşekkür ederim!
pizzafilms

29

Windows 10 - TH2 ve üstü:

(aka Sürüm 1511, derleme 10586, sürüm 2015-11-10)

Komut İsteminde:

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

Gerçek tuşları kullanma: echo Ctrl+ [[32m HI Ctrl+[[0mEnter

Altında yeşil bir "HI" görmelisiniz.

Kod numaralarını burada bulabilirsiniz:

Not Defteri:

: Not defteri içine bu kaydetmek için kullandığınız içine ESC yazabilirsiniz Alt+ 027sonra numpad ile [32mparçası. Bir dizüstü bilgisayardayken başka bir numara, başlamak için yukarıdaki satırı bir dosyaya yönlendirin, sonra kesip yapıştırın:

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

3
Alt + 027 tam da ihtiyacım olan şeydi!
Aleksander Stelmaczonek

1
Alt + 027 dos Eclipse / Java'da çalışmıyor .. da denedim \033ama hayır ... bunu Java'da nasıl yapabilirim?
derHugo

Windows 10 ve üzeri sürümlerde bu DOS ve Notepad ++ düzenleyicisinde çalışır. Teşekkürler!
Junior Mayhé

18

Yalnızca yazdırılacak sözcüğün adıyla dosyalar oluşturabilir, renkli yazdırabilecek findstr komutunu kullanabilir ve ardından dosyayı silebilirsiniz. Bu örneği deneyin:

@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 /?Renklerin bir listesini almak için çalıştırın .


3
Bu, windows komut satırındaki renkleri ayarlar. Ne yaptığını açıklayabilir misiniz?
FeatureCreep

2
Tamam, sadece yazdırılacak sözcüğün adıyla dosyalar oluşturur, renkli yazdırabilecek findstr kullanır ve sonra dosyayı siler.
FeatureCreep

2
Bu etkileyici! Renk kodlarının yanlış olduğunu unutmayın. "Color /?" Komutunu çalıştır gerçek renk kodlarını görmek için.
yoyo

3
Findstr dosyasının yalnızca dosya adını renklendirebileceğini unutmayın; bu, hileyi geçersiz yol karakterleri içeren dizeler için kullanamayacağınız anlamına gelir.
yoyo

3
Ayrıca, yazdırmaya çalıştığınız şeyin adını paylaşırlarsa, aynı dizindeki dosyaların üzerine yazacaktır ... bu hiç de iyi değil.
BrainSlugs83

14

ANSICON'u Windows'un eski sürümlerinde ANSI terminal kodlarını etkinleştirmek için kullanabilirsiniz . Windows XP ve Windows 7'de kullandığım 32 ve 64 bit sürümleri var.


Windows 8.1 üzerinde çalışamıyor. Her denediğimde ve kurduğumda çöküyor.
EHerman

@EHerman Belki bu soru yardımcı olacaktır.
Bryan Ash

ANSICON, Win 10'un sonraki sürümlerinde gerekli değildir. Orada kullanmaya çalışmayın.
Gringo Suave

6

Cmd'de de uygun renk eksikliğinden rahatsız oldum, bu yüzden devam ettim ve cmdcolor oluşturdum . Sınırlı bir ANSI / VT100 kontrol dizisi seti (başka bir deyişle bash gibi) arayan bir stdout proxy'sidir echo \033[31m RED \033[0m DEFAULT | cmdcolor.exe.

Kullanım ve indirmeler .


Bu harika ve işimde dev bir derleme menü sistemine koydum. Sahip olduğum tek sığır eti, bu sayfada sağladığınız ikili dosyanın 64 bit'i hedeflemesi, bu nedenle 32 bitlik oluşturma makinemizde çalışmaz. Ama sadece kaynağı yakalamak ve kendimi derlemek hiç sorun değildi.
Çeltik

Ama bu 32 bit :) İşte GNU dosyasının çıktısı:cmdcolor.exe; PE32 executable for MS Windows (console) Intel 80386 32-bit
Alec Mev

Bu garip ... XP Pro çalıştırmayı reddetti, ancak Win7 64 kutumda iyi çalıştı. Visual C ++ ile derlenmiş, Win32 hedefleme ve iyiydi.
Çeltik

Ha ... muhtemelen yüzünden upx. Bana e-posta ile ulaşabilir misiniz?
Alec Mev

6

Win7 Batch dosyasına bazı basit metin renklerini tanıtmak istediğim için buna baktım. Ben de bunu buldum. Yardımınız için teşekkürler.

@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'den fazla oylama ile kabul edilmiş bir cevap var. Hala katkıda bulunmamın nedeni escape, yankılama için gereken karakterin birçok editör tarafından kabul edilmemesi (örneğin MS Code kullanıyorum) ve diğer tüm çözümlerin bazı üçüncü taraf (Windows varsayılan olmayan) yazılım parçaları gerektirmesidir.

Bunun PROMPTyerine, yalnızca düz toplu iş komutlarını kullanan geçici çözüm kullanılıyor ECHO. PROMPTKomut kabul escapekısmı olarak bir bir-düzenleyici için uygun bir şekilde karakteri $Ekarakter dizisi. (Basitçe yerine Escde ASCII Escape kodları ile birlikte) $E.

İşte bir demo kodu:

@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

NOT: Tek dezavantajı, bu tekniğin coloraçıkça bilinmiyorsa kullanıcı cmd renk ayarlarıyla ( komut veya ayarlar) çarpışmasıdır .

- Umarım bu, başlangıçta belirtilen nedenlerden dolayı benim için kabul edilebilir tek çözüm olduğu için yardımcı olur. -

DÜZENLE:

Yorumlara dayanarak, @Jeb'den esinlenen başka bir pasajı ekliyorum. O:

  • "Esc" karakter çalışma zamanının nasıl elde edileceğini ve kullanılacağını gösterir (bir düzenleyiciye girmek yerine) (Jeb'in çözümü)
  • "Yerel" ECHOkomutları kullanır
  • Dolayısıyla yerel PROMPTdeğeri etkilemez
  • ECHOÇıktının renklendirilmesinin kaçınılmaz olarak PROMPTrengi etkilediğini gösterir, böylece renk yine de sıfırlanmalıdır
@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

Çok ilginç bir teknik. Onunla github.com/VonC/batcolors güncellemem gerekip gerekmediğini göreceğim . Upvoted.
VonC

@VonC Düzenleyiciye girmeye gerek kalmadan, kaçış bölümünü içeren bir değişken oluşturabilirsiniz. for /F "delims=#" %%E in ('"prompt #$E# & for %%E in (1) do rem"') do set "\e=%%E"
jeb

@jeb " batcolors / echo.bat 'da echokullanılmanın aksine" demek istiyor musunuz ?
VonC

@VonC Evet sayfanı değiştirin set ASCII27=←ile for /F "delims=#" %%E in ('"prompt #$E# & for %%E in (1) do rem"') do set "ASCII27=%%E". Bu, komut istemini kalıcı olarak değiştirmeden ( promptkomut bir alt işlemde yürütüldüğünden) , komut istemi tarafından oluşturulan çıkış karakterini kullanır . Btw. Sizin echos.bat... bazı optimizasyon potansiyeline sahiptir
jeb

@jeb "echos.bat'ınız bazı optimizasyon potansiyeline sahiptir": Eminim :) Çekme İstekleri kabul edilir (hem ASCII27 hem de diğer optimizasyonlar için)
VonC

4

Yukarıda bazı yorumlarda belirtilen bir sorunu gidermek için bir cevap ekliyorum: satır içi ansi renk kodları bir FOR döngüsü içinde (aslında, herhangi bir parantez kod bloğu içinde) zaman hatalı davranabilir. Aşağıdaki .bat kodu, (1) satır içi renk kodlarının kullanımını, (2) satır içi renk kodlarının bir FOR döngüsünde veya parantez içindeki bir kod bloğunda kullanıldığında ortaya çıkabilecek renk hatasını ve (3) sorun. .Bat kodu yürütüldüğünde, sınama 2 ve 3 renk kodu hatasını gösterir ve sınama 4, çözümü uyguladığından hata göstermez.

[EDIT 2020-04-07: Bir altyordam çağırmaktan muhtemelen daha verimli başka bir çözüm buldum. Aşağıdaki satırda olduğu gibi FINDSTR deyimini parantez içine alın:

   echo success | (findstr /R success)

EndEdit]

Not: (Sınırlı) deneyimimde, renk kodu sorunu yalnızca giriş kod bloğunun içindeki FINDSTR'a bağlandıktan sonra ortaya çıkıyor. Aşağıdaki .bat sorunu bu şekilde yeniden üretir. Renk kodu problemi FINDSTR'a geçtikten sonra daha genel olabilir. Birisi sorunun doğasını açıklayabilirse ve çözmenin daha iyi bir yolu varsa, bunu takdir ediyorum.

@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

Sadece Win 7 Home'dan Win 10 Pro'ya dönüştüm ve diğer gruplardan aradığım toplu bilgileri renkte yankılandırmak istedim. Yukarıda tartışılanları gözden geçirerek, önceki toplu işimin yerini alacak olan aşağıdakileri kullanıyorum. NOT Mesaja "~" eklenerek boşluklu mesajlar kullanılabilir. Kodları hatırlamak yerine, ihtiyacım olan renkler için harfler kullanıyorum.

% 2 boşluk içeriyorsa "..."% 1 Siyah üzerine Güçlü Renkler: R = Kırmızı G = YEŞİL Y = SARI W = BEYAZ

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

Metin rengini değiştirmek için bir ANSI kaçış kodu dizisi yankılamanız gerekir: http://en.wikipedia.org/wiki/ANSI_escape_code

Bu kaçış kodlarının bir diğer çok iyi kaynağı http://ascii-table.com/ansi-escape-sequences.php


Bu gerçekten umut verici görünüyor ama bir echo komutunda Escape karakterini - ASCII 27 nasıl yayabilirim?
rui

10
Windows konsol olan hiçbir Terminal emülatörü. ANSI kaçış dizileri çalışamaz. Windows 9x'i ANSI.SYS yükleyerek koaksiyel yapabilirsiniz, ancak şu ana kadar biraz geçmişiz.
Joey

0

Aşağıdaki satırları ColourText.basmasaüstünüzde adlandırılan bir dosyaya yerleştirin.

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

Kaydedip aşağıdakileri bir komut istemine yazın.

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

Masaüstünüzde ColourText.exe adlı bir dosya görünecektir. Windows klasörüne taşıyın .

Eğer ayarlanan renk ör iki karakter kodları kullanmalıdır kullanmak için 01değil 1.

ColourText ColourOfText ColourOfTextWhenFinished Text

EG Herhangi bir metni geçmeyerek maviyi beyaza, daha sonra beyaz metinde kırmızıya, gri üzerine mavi ile bitirmek için.

ColourText F1 F1
ColourText F2 71 This is green on white

veya

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

Ayrıca CLSkomut ilginç hale gelir. Colorparametresiz komut tüm renkleri başlangıç ​​renklerine sıfırlar.

Renk kodunu almak için aşağıdaki numaraları bir araya getirin. Hesap Makinesi'ni programcılar modunda kullanın. Bunlar onaltılık sayılardır. Birlikte eklenebilirler örneğin Kırmızı + Mavi + FG Yoğunluğu = 13 = D. 10+ kullanılmadığı için arka plan siyah olacaktır. Renk kodları örn, iki karakter OLMALIDIR 08değil 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.

3
İlginç olsa da, herkes SDK'yı yüklemeyecek, aslında çok az insan, sanırım.
Abel

0

Windows'un 10 bu çalışma almak için, bu bayrağı etkinleştirebilirsiniz: ENABLE_VIRTUAL_TERMINAL_PROCESSING.

Bu kayıt defteri anahtarı ile bunu varsayılan olarak ayarlayabilirsiniz

[HKCU\Console] VirtualTerminalLevel dword 0x1


0

Bir alternatif NodeJS kullanmaktır .

İşte bir örnek:

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

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

Ve sonuç bu:

resim açıklamasını buraya girin


0

Glenn Slayden'in bu cevapta söylediği gibi, cmd'yi "daha renkli" yapmak için kayıt defterine uygun değeri ekleyebilirsiniz.

Neyse ki, küresel varsayılan, kapsam dışında kalma durumundan kapsam dışında kalma durumuna değiştirilebilir. HKEY_CURRENT_USER \ Console \ VirtualTerminalLevel üzerindeki kayıt defteri anahtarı, ANSI çıkış dizilerini işlemek için genel varsayılan davranışı ayarlar. Bir DWORD anahtarı oluşturun (gerekirse) ve varsayılan olarak ANSI işlemeyi genel olarak etkinleştirmek (veya devre dışı bırakmak için 0) için değerini 1 olarak ayarlayın.


0

Powershell'deki günlük ifadelerine renk ayarlamak büyük bir arkadaş değil. -ForegroundColorparametresini kullanabilirsiniz .

Bir onay mesajı yazmak için.

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

Bir hata mesajı yazmak için.

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

Bir ilerleme mesajı yazmak için .

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%boş, bu yüzden işe yaramaz. echo !white!rengi beyaza ayarlar. Varsayılan renklere dönmek için (bunun için kullanıcı ayarları ne olursa olsun): colorparametresiz komut bunu yapar.
Stephan

-1

Bunu ANSI terminal kodlarıyla yapıyorduk . Hala çalışıp çalışmadığından emin değilim, ama deneyebilirsiniz.


1
Bu ANSI terminal kodlarının nasıl kullanılacağını açıklarsa bu iyi bir cevap olabilir ...
Davor Josipovic

1
Bağlantı verdiğim makalenin açıkladığını düşündüm. Bunu okudun mu? BTW: win32 üzerinde çalışmadıklarını söylüyor.
Michael J

Köşegenel. Makale, ANSI terminal kodlarının ne olduğunu açıklıyor, ancak soruyu cevaplamak için bunları cmd içinden nasıl kullanacağını gerçekten açıklamıyor. (Evet ... Win32 konsolunun desteklenmemesi onları soru ile ilgisiz kılar.)
Davor Josipovic

1
Sadece ANSI kodlarını terminale yansıtabilirsiniz. örneğin "echo ← [6m" terminalin metin rengini 6 (kırmızı) olarak ayarlar. "←" notu ASCII 27'dir (kaçış). "ALT" tuşunu basılı tutarak ve sayısal tuş takımında "27" yazarak yazabilirsiniz. Ben sadece googled ve yine de (renk kodları farklı olsa da) aynı şeyi yapmak için "renk" komutunu kullanabilirsiniz öğrendim. "renk 4" kırmızı metin alır.
Michael J

-6

Tüm konsolun rengini değiştirmek için color komutunu kullanabilirsiniz

Color 0F

Siyah ve beyaz

Color 0A 

Siyah ve yeşil


20
Bilmek güzel. Ne yazık ki bu tüm konsolun rengini değiştiriyor ve soru tek bir satırın (veya bir kısmının) nasıl değiştirileceği ..
Luke

6
OP bu komuta aşina olduğunu ve problemin belirli bir satırı değil tüm konsolu değiştirdiğini belirtti.
Randall Flagg

5
Evet gerçekten duyarlı değil, ama bunu bilmek hala yararlı.
CuriousMarc
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.