Cara gema dengan warna berbeda di baris perintah Windows

217

Saya tahu bahwa color bfperintah mengatur warna seluruh jendela baris perintah tapi saya ingin mencetak satu baris dalam warna yang berbeda.

rui
sumber
1
Tampaknya saya tidak ada cara sederhana untuk menambahkan kode warna yang lolos ke baris perintah Windows. :(
rui
rui, jika Win10 adalah versi OS yang dapat diterima, periksa jawaban Jens - itu pasti yang Anda butuhkan, mengingat pertanyaan ini tidak pernah menerima jawaban tujuh tahun lalu: stackoverflow.com/a/38617204/3543437
kayleeFrye_onDeck
1
Kemungkinan rangkap dari Bagaimana memiliki banyak warna dalam file batch Windows?
Micha Wiedenmann

Jawaban:

284

Saya ingin mencetak satu baris dalam warna yang berbeda.

Gunakan Sequence Escape ANSI.

Windows sebelum 10 - tidak ada dukungan asli untuk warna ANSI di konsol

Untuk versi Windows di bawah 10, konsol perintah Windows tidak mendukung pewarnaan keluaran secara default. Anda dapat menginstal Cmder , ConEmu , ANSICON atau Mintty (digunakan secara default di GitBash dan Cygwin) untuk menambahkan dukungan pewarnaan ke konsol perintah Windows Anda.

Windows 10 - Warna Baris Perintah

Mulai dari Windows 10, konsol Windows mendukung ANSI Escape Sequences dan beberapa warna secara default. Fitur yang dikirimkan dengan Pembaruan Threshold 2 pada November 2015.

Dokumentasi MSDN

Pembaruan (05-2019): ColorTool memungkinkan Anda untuk mengubah skema warna konsol. Itu bagian dari proyek Terminal Microsoft .

Demo

masukkan deskripsi gambar di sini

Perintah Batch

Itu win10colors.cmdditulis oleh 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
Jens A. Koch
sumber
11
@Jens A. Koch - tidak berfungsi di konsol windows 10 saya (cmd)
user3057544
40
Baik. Terima kasih untuk umpan baliknya. .cmdatau .bat- keduanya harus bekerja. Tapi, saya pikir saya tahu mengapa itu tidak berhasil: sepertinya simbol pelepasan dihapus ketika memposting ke StackOverflow. Tolong jangan menyalin konten dari jawaban saya, gunakan konten dari sini sebagai gantinya: gist.githubusercontent.com/mlocati/…
Jens A. Koch
28
Saya tidak pernah membuat ESCnotepad ++ sebelum ... Anda dapat melakukan ini dengan ALT-codes menggunakan numpad dan tombol ALT kiri: L-ALT+ 0+ 2+7
kayleeFrye_onDeck
3
Btw, sebagai seseorang yang membuat dan menggunakan banyak batch hampir setiap hari, jawaban ini telah meningkatkan keseluruhan perangkat saya dengan cara estetika! Menggunakan VB? Tidak. Ini adalah yang cara untuk pergi!
kayleeFrye_onDeck
4
Anda dapat menghasilkan ESCkarakter dalam file Batch dengan cara ini:for /F %%a in ('echo prompt $E ^| cmd') do set "ESC=%%a"
Aacini
56

Ini adalah kelelawar / .net hybrid yang dikompilasi sendiri (harus disimpan sebagai .BAT) yang dapat digunakan pada sistem apa pun yang telah menginstal kerangka kerja .net (jarang terjadi melihat jendela tanpa .NET framework bahkan untuk XP / 2003 tertua) instalasi). Menggunakan kompiler jscript.net untuk membuat exe yang mampu mencetak string dengan warna latar / latar depan yang berbeda hanya untuk baris saat ini.

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

Inilah pesan bantuan:

masukkan deskripsi gambar di sini

Contoh :

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

Anda juga dapat menemukan skrip ini di sini .

Anda juga dapat memeriksa fungsi warna carlos -> http://www.dostips.com/forum/viewtopic.php?f=3&t=4453

npocmaka
sumber
13
Betapa kerennya itu. File bat yang mengkompilasi jscript yang ada di dalamnya dan hanya jika perlu - Saya sangat terkesan. Bahkan tidak tahu ada kompiler jscript hanya duduk di sana menunggu untuk digunakan. Anda mendapatkan "penghargaan luar biasa" saya untuk bulan itu. Anda harus menyebutkan bahwa penggunaan pertama akan lambat (karena kompilasi).
Graham
4
Saya tidak perlu warna cukup buruk untuk pergi ke ekstrem ini, tetapi tekniknya benar-benar mengesankan dan saya bisa melihat diri saya menggunakannya di tempat lain.
EM0
47

Ini bukan jawaban yang bagus, tetapi jika Anda tahu workstation target memiliki Powershell, Anda dapat melakukan sesuatu seperti ini (dengan asumsi skrip BAT / CMD):

CALL:ECHORED "Print me in red!"

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

Edit: (sekarang lebih sederhana!)

Ini jawaban lama tapi saya pikir saya akan menjelaskan & menyederhanakan sedikit

img

PowerShell sekarang termasuk dalam semua versi Windows sejak 7. Oleh karena itu sintaks untuk jawaban ini dapat disingkat menjadi bentuk yang lebih sederhana:

  • yang jalan tidak perlu ditentukan karena harus dalam variabel lingkungan sudah.
  • perintah yang jelas dapat disingkat . Misalnya, Anda dapat:
    • gunakan -foresebagai ganti-foregroundcolor
    • menggunakan -backsebagai ganti-backgroundcolor
  • perintah pada dasarnya juga dapat digunakan ' inline ' sebagai penggantiecho
    (daripada membuat file batch terpisah seperti di atas).

Contoh:

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

Informasi Lebih Lanjut:

Daftar lengkap warna dan informasi lebih lanjut tersedia di
- Dokumentasi PowerShell untukWrite-Host

Iain
sumber
15
Greate, itu bekerja untuk saya, tapi itu tooooooooooooooo lambat.
mulai
4
saya menyadari bahwa ini adalah jawaban yang memberikan solusi, tetapi PowerShell? ya
SgtPooki
2
Itu sebabnya saya mulai dengan "Ini bukan jawaban yang bagus". Saya sangat suka Powershell tapi itu berlebihan untuk ini. ANSICON lebih baik jika Anda bisa menggunakannya untuk mesin target.
Iain
Terima kasih atas jawaban ini. Saya telah melihat tinggi dan rendah untuk cara untuk menggema output berwarna dari file batch di Powershell dan ini adalah satu-satunya. Tidak yakin mengapa perlu waktu lama untuk benar-benar mencetaknya (ada yang menunggu 1 detik untuk setiap panggilan) tetapi setidaknya saya bisa melakukannya. Terima kasih!
pizzafilms
29

Windows 10 - TH2 dan lebih tinggi:

(alias Versi 1511, build 10586, rilis 2015-11-10)

Di Command Prompt:

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

Menggunakan kunci aktual: echo Ctrl+ [[32m HI Ctrl+[[0mEnter

Anda akan melihat "HI" hijau di bawahnya.

Nomor kode dapat ditemukan di sini:

Notepad:

Untuk menyimpan ini ke notepad, Anda dapat mengetik ESC ke dalamnya menggunakan: Alt+ 027dengan numpad, lalu [32mbagian. Trik lain ketika saya menggunakan laptop, arahkan ulang baris di atas ke file untuk memulai, kemudian potong dan tempel:

echo echo ^[[32m HI ^[[0m >> batch_file.cmd
Gringo Suave
sumber
3
Alt + 027 adalah persis apa yang saya butuhkan!
Aleksander Stelmaczonek
1
Alt + 027 dos't berfungsi di Eclipse / Java .. juga mencoba \033tetapi tidak ... bagaimana saya bisa melakukan ini di Jawa?
derHugo
pada windows 10 dan di atasnya, ini berfungsi di DOS dan Notepad ++ editor. Terima kasih!
Junior Mayhé
18

Anda cukup membuat file dengan nama kata yang akan dicetak, menggunakan findstr yang dapat mencetak dalam warna, dan kemudian menghapus file. Coba contoh ini:

@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

Jalankan color /?untuk mendapatkan daftar warna.

Tutankhamen
sumber
3
Ini menetapkan warna di baris perintah windows. Bisakah Anda menjelaskan apa fungsinya?
FeatureCreep
2
Ok, itu hanya membuat file dengan nama kata yang akan dicetak, menggunakan findstr yang dapat mencetak dalam warna, dan kemudian menghapus file.
FeatureCreep
2
Itu mengesankan! Perhatikan bahwa kode warna salah. Jalankan "warna /?" untuk melihat kode warna yang sebenarnya.
yoyo
3
Perhatikan bahwa findstr hanya dapat memberi warna pada nama file , yang berarti Anda tidak dapat menggunakan trik ini untuk string yang berisi karakter jalur ilegal.
yoyo
3
Sebagai catatan, ini akan menimpa file dalam direktori yang sama jika mereka membagikan nama apa yang Anda coba cetak ... itu tidak baik sama sekali.
BrainSlugs83
14

Anda bisa menggunakan ANSICON untuk mengaktifkan kode terminal ANSI di versi Windows yang lebih lama. Ada versi 32 dan 64 bit yang saya gunakan di Windows XP dan Windows 7.

Bryan Ash
sumber
Tidak bisa berfungsi di windows 8.1. Hancur setiap kali saya mencoba dan menginstal.
EHerman
@EHerman Mungkin pertanyaan ini akan membantu.
Bryan Ash
ANSICON tidak diperlukan di versi terbaru dari Win 10. Jangan mencoba menggunakannya di sana.
Gringo Suave
6

Saya terganggu oleh kurangnya pewarnaan yang tepat dalam cmd juga, jadi saya pergi ke depan dan membuat cmdcolor . Itu hanya proksi stdout, yang mencari sekumpulan rangkaian kontrol ANSI / VT100 yang terbatas (dengan kata lain, seperti dalam bash), yaitu echo \033[31m RED \033[0m DEFAULT | cmdcolor.exe.

Penggunaan dan unduhan .

Alec Mev
sumber
Ini keren, dan saya telah memasukkannya ke dalam sistem menu skrip pembuatan raksasa di tempat kerja saya. Hanya daging sapi yang saya miliki adalah biner yang Anda berikan pada halaman itu menargetkan 64-bit, sehingga tidak akan berfungsi pada mesin build 32-bit kami. Tapi itu tidak masalah hanya meraih sumber dan mengkompilasi sendiri.
padi
Tapi ini 32-bit :) Inilah output dari file GNU:cmdcolor.exe; PE32 executable for MS Windows (console) Intel 80386 32-bit
Alec Mev
Itu aneh ... XP Pro menolak untuk menjalankannya, tetapi itu berjalan dengan baik di kotak Win7 64 saya. Saya dikompilasi dengan Visual C ++, menargetkan Win32, dan itu baik-baik saja.
padi
Hah ... mungkin karena upx. Bisakah Anda menghubungi saya melalui surel?
Alec Mev
6

Saya melihat ini karena saya ingin memperkenalkan beberapa warna teks sederhana ke file Batch Win7. Inilah yang saya pikirkan. Terima kasih atas bantuan Anda.

@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
Nick-n-Chicago
sumber
5

Ada jawaban yang diterima dengan lebih dari 250 suara positif. Alasan saya masih berkontribusi adalah karenaescape karakter yang diperlukan untuk echo tidak diterima oleh banyak editor (saya menggunakan, misalnya, MS Code) dan semua solusi lain memerlukan beberapa perangkat lunak pihak ketiga (non-Windows-default).

Mengatasi hanya menggunakan perintah batch biasa menggunakan PROMPTbukan ECHO. The PROMPTperintah menerima escapekarakter dengan cara-apa-editor yang ramah sebagai $Eurutan karakter. (Cukup ganti Escdalam kode Escape ASCII ) dengan $E.

Berikut ini adalah kode demo:

@ECHO OFF

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

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

    :: Entering the "ECHO"-like section

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

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

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

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

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

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

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

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

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

    :: End of "ECHO"-ing

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

EXIT /B 0

CATATAN: Satu-satunya kelemahan adalah bahwa teknik ini bertabrakan dengan pengaturan warna cmd pengguna (color perintah atau pengaturan) jika tidak dikenal secara eksplisit.

- Semoga ini bisa membantu karena ini adalah satu-satunya solusi yang dapat diterima untuk saya karena alasan yang disebutkan di awal. -

EDIT:

Berdasarkan komentar, saya melampirkan cuplikan lain yang terinspirasi oleh @Jeb. Itu:

  • Memperlihatkan cara mendapatkan dan menggunakan runtime karakter "Esc" (daripada memasukkannya ke editor) (solusi Jeb)
  • Menggunakan ECHOperintah "asli"
  • Jadi itu tidak mempengaruhi PROMPTnilai lokal
  • Tunjukkan bahwa mewarnai ECHOkeluaran pasti mempengaruhi PROMPTwarna sehingga warnanya harus diatur ulang
@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
PavDub
sumber
Teknik yang sangat menarik. Saya akan melihat apakah saya perlu memperbarui github.com/VonC/batcolors dengannya. Terpilih.
VonC
@VonC Anda dapat dengan mudah membuat variabel, yang berisi obrolan escape, tanpa harus memasukkannya ke dalam editor. for /F "delims=#" %%E in ('"prompt #$E# & for %%E in (1) do rem"') do set "\e=%%E"
jeb
@ jeb Apakah maksud Anda "dibandingkan dengan yang echodigunakan dalam batcolors / echo.bat "?
VonC
@VonC Ya, ganti set ASCII27=←dengan Anda for /F "delims=#" %%E in ('"prompt #$E# & for %%E in (1) do rem"') do set "ASCII27=%%E". Ini menggunakan karakter pelarian yang dibuat oleh perintah prompt, tanpa mengubah prompt secara permanen (karena promptperintah dijalankan dalam proses anak). Btw. Anda echos.batmemiliki beberapa potensi optimasi ...
jeb
@ jeb "Echos.bat Anda memiliki beberapa potensi optimasi": Saya yakin itu :) Permintaan Tarik dipersilakan (baik untuk ASCII27 dan optimisasi lainnya)
VonC
4

Saya menambahkan jawaban untuk mengatasi masalah yang dicatat dalam beberapa komentar di atas: bahwa kode warna ansi inline dapat berperilaku tidak benar ketika berada di dalam loop FOR (sebenarnya, di dalam blok kode yang diapit). Kode .bat di bawah ini menunjukkan (1) penggunaan kode warna inline, (2) kegagalan warna yang dapat terjadi ketika kode warna inline digunakan dalam loop FOR atau dalam blok kode yang diapit, dan (3) solusi untuk masalah. Ketika kode .bat dijalankan, tes 2 dan 3 menunjukkan kegagalan kode warna, dan tes 4 tidak menunjukkan kegagalan karena mengimplementasikan solusi.

[EDIT 2020-04-07: Saya menemukan solusi lain yang mungkin lebih efisien daripada memanggil subrutin. Lampirkan frasa FINDSTR dalam tanda kurung, seperti pada baris berikut:

   echo success | (findstr /R success)

ENDEDIT]

Catatan: Dalam pengalaman saya (terbatas), masalah kode warna hanya muncul setelah input disalurkan ke FINDSTR di dalam blok kode. Begitulah cara .bat berikut mereproduksi masalah. Mungkin masalah kode warna lebih umum daripada setelah pemipaan ke FINDSTR. Jika seseorang dapat menjelaskan sifat masalahnya, dan jika ada cara yang lebih baik untuk menyelesaikannya, saya akan menghargainya.

@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
Dolores Stevens
sumber
1

Saya baru saja mengkonversi dari Win 7 Home ke Win 10 Pro dan ingin mengganti batch yang saya panggil dari batch lain untuk menggemakan info dalam warna. Meninjau apa yang dibahas di atas, saya menggunakan yang berikut ini yang akan langsung menggantikan batch saya sebelumnya. Perhatikan penambahan "~" pada pesan sehingga pesan dengan spasi dapat digunakan. Alih-alih mengingat kode saya menggunakan huruf untuk warna yang saya butuhkan.

Jika% 2 berisi spasi membutuhkan "..."% 1 Warna Kuat pada hitam: R = Merah G = HIJAU Y = KUNING W = PUTIH

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
surut
sumber
0

Anda harus mengulang urutan kode pelarian ANSI untuk mengubah warna teks: http://en.wikipedia.org/wiki/ANSI_escape_code

Sumber lain yang sangat bagus dari kode pelarian ini adalah http://ascii-table.com/ansi-escape-afterences.php

Bernhard Hofmann
sumber
Itu terlihat sangat menjanjikan tetapi bagaimana cara memancarkan karakter Escape - ASCII 27 dalam perintah gema?
rui
10
Konsol Windows bukan emulator Terminal. Sequence escape ANSI tidak bisa bekerja. Anda dapat membujuk Windows 9x untuk melakukannya dengan memuat ANSI.SYS tapi kami sedikit melewati itu sekarang.
Joey
0

Masukkan baris berikut ke dalam file yang dipanggil ColourText.basdi desktop Anda.

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

Simpan dan ketikkan yang berikut ini di prompt perintah.

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

File bernama ColourText.exe akan muncul di desktop Anda. Pindahkan ke folder Windows .

Untuk menggunakan Anda harus menggunakan dua kode karakter untuk mengatur warna misalnya 01tidak 1.

ColourText ColourOfText ColourOfTextWhenFinished Text

EG Untuk mengatur biru pada putih dengan tidak melewatkan teks apa pun, lalu merah pada teks putih, diakhiri dengan biru pada abu-abu.

ColourText F1 F1
ColourText F2 71 This is green on white

atau

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

Juga CLSperintahnya menjadi menarik. Colorperintah tanpa parameter me-reset semua warna ke warna startup.

Untuk mendapatkan kode warna, tambahkan angka-angka berikut bersama-sama. Gunakan Kalkulator dalam mode programmer. Ini adalah angka hex. Mereka dapat ditambahkan bersama misalnya Merah + Biru + FG Intensitas = 13 = D. Karena 10+ tidak digunakan latar belakang akan menjadi hitam. Kode warna HARUS dua karakter, misalnya 08tidak 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.

sumber
3
Walaupun menarik, tidak semua orang akan menginstal SDK, pada kenyataannya, sangat sedikit orang, saya pikir.
Abel
0

Untuk mendapatkan kerja ini pada Windows 10, Anda dapat mengaktifkan bendera ini: ENABLE_VIRTUAL_TERMINAL_PROCESSING.

Dengan kunci registri ini Anda dapat mengatur ini secara default

[HKCU\Console] VirtualTerminalLevel dword 0x1

Michel de Groot
sumber
0

Alternatifnya adalah menggunakan NodeJS .

Berikut ini sebuah contoh:

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

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

Dan inilah hasilnya:

masukkan deskripsi gambar di sini

Josem
sumber
0

Seperti yang dikatakan Glenn Slayden dalam jawaban ini , Anda dapat menambah nilai yang tepat pada registri untuk membuat cmd "lebih berwarna".

Untungnya, standar global dapat diubah dari opt-in ke opt-out. Kunci registri di HKEY_CURRENT_USER \ Console \ VirtualTerminalLevel menetapkan perilaku default global untuk memproses urutan pelarian ANSI. Buat kunci DWORD (jika perlu) dan tetapkan nilainya ke 1 untuk mengaktifkan (atau 0 untuk menonaktifkan`) pemrosesan ANSI secara default.

torswq
sumber
0

Mengatur warna pada pernyataan log di PowerShell bukan teman yang penting. Anda dapat menggunakan -ForegroundColorparameter.

Untuk menulis pesan konfirmasi.

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

Untuk menulis pesan kesalahan.

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

Untuk menulis pesan progres .

Write-Host "Working under pocess..." -ForegroundColor Green
Bug_
sumber
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
Jamaledine Amarir
sumber
%ESC%kosong, jadi ini tidak akan berfungsi. echo !white!mengatur warna menjadi putih. Untuk kembali ke warna default (apa pun pengaturan pengguna untuk itu): colorperintah tanpa parameter melakukan itu.
Stephan
-1

Kami biasa melakukan ini dengan kode terminal ANSI . Tidak yakin apakah mereka masih berfungsi, tetapi Anda bisa mencobanya.

Michael J
sumber
1
Ini bisa menjadi jawaban yang bagus jika itu menjelaskan bagaimana menggunakan kode terminal ANSI ini ...
Davor Josipovic
1
Saya pikir artikel yang saya tautkan menjelaskannya. Apakah kamu membaca itu? BTW: dikatakan mereka tidak bekerja pada win32.
Michael J
Secara diagonal. Artikel ini menjelaskan apa kode terminal ANSI, tetapi tidak benar-benar bagaimana menggunakannya dari dalam cmd, jadi untuk menjawab pertanyaan. (Ya ... fakta bahwa konsol Win32 tidak didukung membuat mereka sedikit tidak relevan untuk pertanyaan itu.)
Davor Josipovic
1
Anda hanya akan mengulang kode ANSI ke terminal. mis. "echo ← [6m" akan mengatur warna teks terminal ke 6 (merah). Catatan "←" adalah ASCII 27 (melarikan diri). Anda bisa mengetiknya dengan menekan "ALT" dan mengetik "27" pada keypad numerik. Saya baru saja mencarinya di Google dan ternyata Anda masih dapat menggunakan perintah "warna" untuk melakukan hal yang sama (meskipun kode numeriknya berbeda). "color 4" memberi Anda teks merah.
Michael J
-6

Anda dapat menggunakan perintah warna untuk mengubah warna seluruh konsol

Color 0F

Hitam dan putih

Color 0A 

Hitam dan hijau

dan tauro
sumber
20
Bagus untuk mengetahui. Sayangnya ini mengubah warna seluruh konsol dan pertanyaannya adalah bagaimana mengubah satu baris (atau bagian dari itu) ..
Luke
6
OP telah menyatakan bahwa ia terbiasa dengan perintah ini dan masalahnya adalah bahwa ia mengubah seluruh konsol dan bukan garis tertentu.
Randall Flagg
5
Ya memang tidak benar-benar responsif, tapi itu tetap berguna untuk diketahui.
CuriousMarc