Echo mit verschiedenen Farben in der Windows-Befehlszeile

217

Ich weiß, dass der color bfBefehl die Farben des gesamten Befehlszeilenfensters festlegt, aber ich wollte eine einzelne Zeile in einer anderen Farbe drucken.

rui
quelle
1
Es scheint, dass es keine einfache Möglichkeit gibt, die maskierten Farbcodes zur Windows-Befehlszeile hinzuzufügen. :(
Rui
rui, wenn Win10 eine akzeptable Betriebssystemversion ist, lesen Sie die Antwort von Jens - es sollte genau das sein, was Sie brauchen, da diese Frage vor sieben Jahren keine Antwort akzeptiert hat: stackoverflow.com/a/38617204/3543437
kayleeFrye_onDeck
1
Mögliches Duplikat von Wie kann man mehrere Farben in einer Windows-Batchdatei haben?
Micha Wiedenmann

Antworten:

284

Ich wollte eine einzelne Zeile in einer anderen Farbe drucken.

Verwenden Sie ANSI-Escape-Sequenzen.

Windows vor 10 - keine native Unterstützung für ANSI-Farben auf der Konsole

Für Windows-Versionen unter 10 unterstützt die Windows-Befehlskonsole standardmäßig keine Ausgabefarben. Sie können entweder Cmder , ConEmu , ANSICON oder Mintty (standardmäßig in GitBash und Cygwin verwendet) installieren , um Ihrer Windows-Befehlskonsole Farbunterstützung hinzuzufügen.

Windows 10 - Befehlszeilenfarben

Ab Windows 10 unterstützt die Windows-Konsole standardmäßig ANSI-Escape-Sequenzen und einige Farben. Die Funktion wurde mit dem Threshold 2-Update im November 2015 ausgeliefert.

MSDN-Dokumentation

Update (05-2019): Mit dem ColorTool können Sie das Farbschema der Konsole ändern. Es ist Teil des Microsoft Terminal- Projekts.

Demo

Geben Sie hier die Bildbeschreibung ein

Stapelbefehl

Das win10colors.cmdwurde von Michele Locati geschrieben :

@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
quelle
11
@Jens A. Koch - es funktioniert nicht in meiner Windows 10-Konsole (cmd)
user3057544
40
OK. Danke für die Rückmeldung. .cmdoder .bat- beide sollten funktionieren. Aber ich glaube, ich weiß, warum es nicht funktioniert: Es scheint, dass das Escape-Symbol beim Posten in StackOverflow entfernt wird. Bitte kopieren Sie den Inhalt nicht aus meiner Antwort, sondern verwenden Sie den Inhalt hier: gist.githubusercontent.com/mlocati/…
Jens A. Koch
28
Ich musste noch nie einen ESCin Notepad ++ generieren ... Sie können dies mit ALT-Codes tun, indem Sie den Nummernblock und die linke ALT-Taste verwenden: L-ALT+ 0+ 2+7
kayleeFrye_onDeck
3
Übrigens, als jemand, der an den meisten Tagen viele Chargen herstellt und verwendet, hat diese Antwort mein gesamtes Toolset auf ästhetische Weise verbessert! Verwenden Sie VB? Auf keinen Fall. Dies ist der richtige Weg!
KayleeFrye_onDeck
4
Sie können ein ESCZeichen in einer Batch-Datei auf folgende Weise generieren :for /F %%a in ('echo prompt $E ^| cmd') do set "ESC=%%a"
Aacini
56

Dies ist ein selbstkompilierter bat / .net-Hybrid (sollte gespeichert werden als .BAT), der auf jedem System verwendet werden kann, auf dem .net-Framework installiert ist (Windows ohne .NET-Framework ist selbst für das älteste XP / 2003 selten zu sehen Installationen). Es verwendet den jscript.net-Compiler, um eine Exe zu erstellen, die Zeichenfolgen mit unterschiedlichen Hintergrund- / Vordergrundfarben nur für die aktuelle Zeile drucken kann.

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

Hier ist die Hilfemeldung:

Geben Sie hier die Bildbeschreibung ein

Beispiel :

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

Sie finden dieses Skript auch hier .

Sie können auch die Farbfunktion von Carlos überprüfen -> http://www.dostips.com/forum/viewtopic.php?f=3&t=4453

npocmaka
quelle
13
Wie cool ist das. Eine bat-Datei, die das darin enthaltene jscript kompiliert und nur dann, wenn es nötig ist - ich bin sehr beeindruckt. Ich wusste nicht einmal, dass es dort einen jscript-Compiler gibt, der darauf wartet, verwendet zu werden. Du bekommst meine "tolle Auszeichnung" für den Monat. Sie sollten erwähnen, dass die erste Verwendung langsam sein wird (aufgrund der Kompilierung).
Graham
4
Ich brauche Farbe nicht dringend genug, um dieses Extrem zu erreichen, aber die Technik ist wirklich beeindruckend und ich kann mir vorstellen, dass ich sie woanders verwende.
EM0
47

Dies ist keine gute Antwort, aber wenn Sie wissen, dass die Zielarbeitsstation über Powershell verfügt, können Sie Folgendes tun (unter der Annahme eines BAT / CMD-Skripts):

CALL:ECHORED "Print me in red!"

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

Edit: (jetzt einfacher!)

Es ist eine alte Antwort, aber ich dachte, ich würde ein bisschen klarstellen und vereinfachen

img

Powershell ist jetzt enthalten in allen Versionen von Windows seit dem 7. Deshalb ist die Syntax für diese Antwort kann auf eine einfachere Form verkürzt werden:

  • Der Pfad muss nicht angegeben werden, da er sich bereits in der Umgebungsvariablen befinden sollte.
  • Eindeutige Befehle können abgekürzt werden . Zum Beispiel können Sie:
    • verwenden -forestatt-foregroundcolor
    • verwenden -backstatt-backgroundcolor
  • Der Befehl kann grundsätzlich auch ' inline ' anstelle von echo
    (anstatt wie oben eine separate Batch-Datei zu erstellen) verwendet werden.

Beispiel:

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

Mehr Informationen:

Die vollständige Liste der Farben und weitere Informationen finden Sie in der
- PowerShell- Dokumentation fürWrite-Host

Iain
quelle
14
Greate, es funktioniert bei mir, aber es ist zu langsam.
Wener
4
Mir ist klar, dass dies eine Antwort ist, die eine Lösung bietet, aber Powershell? Pfui.
SgtPooki
2
Deshalb habe ich mit "Das ist keine gute Antwort" begonnen. Ich mag Powershell sehr, aber es ist übertrieben. ANSICON ist besser, wenn Sie es auf den Zielcomputern bereitstellen können.
Iain
Vielen Dank für diese Antwort. Ich habe nach einer Möglichkeit gesucht, die farbige Ausgabe einer Batch-Datei in Powershell wiederzugeben, und dies war die einzige. Ich bin mir nicht sicher, warum das Drucken so lange dauert (es dauert ungefähr 1 Sekunde bei jedem Anruf), aber zumindest kann ich es tun. Danke dir!
Pizzafilme
29

Windows 10 - TH2 und höher:

(aka Version 1511, Build 10586, Release 2015-11-10)

Auf Eingabeaufforderung:

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

Verwenden der eigentlichen Tasten: Echo Ctrl+ [[32m HI Ctrl+[[0mEnter

Darunter sollte ein grünes "HI" angezeigt werden.

Codenummern finden Sie hier:

Notizblock:

Um dies im Editor zu speichern, können Sie ESC eingeben, indem Sie: Alt+ 027mit dem Nummernblock und dann mit dem [32mTeil eingeben . Ein weiterer Trick, als ich auf einem Laptop war, leiten Sie die obige Zeile in eine Datei um, um loszulegen, und schneiden Sie sie dann aus und fügen Sie sie ein:

echo echo ^[[32m HI ^[[0m >> batch_file.cmd
Gringo Suave
quelle
3
Alt + 027 war genau das, was ich brauchte!
Aleksander Stelmaczonek
1
Alt + 027 funktioniert nicht in Eclipse / Java. \033Ich habe es auch versucht, aber nein. Wie kann ich das in Java tun?
derHugo
Unter Windows 10 und höher funktioniert dies unter DOS und Notepad ++. Vielen Dank!
Junior Mayhé
17

Sie können einfach Dateien mit dem Namen des zu druckenden Wortes erstellen, findstr verwenden, das in Farbe drucken kann, und dann die Datei löschen. Versuchen Sie dieses Beispiel:

@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

Führen Sie aus color /?, um eine Liste der Farben zu erhalten.

Tutanchamun
quelle
3
Dadurch werden die Farben in der Windows-Befehlszeile festgelegt. Können Sie erklären, was es tut?
FeatureCreep
2
Ok, es werden nur Dateien mit dem Namen des zu druckenden Wortes erstellt, findstr verwendet, das in Farbe drucken kann, und die Datei wird dann gelöscht.
FeatureCreep
2
Das ist beeindruckend! Beachten Sie, dass die Farbcodes falsch sind. Führen Sie "color /?" um die tatsächlichen Farbcodes zu sehen.
Yooy
3
Beachten Sie, dass findstr nur den Dateinamen einfärben kann. Dies bedeutet, dass Sie diesen Trick nicht für Zeichenfolgen verwenden können, die unzulässige Pfadzeichen enthalten.
Yooy
3
Beachten Sie auch, dass dadurch Dateien im selben Verzeichnis überschrieben werden, wenn sie den Namen des zu druckenden Objekts gemeinsam haben. Das ist überhaupt nicht gut.
BrainSlugs83
14

Sie können ANSICON verwenden , um ANSI-Terminalcodes in älteren Windows-Versionen zu aktivieren. Es gibt 32- und 64-Bit-Versionen, die ich in Windows XP und Windows 7 verwendet habe.

Bryan Ash
quelle
Unter Windows 8.1 funktioniert es nicht. Absturz jedes Mal, wenn ich versuche zu installieren.
EHerman
@EHerman Vielleicht hilft diese Frage .
Bryan Ash
ANSICON wird in späteren Versionen von Win 10 nicht benötigt. Versuchen Sie nicht, es dort zu verwenden.
Gringo Suave
6

Ich war auch verärgert über den Mangel an korrekter Farbgebung in cmd, also habe ich cmdcolor erstellt . Es ist nur ein Standard-Proxy, der nach einem begrenzten Satz von ANSI / VT100-Steuersequenzen sucht (mit anderen Worten, wie in Bash), d echo \033[31m RED \033[0m DEFAULT | cmdcolor.exe. H.

Nutzung und Downloads .

Alec Mev
quelle
Das ist cool und ich habe es bei meiner Arbeit in das Menüsystem eines riesigen Build-Skripts eingefügt. Ich habe nur das Problem, dass die Binärdatei, die Sie auf dieser Seite bereitstellen, auf 64-Bit abzielt, sodass sie auf unserer 32-Bit-Build-Maschine nicht funktioniert. Aber es war kein Problem, einfach die Quelle zu greifen und mich selbst zu kompilieren.
Reis
Aber es ist 32-Bit :) Hier ist die Ausgabe der GNU-Datei:cmdcolor.exe; PE32 executable for MS Windows (console) Intel 80386 32-bit
Alec Mev
Das ist seltsam ... XP Pro hat sich geweigert, es auszuführen, aber es lief gut auf meiner Win7 64-Box. Ich habe mit Visual C ++ kompiliert und auf Win32 abgezielt, und es war in Ordnung.
Reis
Huh ... wahrscheinlich wegen upx. Könnten Sie mich bitte per E-Mail kontaktieren?
Alec Mev
6

Ich habe mir das angeschaut, weil ich einer Win7-Batch-Datei einige einfache Textfarben hinzufügen wollte. Das habe ich mir ausgedacht. Danke für Ihre Hilfe.

@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
quelle
5

Es gibt bereits eine akzeptierte Antwort mit mehr als 250 Upvotes. Der Grund, warum ich immer noch einen Beitrag escapeleiste, ist, dass das für das Echo erforderliche Zeichen von vielen Editoren nicht akzeptiert wird (ich verwende z. B. MS Code) und alle anderen Lösungen Software von Drittanbietern (nicht Windows-Standard) erfordern.

Die Umgehung mit nur einfachen Stapelbefehlen wird PROMPTanstelle von verwendet ECHO. Der PROMPTBefehl akzeptiert das escapeZeichen in beliebiger Editorform als $EZeichenfolge. (Ersetzen Sie einfach die Escin den ASCII-Escape-Codes ) durch $E.

Hier ist ein Demo-Code:

@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

HINWEIS: Der einzige Nachteil besteht darin, dass diese Technik mit den Cmd-Farbeinstellungen des Benutzers ( colorBefehl oder Einstellungen) kollidiert, wenn dies nicht explizit bekannt ist.

- Ich hoffe, dies hilft, da dies aus den eingangs genannten Gründen die einzige für mich akzeptable Lösung ist. - -

BEARBEITEN:

Aufgrund von Kommentaren füge ich ein weiteres Snippet bei, das von @Jeb inspiriert wurde. Es:

  • Zeigt, wie die Laufzeit des "Esc" -Zeichens abgerufen und verwendet wird (anstatt sie in einen Editor einzugeben) (Jebs Lösung)
  • Verwendet "native" ECHOBefehle.
  • Der lokale PROMPTWert wird also nicht beeinflusst
  • Zeigt, dass das Färben der ECHOAusgabe zwangsläufig die PROMPTFarbe beeinflusst, sodass die Farbe ohnehin zurückgesetzt werden muss
@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
quelle
Sehr interessante Technik. Ich werde sehen, ob ich github.com/VonC/batcolors damit aktualisieren muss. Upvoted.
VonC
@VonC Sie können einfach eine Variable erstellen, die das Escape-Chat-Zeichen enthält, ohne es in den Editor eingeben zu müssen. for /F "delims=#" %%E in ('"prompt #$E# & for %%E in (1) do rem"') do set "\e=%%E"
Jeb
@jeb Meinst du „im Gegensatz zu echoin verwendet batcolors / echo.bat “?
VonC
@VonC Ja, ersetzen Sie Ihre set ASCII27=←durch for /F "delims=#" %%E in ('"prompt #$E# & for %%E in (1) do rem"') do set "ASCII27=%%E". Hierbei wird das durch den Eingabeaufforderungsbefehl erstellte Escapezeichen verwendet, ohne die Eingabeaufforderung dauerhaft zu ändern (da der promptBefehl in einem untergeordneten Prozess ausgeführt wird). Übrigens. Ihr echos.bat
habt
@jeb "Ihre echos.bat hat ein gewisses Optimierungspotential": Da bin ich mir sicher :) Pull-Anfragen sind willkommen (sowohl für den ASCII27 als auch für andere Optimierungen)
VonC
4

Ich füge eine Antwort hinzu, um ein Problem zu beheben, das in einigen Kommentaren oben erwähnt wurde: Inline-Ansi-Farbcodes können sich in einer FOR-Schleife (tatsächlich in einem Codeblock in Klammern) schlecht verhalten. Der folgende .bat-Code zeigt (1) die Verwendung von Inline-Farbcodes, (2) den Farbfehler, der auftreten kann, wenn Inline-Farbcodes in einer FOR-Schleife oder in einem Codeblock in Klammern verwendet werden, und (3) eine Lösung für das Problem. Wenn der .bat-Code ausgeführt wird, zeigen die Tests 2 und 3 den Farbcodefehler, und Test 4 zeigt keinen Fehler, da er die Lösung implementiert.

[EDIT 2020-04-07: Ich habe eine andere Lösung gefunden, die vermutlich effizienter ist als das Aufrufen eines Unterprogramms. Fügen Sie die FINDSTR-Phrase wie in der folgenden Zeile in Klammern ein:

   echo success | (findstr /R success)

ENDEDIT]

Hinweis: Nach meiner (eingeschränkten) Erfahrung tritt das Problem mit dem Farbcode erst auf, nachdem die Eingabe innerhalb des Codeblocks an FINDSTR weitergeleitet wurde. So reproduziert die folgende .bat das Problem. Möglicherweise ist das Problem mit dem Farbcode allgemeiner als nach dem Weiterleiten an FINDSTR. Wenn jemand die Natur des Problems erklären kann und es einen besseren Weg gibt, es zu lösen, würde ich es begrüßen.

@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
quelle
1

Ich habe gerade von Win 7 Home auf Win 10 Pro konvertiert und wollte den Stapel, den ich von anderen Stapeln aufrufe, ersetzen, um Informationen in Farbe wiederzugeben. Wenn ich die oben beschriebenen Punkte überprüfe, verwende ich Folgendes, das meine vorherige Charge direkt ersetzt. HINWEIS: Fügen Sie der Nachricht "~" hinzu, damit Nachrichten mit Leerzeichen verwendet werden können. Anstatt mich an Codes zu erinnern, verwende ich Buchstaben für die Farben, die ich brauchte.

Wenn% 2 Leerzeichen enthält, ist "..."% 1 erforderlich. Starke Farben auf Schwarz: R = Rot G = GRÜN Y = GELB W = WEISS

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
Ebloch
quelle
0

Sie müssen eine ANSI-Escape-Code-Sequenz wiederholen, um die Textfarbe zu ändern: http://en.wikipedia.org/wiki/ANSI_escape_code

Eine weitere sehr gute Quelle für diese Escape-Codes ist http://ascii-table.com/ansi-escape-sequences.php

Bernhard Hofmann
quelle
Das sieht wirklich vielversprechend aus, aber wie kann ich das Escape-Zeichen - ASCII 27 - in einem Echo-Befehl ausgeben?
Rui
10
Die Windows-Konsole ist kein Terminalemulator. ANSI-Escape-Sequenzen können einfach nicht funktionieren. Sie könnten Windows 9x dazu überreden, indem Sie ANSI.SYS laden, aber wir sind inzwischen ein wenig darüber hinaus.
Joey
0

Fügen Sie die folgenden Zeilen in eine Datei ein, die ColourText.basauf Ihrem Desktop aufgerufen wird .

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

Speichern Sie es und geben Sie Folgendes in eine Eingabeaufforderung ein.

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

Eine Datei mit dem Namen ColourText.exe wird auf Ihrem Desktop angezeigt. Verschieben Sie es in den Windows-Ordner .

Zur Verwendung müssen Sie zwei Zeichencodes verwenden, um die Farbe einzustellen, z . B. 01nicht 1.

ColourText ColourOfText ColourOfTextWhenFinished Text

EG Um Blau auf Weiß zu setzen, indem kein Text übergeben wird, dann Rot auf Weiß, und Blau auf Grau.

ColourText F1 F1
ColourText F2 71 This is green on white

oder

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

Auch der CLSBefehl wird interessant. ColorBefehl ohne Parameter setzt alle Farben auf Startfarben zurück.

Um den Farbcode zu erhalten, addieren Sie die folgenden Zahlen. Verwenden Sie den Rechner im Programmiermodus. Dies sind Hex-Zahlen. Sie können addiert werden, z. B. Rot + Blau + FG Intensität = 13 = D. Da 10+ nicht verwendet wurde, ist der Hintergrund schwarz. Farbcodes MÜSSEN aus zwei Zeichen bestehen, z . B. 08nicht 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.

quelle
2
Obwohl interessant, wird nicht jeder das SDK installiert haben, in der Tat nur sehr wenige Leute, denke ich.
Abel
0

Damit dies unter Windows 10 funktioniert, können Sie dieses Flag aktivieren : ENABLE_VIRTUAL_TERMINAL_PROCESSING.

Mit diesem Registrierungsschlüssel können Sie dies standardmäßig festlegen

[HKCU\Console] VirtualTerminalLevel dword 0x1

Michel de Groot
quelle
0

Eine Alternative ist die Verwendung von NodeJS .

Hier ist ein Beispiel:

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

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

Und das ist das Ergebnis:

Geben Sie hier die Bildbeschreibung ein

Josem
quelle
0

Wie Glenn Slayden in dieser Antwort sagte , können Sie der Registrierung den richtigen Wert hinzufügen, um das cmd "bunter" zu machen.

Glücklicherweise kann der globale Standard von Opt-In in Opt-Out geändert werden. Der Registrierungsschlüssel unter HKEY_CURRENT_USER \ Console \ VirtualTerminalLevel legt das globale Standardverhalten für die Verarbeitung von ANSI-Escape-Sequenzen fest. Erstellen Sie einen DWORD-Schlüssel (falls erforderlich) und setzen Sie seinen Wert auf 1, um die ANSI-Verarbeitung standardmäßig global zu aktivieren (oder auf 0, um sie zu deaktivieren).

torswq
quelle
0

Das Festlegen der Farbe für die Protokollanweisungen in Powershell ist kein großer Freund. Sie können -ForegroundColorParameter verwenden.

Eine Bestätigungsnachricht schreiben.

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

So schreiben Sie eine Fehlermeldung.

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

So schreiben Sie eine Fortschrittsmeldung .

Write-Host "Working under pocess..." -ForegroundColor Green
Fehler_
quelle
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
quelle
%ESC%ist leer, also wird das nicht funktionieren. echo !white!setzt die Farbe auf weiß. So kehren Sie zu den Standardfarben zurück (unabhängig von den Benutzereinstellungen): Der colorBefehl ohne Parameter führt dies aus.
Stephan
-1

Früher haben wir dies mit ANSI-Terminalcodes gemacht . Ich bin mir nicht sicher, ob sie noch funktionieren, aber Sie könnten sie ausprobieren.

Michael J.
quelle
1
Dies könnte eine gute Antwort sein, wenn erklärt wird, wie diese ANSI-Terminalcodes verwendet werden ...
Davor Josipovic
1
Ich dachte, der Artikel, auf den ich verlinkt habe, hat es erklärt. Hast du das gelesen Übrigens: Es heißt, dass sie nicht an Win32 arbeiten.
Michael J
Schräg. Der Artikel erklärt, was ANSI-Terminalcodes sind, aber nicht wirklich, wie sie innerhalb von cmd verwendet werden, um die Frage zu beantworten. (Ja ... die Tatsache, dass die Win32-Konsole nicht unterstützt wird, macht sie für die Frage etwas irrelevant.)
Davor Josipovic
1
Sie würden nur die ANSI-Codes an das Terminal zurücksenden. Beispiel: "echo ← [6m" würde die Textfarbe des Terminals auf 6 (rot) setzen. Hinweis "←" ist ASCII 27 (Escape). Sie können es eingeben, indem Sie "ALT" gedrückt halten und "27" auf dem Ziffernblock eingeben. Ich habe es nur gegoogelt und herausgefunden, dass Sie immer noch den Befehl "Farbe" verwenden können, um dasselbe zu tun (obwohl die numerischen Codes unterschiedlich sind). "Farbe 4" bringt Ihnen roten Text.
Michael J
-6

Mit dem Befehl color können Sie die Farbe der gesamten Konsole ändern

Color 0F

Ist schwarz und weiß

Color 0A 

Ist schwarz und grün

dan tauro
quelle
20
Gut zu wissen. Leider ändert dies die Farbe der gesamten Konsole und die Frage ist, wie eine einzelne Zeile (oder ein Teil davon) geändert werden kann.
Luke
6
Das OP hat angegeben, dass er mit diesem Befehl vertraut ist und dass das Problem darin besteht, dass die gesamte Konsole und nicht eine bestimmte Zeile geändert wird.
Randall Flagg
5
Ja, zwar nicht wirklich reaktionsschnell, aber das ist immer noch nützlich zu wissen.
CuriousMarc