Wie kann man mehrere Farben in einer Windows-Batchdatei haben?

73

Ich habe mich gefragt, ob es möglich ist, in einer Windows-Batchdatei verschiedenfarbigen Text in derselben Zeile zu haben, zum Beispiel, wenn darin steht

echo hi world

Ich möchte, dass "Hallo" eine Farbe und "Welt" eine andere Farbe ist. Vielleicht könnte ich den Befehl COLOR als Variable festlegen:

set color1= color 2
set color9= color A

und stellen Sie sie dann beide zusammen mit zusammen in derselben Zeile bereit

echo hi world

aber ich weiß nicht, wie ich das machen würde.

daniel11
quelle

Antworten:

27

Dies kann tatsächlich ohne Erstellen einer temporären Datei erfolgen. Die von jeb und dbenham beschriebene Methode funktioniert auch mit einer Zieldatei, die keine Backspaces enthält. Der kritische Punkt ist, dass die von findstr.exe erkannte Linie nicht mit einer CRLF enden darf. Die naheliegende Textdatei zum Scannen mit einer Zeile, die nicht mit einer CRLF endet, ist der aufrufende Stapel selbst, vorausgesetzt, wir beenden ihn mit einer solchen Zeile! Hier ist ein aktualisiertes Beispielskript, das auf diese Weise funktioniert ...

Änderungen gegenüber dem vorherigen Beispiel:

  • Verwendet einen einzelnen Bindestrich in der letzten Zeile als durchsuchbare Zeichenfolge. (Muss kurz sein und darf nirgendwo anders im Stapel erscheinen.)
  • Routinen und Variablen umbenannt, um etwas objektorientierter zu sein :-)
  • Eine Anrufstufe wurde entfernt, um die Leistung leicht zu verbessern.
  • Kommentare hinzugefügt (Beginnend mit: #, um mehr wie die meisten anderen Skriptsprachen auszusehen.)

@echo off
setlocal

call :Echo.Color.Init

goto main

:Echo.Color %1=Color %2=Str [%3=/n]
setlocal enableDelayedExpansion
set "str=%~2"
:Echo.Color.2
:# Replace path separators in the string, so that the final path still refers to the current path.
set "str=a%ECHO.DEL%!str:\=a%ECHO.DEL%\..\%ECHO.DEL%%ECHO.DEL%%ECHO.DEL%!"
set "str=!str:/=a%ECHO.DEL%/..\%ECHO.DEL%%ECHO.DEL%%ECHO.DEL%!"
set "str=!str:"=\"!"
:# Go to the script directory and search for the trailing -
pushd "%ECHO.DIR%"
findstr /p /r /a:%~1 "^^-" "!str!\..\!ECHO.FILE!" nul
popd
:# Remove the name of this script from the output. (Dependant on its length.)
for /l %%n in (1,1,12) do if not "!ECHO.FILE:~%%n!"=="" <nul set /p "=%ECHO.DEL%"
:# Remove the other unwanted characters "\..\: -"
<nul set /p "=%ECHO.DEL%%ECHO.DEL%%ECHO.DEL%%ECHO.DEL%%ECHO.DEL%%ECHO.DEL%%ECHO.DEL%"
:# Append the optional CRLF
if not "%~3"=="" echo.
endlocal & goto :eof

:Echo.Color.Var %1=Color %2=StrVar [%3=/n]
if not defined %~2 goto :eof
setlocal enableDelayedExpansion
set "str=!%~2!"
goto :Echo.Color.2

:Echo.Color.Init
set "ECHO.COLOR=call :Echo.Color"
set "ECHO.DIR=%~dp0"
set "ECHO.FILE=%~nx0"
set "ECHO.FULL=%ECHO.DIR%%ECHO.FILE%"
:# Use prompt to store a backspace into a variable. (Actually backspace+space+backspace)
for /F "tokens=1 delims=#" %%a in ('"prompt #$H# & echo on & for %%b in (1) do rem"') do set "ECHO.DEL=%%a"
goto :eof

:main
call :Echo.Color 0a "a"
call :Echo.Color 0b "b"
set "txt=^" & call :Echo.Color.Var 0c txt
call :Echo.Color 0d "<"
call :Echo.Color 0e ">"
call :Echo.Color 0f "&"
call :Echo.Color 1a "|"
call :Echo.Color 1b " "
call :Echo.Color 1c "%%%%"
call :Echo.Color 1d ^"""
call :Echo.Color 1e "*"
call :Echo.Color 1f "?"
:# call :Echo.Color 2a "!"
call :Echo.Color 2b "."
call :Echo.Color 2c ".."
call :Echo.Color 2d "/"
call :Echo.Color 2e "\"
call :Echo.Color 2f "q:" /n
echo(
set complex="c:\hello world!/.\..\\a//^<%%>&|!" /^^^<%%^>^&^|!\
call :Echo.Color.Var 74 complex /n

exit /b

:# The following line must be last and not end by a CRLF.
-

PS. Ich habe ein Problem mit der Ausgabe der! Zeichen, das Sie im vorherigen Beispiel nicht hatten. (Oder zumindest hatten Sie nicht die gleichen Symptome.) Zu untersuchen.

JFL
quelle
4
Das Problem mit dem !kann mit einem call :Echo.Color 2f ^^^!oder gelöst werden, wenn die verzögerte Erweiterung beim Aufruf von use call :Echo.Color 2f ^^^^^^^!
aktiviert wird
Hallo, vielleicht fehlt mir etwas, aber ich verwende Ihr Beispiel oben Zeile für Zeile in einer Eingabeaufforderung (ohne Administratorrechte) unter Win 8.1 Update 1 und erhalte die folgende Ausgabe: i.imgur.com/ 1CsOWdu.png - ist das richtig? Danke
Adam Plocher
Wie benutzt du das?
Sam Hasler
Interessante Idee, aber ich würde diese Technik nicht verwenden, da der Skriptname beschreibend sein sollte. Je länger der Name, desto mehr Totraum haben Sie am Ende jeder Zeile, in der Sie nicht in Farbe drucken können. Ich würde immer einen Dateinamen mit der Länge 1 verwenden, aber das kann nicht beschreibend sein, also verwende ich eine temporäre Datei.
Dbenham
Sie müssen sich keine Sorgen um eine eindeutige Linie machen. Sie können einfach nach Zeilen suchen, die keine CR enthalten, indem Sie die /VOption mit einer Suchzeichenfolge von verwenden $. Der FINDSTR-Regex $ -Anker sucht nach CR! Es ist auch nicht erforderlich, die Länge des Dateinamens jedes Mal zu berechnen. Dies kann während der Initialisierung erfolgen, und die Löschzeichen können in eine Zeichenfolge "Konstante" eingefügt werden.
Dbenham
73

Sie können mehrfarbige Ausgaben ohne externe Programme ausführen.

@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"
)
echo say the name of the colors, don't read

call :ColorText 0a "blue"
call :ColorText 0C "green"
call :ColorText 0b "red"
echo(
call :ColorText 19 "yellow"
call :ColorText 2F "black"
call :ColorText 4e "white"

goto :eof

:ColorText
echo off
<nul set /p ".=%DEL%" > "%~2"
findstr /v /a:%1 /R "^$" "%~2" nul
del "%~2" > nul 2>&1
goto :eof

Es verwendet die Farbfunktion des Befehls findstr.

Findstr kann so konfiguriert werden, dass Zeilennummern oder Dateinamen in einer definierten Farbe ausgegeben werden.
Also erstelle ich zuerst eine Datei mit dem Text als Dateinamen und der Inhalt ist ein einzelnes <backspace>Zeichen (ASCII 8).
Dann suche ich alle nicht leeren Zeilen in der Datei und in nul, damit der Dateiname in der richtigen Farbe ausgegeben wird, an die ein Doppelpunkt angehängt ist, aber der Doppelpunkt wird sofort von der entfernt <backspace>.

EDIT: Ein Jahr später ... sind alle Zeichen gültig

@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"
)

rem Prepare a file "X" with only one dot
<nul > X set /p ".=."

call :color 1a "a"
call :color 1b "b"
call :color 1c "^!<>&| %%%%"*?"
exit /b

:color
set "param=^%~2" !
set "param=!param:"=\"!"
findstr /p /A:%1 "." "!param!\..\X" nul
<nul set /p ".=%DEL%%DEL%%DEL%%DEL%%DEL%%DEL%%DEL%"
exit /b

Dies verwendet die Regel für gültige Pfad- / Dateinamen.
Wenn sich a \..\im Pfad befindet, wird das vorangestellte Element vollständig entfernt und es ist nicht erforderlich, dass dieses Element nur gültige Dateinamenzeichen enthält.

jeb
quelle
1
ok, das hat super funktioniert, aber gibt es eine Möglichkeit, die Anzahl der Eingaben auf eine einzige Codezeile zu reduzieren, um dies zu tun? Kann ich dies als globale Variable namens "defcolor" festlegen und jedes Mal verwenden, wenn ich die Eingabeaufforderung öffne? (durch Importieren oder als Systemvariable?)
daniel11
1
und könnten Sie mir eine Vorlage zeigen, die ich dafür verwenden könnte? Wie die Vorlage für den Befehl "findstr" ist so etwas wie "FINDSTR / A / Datei [Dateiname] / Pfad [Pfad]" etwas Generisches, das ich als Leitfaden für die zukünftige Verwendung verwenden kann.
Daniel11
1
@Herr. Bungle: Aber jetzt funktionieren auch alle anderen Charaktere :-)
jeb
1
Um zu einer neuen echo(
Zeile
1
Sie sollten Ihre temporäre Datei löschen, bevor Sie beenden .. del /f /q X;) Sehr schöne Lösung ..
kodybrown
44

Jebs bearbeitete Antwort kommt der Lösung aller Probleme nahe. Es gibt jedoch Probleme mit den folgenden Zeichenfolgen:

"a\b\"
"a/b/"
"\"
"/"
"."
".."
"c:"

Ich habe seine Technik so geändert, dass sie meiner Meinung nach wirklich mit jeder Reihe druckbarer Zeichen umgehen kann, mit Ausnahme von Längenbeschränkungen.

Weitere Verbesserungen:

  • Verwendet den Speicherort% TEMP% für die temporäre Datei, sodass kein Schreibzugriff mehr auf das aktuelle Verzeichnis erforderlich ist.

  • Es wurden 2 Varianten erstellt, eine verwendet ein Zeichenfolgenliteral, die andere den Namen einer Variablen, die die Zeichenfolge enthält. Die variable Version ist im Allgemeinen weniger praktisch, beseitigt jedoch einige Probleme beim Entkommen von Sonderzeichen.

  • Die Option / n wurde als optionaler dritter Parameter hinzugefügt, um eine neue Zeile am Ende der Ausgabe anzuhängen.

Die Rücktaste funktioniert nicht über einen Zeilenumbruch hinweg, sodass die Technik Probleme haben kann, wenn die Zeile umbrochen wird. Das Drucken einer Zeichenfolge mit einer Länge zwischen 74 und 79 funktioniert beispielsweise nicht ordnungsgemäß, wenn die Konsole eine Zeilenbreite von 80 hat.

@echo off
setlocal

call :initColorPrint

call :colorPrint 0a "a"
call :colorPrint 0b "b"
set "txt=^" & call :colorPrintVar 0c txt
call :colorPrint 0d "<"
call :colorPrint 0e ">"
call :colorPrint 0f "&"
call :colorPrint 1a "|"
call :colorPrint 1b " "
call :colorPrint 1c "%%%%"
call :colorPrint 1d ^"""
call :colorPrint 1e "*"
call :colorPrint 1f "?"
call :colorPrint 2a "!"
call :colorPrint 2b "."
call :colorPrint 2c ".."
call :colorPrint 2d "/"
call :colorPrint 2e "\"
call :colorPrint 2f "q:" /n
echo(
set complex="c:\hello world!/.\..\\a//^<%%>&|!" /^^^<%%^>^&^|!\
call :colorPrintVar 74 complex /n

call :cleanupColorPrint

exit /b

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

:colorPrint Color  Str  [/n]
setlocal
set "str=%~2"
call :colorPrintVar %1 str %3
exit /b

:colorPrintVar  Color  StrVar  [/n]
if not defined %~2 exit /b
setlocal enableDelayedExpansion
set "str=a%DEL%!%~2:\=a%DEL%\..\%DEL%%DEL%%DEL%!"
set "str=!str:/=a%DEL%/..\%DEL%%DEL%%DEL%!"
set "str=!str:"=\"!"
pushd "%temp%"
findstr /p /A:%1 "." "!str!\..\x" nul
if /i "%~3"=="/n" echo(
exit /b

:initColorPrint
for /F "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do rem"') do set "DEL=%%a"
<nul >"%temp%\x" set /p "=%DEL%%DEL%%DEL%%DEL%%DEL%%DEL%.%DEL%"
exit /b

:cleanupColorPrint
del "%temp%\x"
exit /b


UPDATE 27.11.2012

Diese Methode schlägt unter XP fehl, da FINDSTR die Rücktaste als Punkt auf dem Bildschirm anzeigt. Jebs ursprüngliche Antwort funktioniert unter XP, allerdings mit den bereits erwähnten Einschränkungen


UPDATE 14.12.2012

Bei DosTips und SS64 gab es viele Entwicklungsaktivitäten . Es stellt sich heraus, dass FINDSTR auch Dateinamen mit erweitertem ASCII beschädigt, wenn diese in der Befehlszeile angegeben werden. Ich habe meine FINDSTR-Fragen und Antworten aktualisiert .

Unten finden Sie eine Version, die unter XP funktioniert und ALLE Einzelbyte-Zeichen außer 0x00 (nul), 0x0A (Zeilenvorschub) und 0x0D (Wagenrücklauf) unterstützt. Unter XP werden die meisten Steuerzeichen jedoch als Punkte angezeigt. Dies ist eine inhärente Funktion von FINDSTR unter XP, die nicht vermieden werden kann.

Leider verlangsamt das Hinzufügen von Unterstützung für XP und für erweiterte ASCII-Zeichen die Routine :-(

Nur zum Spaß habe ich einige farbige ASCII-Kunstwerke aus der ASCII Art Gallery von Joan Stark genommen und sie für die Verwendung mit ColorPrint angepasst. Ich habe einen a: c-Einstiegspunkt nur zur Abkürzung und zur Behandlung eines Problems mit Anführungszeichen hinzugefügt.

@echo off
setlocal disableDelayedExpansion
set q=^"
echo(
echo(
call :c 0E "                ,      .-;" /n
call :c 0E "             ,  |\    / /  __," /n
call :c 0E "             |\ '.`-.|  |.'.-'" /n
call :c 0E "              \`'-:  `; : /" /n
call :c 0E "               `-._'.  \'|" /n
call :c 0E "              ,_.-=` ` `  ~,_" /n
call :c 0E "               '--,.    "&call :c 0c ".-. "&call :c 0E ",=!q!." /n
call :c 0E "                 /     "&call :c 0c "{ "&call :c 0A "* "&call :c 0c ")"&call :c 0E "`"&call :c 06 ";-."&call :c 0E "}" /n
call :c 0E "                 |      "&call :c 0c "'-' "&call :c 06 "/__ |" /n
call :c 0E "                 /          "&call :c 06 "\_,\|" /n
call :c 0E "                 |          (" /n
call :c 0E "             "&call :c 0c "__ "&call :c 0E "/ '          \" /n
call :c 02 "     /\_    "&call :c 0c "/,'`"&call :c 0E "|     '   "&call :c 0c ".-~!q!~~-." /n
call :c 02 "     |`.\_ "&call :c 0c "|   "&call :c 0E "/  ' ,    "&call :c 0c "/        \" /n
call :c 02 "   _/  `, \"&call :c 0c "|  "&call :c 0E "; ,     . "&call :c 0c "|  ,  '  . |" /n
call :c 02 "   \   `,  "&call :c 0c "|  "&call :c 0E "|  ,  ,   "&call :c 0c "|  :  ;  : |" /n
call :c 02 "   _\  `,  "&call :c 0c "\  "&call :c 0E "|.     ,  "&call :c 0c "|  |  |  | |" /n
call :c 02 "   \`  `.   "&call :c 0c "\ "&call :c 0E "|   '     "&call :c 0A "|"&call :c 0c "\_|-'|_,'\|" /n
call :c 02 "   _\   `,   "&call :c 0A "`"&call :c 0E "\  '  . ' "&call :c 0A "| |  | |  |           "&call :c 02 "__" /n
call :c 02 "   \     `,   "&call :c 0E "| ,  '    "&call :c 0A "|_/'-|_\_/     "&call :c 02 "__ ,-;` /" /n
call :c 02 "    \    `,    "&call :c 0E "\ .  , ' .| | | | |   "&call :c 02 "_/' ` _=`|" /n
call :c 02 "     `\    `,   "&call :c 0E "\     ,  | | | | |"&call :c 02 "_/'   .=!q!  /" /n
call :c 02 "     \`     `,   "&call :c 0E "`\      \/|,| ;"&call :c 02 "/'   .=!q!    |" /n
call :c 02 "      \      `,    "&call :c 0E "`\' ,  | ; "&call :c 02 "/'    =!q!    _/" /n
call :c 02 "       `\     `,  "&call :c 05 ".-!q!!q!-. "&call :c 0E "': "&call :c 02 "/'    =!q!     /" /n
call :c 02 "    jgs _`\    ;"&call :c 05 "_{  '   ; "&call :c 02 "/'    =!q!      /" /n
call :c 02 "       _\`-/__"&call :c 05 ".~  `."&call :c 07 "8"&call :c 05 ".'.!q!`~-. "&call :c 02 "=!q!     _,/" /n
call :c 02 "    __\      "&call :c 05 "{   '-."&call :c 07 "|"&call :c 05 ".'.--~'`}"&call :c 02 "    _/" /n
call :c 02 "    \    .=!q!` "&call :c 05 "}.-~!q!'"&call :c 0D "u"&call :c 05 "'-. '-..'  "&call :c 02 "__/" /n
call :c 02 "   _/  .!q!    "&call :c 05 "{  -'.~('-._,.'"&call :c 02 "\_,/" /n
call :c 02 "  /  .!q!    _/'"&call :c 05 "`--; ;  `.  ;" /n
call :c 02 "   .=!q!  _/'      "&call :c 05 "`-..__,-'" /n
call :c 02 "    __/'" /n
echo(

exit /b

:c
setlocal enableDelayedExpansion
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

:colorPrint Color  Str  [/n]
setlocal
set "s=%~2"
call :colorPrintVar %1 s %3
exit /b

:colorPrintVar  Color  StrVar  [/n]
if not defined DEL call :initColorPrint
setlocal enableDelayedExpansion
pushd .
':
cd \
set "s=!%~2!"
:: The single blank line within the following IN() clause is critical - DO NOT REMOVE
for %%n in (^"^

^") do (
  set "s=!s:\=%%~n\%%~n!"
  set "s=!s:/=%%~n/%%~n!"
  set "s=!s::=%%~n:%%~n!"
)
for /f delims^=^ eol^= %%s in ("!s!") do (
  if "!" equ "" setlocal disableDelayedExpansion
  if %%s==\ (
    findstr /a:%~1 "." "\'" nul
    <nul set /p "=%DEL%%DEL%%DEL%"
  ) else if %%s==/ (
    findstr /a:%~1 "." "/.\'" nul
    <nul set /p "=%DEL%%DEL%%DEL%%DEL%%DEL%"
  ) else (
    >colorPrint.txt (echo %%s\..\')
    findstr /a:%~1 /f:colorPrint.txt "."
    <nul set /p "=%DEL%%DEL%%DEL%%DEL%%DEL%%DEL%%DEL%"
  )
)
if /i "%~3"=="/n" echo(
popd
exit /b


:initColorPrint
for /f %%A in ('"prompt $H&for %%B in (1) do rem"') do set "DEL=%%A %%A"
<nul >"%temp%\'" set /p "=."
subst ': "%temp%" >nul
exit /b


:cleanupColorPrint
2>nul del "%temp%\'"
2>nul del "%temp%\colorPrint.txt"
>nul subst ': /d
exit /b
Dbenham
quelle
Gibt es eine Möglichkeit, dieses Skript so zu gestalten, dass es die Zeichen verarbeitet, die zum Erstellen von Dos-ähnlichen Menüs verwendet werden? en.wikipedia.org/wiki/Box-drawing_character
Elieder
@Elieder - Hast du es versucht? Es sollte funktionieren, aber Sie müssen die entsprechenden erweiterten ASCII-Codes in einer Variablen erhalten, und Ihre aktive Codepage muss entsprechend eingestellt sein. Stellen Sie eine neue Frage, wenn Sie sie nicht zum Laufen bringen können.
Dbenham
Ich habe ein Problem, bei dem ich möchte, dass '##% 76 space% ##' angezeigt wird, es wird jedoch wie '## \. ##' angezeigt. Ich habe keine Ahnung warum. Unten ist mein Code: 'call : c 0e "##" & call: c f9 "% 76 Spaces%" & call: c 0a "
##
Scheint, als wären die angezeigten Fremdzeichen \ .. \ ':. und sie erscheinen in jeder Zeile (was versteckt ist, weil mein Inhalt 80 chr ist und mein Fensterrahmen 80chr ist
level42
@ level42 - Die Fensterbreite muss etwas breiter als die längste Zeile sein, da unerwünschte Zeichen geschrieben und dann mit der Rücktaste gelöscht werden. Wenn über die Bildschirmbreite hinaus geschrieben wird, kann die Rücktaste diese nicht mehr löschen.
Dbenham
15

Wenn Sie ein modernes Windows haben (auf dem Powershell installiert ist), funktioniert möglicherweise auch Folgendes

call :PrintBright Something Something

  (do actual batch stuff here)

call :PrintBright Done!
goto :eof


:PrintBright
powershell -Command Write-Host "%*" -foreground "White"

Passen Sie die Farbe nach Belieben an.

skrebbel
quelle
Gute Idee. Ich habe diese Antwort erweitert .
Rojo
7

Durch die Kombination von Dbenhams Vogel und Syntax mit Skrebbels Powershell- write-hostMethode scheint Powershell komplexe Kunst schneller rendern zu können als Dbenhams reine Batch-Methode (naja, nachdem Powershell ohnehin einmal grundiert wurde). Es ist ein minimales Massieren der Saiten erforderlich, obwohl ich dies mit nichts anderem als dem Vogel getestet habe. Wenn Sie beispielsweise ein hellgrünes Zeichen für das Ende der Übertragung wünschen, haben Sie möglicherweise kein Glück. :)

Diese Methode erfordert das Echo in eine temporäre Datei, einfach weil das Aufrufen von Powershell für jede für call :cimmer dauert und es viel schneller ist, die Ausgabe für einen Powershell-Aufruf in die Warteschlange zu stellen. Es hat jedoch den Vorteil der Einfachheit und Effizienz.

@echo off
setlocal disableDelayedExpansion
set q=^"
echo(
echo(
call :c 0E "                ,      .-;" /n
call :c 0E "             ,  |\    / /  __," /n
call :c 0E "             |\ '.`-.|  |.'.-'" /n
call :c 0E "              \`'-:  `; : /" /n
call :c 0E "               `-._'.  \'|" /n
call :c 0E "              ,_.-=` ` `  ~,_" /n
call :c 0E "               '--,.    "&call :c 0c ".-. "&call :c 0E ",=!q!." /n
call :c 0E "                 /     "&call :c 0c "{ "&call :c 0A "* "&call :c 0c ")"&call :c 0E "`"&call :c 06 ";-."&call :c 0E "}" /n
call :c 0E "                 |      "&call :c 0c "'-' "&call :c 06 "/__ |" /n
call :c 0E "                 /          "&call :c 06 "\_,\|" /n
call :c 0E "                 |          (" /n
call :c 0E "             "&call :c 0c "__ "&call :c 0E "/ '          \" /n
call :c 02 "     /\_    "&call :c 0c "/,'`"&call :c 0E "|     '   "&call :c 0c ".-~!q!~~-." /n
call :c 02 "     |`.\_ "&call :c 0c "|   "&call :c 0E "/  ' ,    "&call :c 0c "/        \" /n
call :c 02 "   _/  `, \"&call :c 0c "|  "&call :c 0E "; ,     . "&call :c 0c "|  ,  '  . |" /n
call :c 02 "   \   `,  "&call :c 0c "|  "&call :c 0E "|  ,  ,   "&call :c 0c "|  :  ;  : |" /n
call :c 02 "   _\  `,  "&call :c 0c "\  "&call :c 0E "|.     ,  "&call :c 0c "|  |  |  | |" /n
call :c 02 "   \`  `.   "&call :c 0c "\ "&call :c 0E "|   '     "&call :c 0A "|"&call :c 0c "\_|-'|_,'\|" /n
call :c 02 "   _\   `,   "&call :c 0A "`"&call :c 0E "\  '  . ' "&call :c 0A "| |  | |  |           "&call :c 02 "__" /n
call :c 02 "   \     `,   "&call :c 0E "| ,  '    "&call :c 0A "|_/'-|_\_/     "&call :c 02 "__ ,-;` /" /n
call :c 02 "    \    `,    "&call :c 0E "\ .  , ' .| | | | |   "&call :c 02 "_/' ` _=`|" /n
call :c 02 "     `\    `,   "&call :c 0E "\     ,  | | | | |"&call :c 02 "_/'   .=!q!  /" /n
call :c 02 "     \`     `,   "&call :c 0E "`\      \/|,| ;"&call :c 02 "/'   .=!q!    |" /n
call :c 02 "      \      `,    "&call :c 0E "`\' ,  | ; "&call :c 02 "/'    =!q!    _/" /n
call :c 02 "       `\     `,  "&call :c 05 ".-!q!!q!-. "&call :c 0E "': "&call :c 02 "/'    =!q!     /" /n
call :c 02 "    jgs _`\    ;"&call :c 05 "_{  '   ; "&call :c 02 "/'    =!q!      /" /n
call :c 02 "       _\`-/__"&call :c 05 ".~  `."&call :c 07 "8"&call :c 05 ".'.!q!`~-. "&call :c 02 "=!q!     _,/" /n
call :c 02 "    __\      "&call :c 05 "{   '-."&call :c 07 "|"&call :c 05 ".'.--~'`}"&call :c 02 "    _/" /n
call :c 02 "    \    .=!q!` "&call :c 05 "}.-~!q!'"&call :c 0D "u"&call :c 05 "'-. '-..'  "&call :c 02 "__/" /n
call :c 02 "   _/  .!q!    "&call :c 05 "{  -'.~('-._,.'"&call :c 02 "\_,/" /n
call :c 02 "  /  .!q!    _/'"&call :c 05 "`--; ;  `.  ;" /n
call :c 02 "   .=!q!  _/'      "&call :c 05 "`-..__,-'" /n
call :c 02 "    __/'" /n

if exist "%temp%\color.psm1" (
    powershell -command "&{set-executionpolicy remotesigned; Import-Module '%temp%\color.psm1'}"
    del "%temp%\color.psm1"
)

echo(

exit /b

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

:c <color pair> <string> </n>
setlocal enabledelayedexpansion
set "colors=0-black;1-darkblue;2-darkgreen;3-darkcyan;4-darkred;5-darkmagenta;6-darkyellow;7-gray;8-darkgray;9-blue;a-green;b-cyan;c-red;d-magenta;e-yellow;f-white"
set "p=%~1"
set "bg=!colors:*%p:~0,1%-=!"
set bg=%bg:;=&rem.%
set "fg=!colors:*%p:~-1%-=!"
set fg=%fg:;=&rem.%

if not "%~3"=="/n" set "br=-nonewline"
set "str=%~2" & set "str=!str:'=''!"

>>"%temp%\color.psm1" echo write-host '!str!' -foregroundcolor '%fg%' -backgroundcolor '%bg%' %br%
endlocal

Ergebnis:

Geben Sie hier die Bildbeschreibung ein

Rojo
quelle
7

Ohne externe Tools. 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 (es ist selten, dass Windows ohne .NET-Framework auch für das älteste XP / 2003-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;

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

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

npocmaka
quelle
4

Ja, mit cmdcolor ist das möglich :

echo \033[32mhi \033[92mworld

hiwird dunkelgrün und world- hellgrün sein.

Alec Mev
quelle
Dieser ist im Vergleich zur reinen Batch-Lösung ziemlich schnell. Vielen Dank.
Wolfram77
2

In
"51} werden verschiedene Methoden behandelt. Wie kann ich in NT-Skripten Linien in verschiedenen Farben wiedergeben?"
http://www.netikka.net/tsneti/info/tscmd051.htm

Eine der Alternativen: Wenn Sie QBASIC erwerben können, ist die Verwendung von Farben relativ einfach:

  @echo off & setlocal enableextensions
  for /f "tokens=*" %%f in ("%temp%") do set temp_=%%~sf
  set skip=
  findstr "'%skip%QB" "%~f0" > %temp_%\tmp$$$.bas
  qbasic /run %temp_%\tmp$$$.bas
  for %%f in (%temp_%\tmp$$$.bas) do if exist %%f del %%f
  endlocal & goto :EOF
  ::
  CLS 'QB
  COLOR 14,0 'QB
  PRINT "A simple "; 'QB
  COLOR 13,0 'QB
  PRINT "color "; 'QB
  COLOR 14,0 'QB
  PRINT "demonstration" 'QB
  PRINT "By Prof. (emer.) Timo Salmi" 'QB
  PRINT 'QB
  FOR j = 0 TO 7 'QB
    FOR i = 0 TO 15 'QB
      COLOR i, j 'QB
      PRINT LTRIM$(STR$(i)); " "; LTRIM$(STR$(j)); 'QB
      COLOR 1, 0 'QB
      PRINT " "; 'QB
    NEXT i 'QB
    PRINT 'QB
  NEXT j 'QB
  SYSTEM 'QB
Timo Salmi
quelle
3
Ich nehme an, QBasic ist seit XP
jeb
Alte Dienstprogramme sind im Internet weiterhin in Paketen wie download.microsoft.com/download/win95upg/tool_s/1.0/W95/EN-US/… verfügbar
Timo Salmi
1

Sie sollten chgcolor.zip von http://www.mailsend-online.com/blog/setting-text-color-in-a-batch-file.html herunterladen und echoj.zip auch von www.mailsend-online.com herunterladen / blog /? p = 41 Sie befinden sich beide am Ende der Seite. Extrahieren Sie beide Ordner auf den Desktop und kopieren Sie die ausführbaren Dateien (EXE-Dateien) aus den extrahierten Ordnern in das Verzeichnis C: \ Windows. Dadurch können sie über die Befehlszeile ausgeführt werden. Öffnen Sie den Editor und kopieren Sie Folgendes hinein:

@echo aus

chgcolor 03

echoj "hi"

chgcolor 0d

echoj "Welt"

chgcolor 07

echoj $ 0a

Speichern Sie die Datei auf dem Desktop als hi.bat. Öffnen Sie nun die Eingabeaufforderung, navigieren Sie zu Ihrem Desktop-Ordner und geben Sie "hi.bat" ohne Anführungszeichen ein. Damit sollten Sie sicher sein, beide Webseiten zu lesen, um ein vollständiges Tutorial zu erhalten.

Ein Schmied
quelle
1

Wenn Ihre Konsole ANSI-Farbcodes unterstützt (z. B. ConEmu , Clink oder ANSICON ), können Sie dies tun:

SET    GRAY=%ESC%[0m
SET     RED=%ESC%[1;31m
SET   GREEN=%ESC%[1;32m
SET  ORANGE=%ESC%[0;33m
SET    BLUE=%ESC%[0;34m
SET MAGENTA=%ESC%[0;35m
SET    CYAN=%ESC%[1;36m
SET   WHITE=%ESC%[1;37m

wobei die ESC-Variable das ASCII-Zeichen 27 enthält.

Ich habe hier eine Möglichkeit gefunden, die ESC-Variable zu füllen: http://www.dostips.com/forum/viewtopic.php?p=6827#p6827 und tasklistdamit zu testen, welche DLLs in einen Prozess geladen werden.

Das folgende Skript ruft die Prozess-ID der cmd.exe ab, in der das Skript ausgeführt wird. Überprüft, ob eine DLL vorhanden ist, die ANSI-Unterstützung hinzufügt, und legt dann fest, dass Farbvariablen Escape-Sequenzen enthalten oder leer sind, je nachdem, ob Farbe unterstützt wird oder nicht.

@echo off

call :INIT_COLORS

echo %RED%RED %GREEN%GREEN %ORANGE%ORANGE %BLUE%BLUE %MAGENTA%MAGENTA %CYAN%CYAN %WHITE%WHITE %GRAY%GRAY

:: pause if double clicked on instead of run from command line.
SET interactive=0
ECHO %CMDCMDLINE% | FINDSTR /L %COMSPEC% >NUL 2>&1
IF %ERRORLEVEL% == 0 SET interactive=1
@rem ECHO %CMDCMDLINE% %COMSPEC% %interactive%
IF "%interactive%"=="1" PAUSE
EXIT /B 0
Goto :EOF

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
: SUBROUTINES                                                          :
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::::
:INIT_COLORS
::::::::::::::::::::::::::::::::

call :supportsANSI
if ERRORLEVEL 1 (
  SET GREEN=
  SET RED=
  SET GRAY=
  SET WHITE=
  SET ORANGE=
  SET CYAN=
) ELSE (

  :: If you can, insert ASCII CHAR 27 after equals and remove BL.String.CreateDEL_ESC routine
  set "ESC="
  :: use this if can't type ESC CHAR, it's more verbose, but you can copy and paste it
  call :BL.String.CreateDEL_ESC

  SET    GRAY=%ESC%[0m
  SET     RED=%ESC%[1;31m
  SET   GREEN=%ESC%[1;32m
  SET  ORANGE=%ESC%[0;33m
  SET    BLUE=%ESC%[0;34m
  SET MAGENTA=%ESC%[0;35m
  SET    CYAN=%ESC%[1;36m
  SET   WHITE=%ESC%[1;37m
)

exit /b

::::::::::::::::::::::::::::::::
:BL.String.CreateDEL_ESC
::::::::::::::::::::::::::::::::
:: http://www.dostips.com/forum/viewtopic.php?t=1733
::
:: Creates two variables with one character DEL=Ascii-08 and ESC=Ascii-27
:: DEL and ESC can be used  with and without DelayedExpansion
setlocal
for /F "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do rem"') do (
  ENDLOCAL
  set "DEL=%%a"
  set "ESC=%%b"
  goto :EOF
)

::::::::::::::::::::::::::::::::
:supportsANSI
::::::::::::::::::::::::::::::::
:: returns ERRORLEVEL 0 - YES, 1 - NO
::
:: - Tests for ConEmu, ANSICON and Clink
:: - Returns 1 - NO support, when called via "CMD /D" (i.e. no autoruns / DLL injection)
::   on a system that would otherwise support ANSI.

if "%ConEmuANSI%" == "ON" exit /b 0

call :getPID PID

setlocal

for /f usebackq^ delims^=^"^ tokens^=^* %%a in (`tasklist /fi "PID eq %PID%" /m /fo CSV`) do set "MODULES=%%a"

set MODULES=%MODULES:"=%
set NON_ANSI_MODULES=%MODULES%

:: strip out ANSI dlls from module list:
:: ANSICON adds ANSI64.dll or ANSI32.dll
set "NON_ANSI_MODULES=%NON_ANSI_MODULES:ANSI=%"
:: ConEmu attaches ConEmuHk but ConEmu also sets ConEmuANSI Environment VAR
:: so we've already checked for that above and returned early.
@rem set "NON_ANSI_MODULES=%NON_ANSI_MODULES:ConEmuHk=%"
:: Clink supports ANSI https://github.com/mridgers/clink/issues/54
set "NON_ANSI_MODULES=%NON_ANSI_MODULES:clink_dll=%"

if "%MODULES%" == "%NON_ANSI_MODULES%" endlocal & exit /b 1
endlocal

exit /b 0

::::::::::::::::::::::::::::::::
:getPID  [RtnVar]
::::::::::::::::::::::::::::::::
:: REQUIREMENTS:
::
:: Determine the Process ID of the currently executing script,
:: but in a way that is multiple execution safe especially when the script can be executing multiple times
::   - at the exact same time in the same millisecond,
::   - by multiple users,
::   - in multiple window sessions (RDP),
::   - by privileged and non-privileged (e.g. Administrator) accounts,
::   - interactively or in the background.
::   - work when the cmd.exe window cannot appear
::     e.g. running from TaskScheduler as LOCAL SERVICE or using the "Run whether user is logged on or not" setting
::
:: https://social.msdn.microsoft.com/Forums/vstudio/en-US/270f0842-963d-4ed9-b27d-27957628004c/what-is-the-pid-of-the-current-cmdexe?forum=msbuild
::
:: http://serverfault.com/a/654029/306
::
:: Store the Process ID (PID) of the currently running script in environment variable RtnVar.
:: If called without any argument, then simply write the PID to stdout.
::
::
setlocal disableDelayedExpansion
:getLock
set "lock=%temp%\%~nx0.%time::=.%.lock"
set "uid=%lock:\=:b%"
set "uid=%uid:,=:c%"
set "uid=%uid:'=:q%"
set "uid=%uid:_=:u%"
setlocal enableDelayedExpansion
set "uid=!uid:%%=:p!"
endlocal & set "uid=%uid%"
2>nul ( 9>"%lock%" (
  for /f "skip=1" %%A in (
    'wmic process where "name='cmd.exe' and CommandLine like '%%<%uid%>%%'" get ParentProcessID'
  ) do for %%B in (%%A) do set "PID=%%B"
  (call )
))||goto :getLock
del "%lock%" 2>nul
endlocal & if "%~1" equ "" (echo(%PID%) else set "%~1=%PID%"
exit /b
Sam Hasler
quelle
0

Nachdem meine vorherige Antwort gelöscht wurde, weil der Code nicht enthalten war, können die verwendeten Ansi-Zeichen nicht durch Stapelüberlauf angezeigt werden, wodurch das Vorhandensein des Codes etwas sinnlos wird, da er darauf basiert. Ich habe den Code so umgestaltet, dass er den Code enthält Methode zum Auffüllen des von @Sam Hasler beschriebenen Escape-Zeichens

Dabei habe ich auch alle Unterprogramme zugunsten von Makros entfernt und meinen Ansatz an die Übergabe von Parametern an die Makros angepasst.

Alle Makros gleichen die Setlocal / Endlocal-Paarungen aus, um zu verhindern, dass die Rekursionsstufen überschritten werden, indem sie ^&^& endlocalnach Abschluss ihrer Behandlung der Args verwendet werden.

Das Makro std.out zeigt auch, wie die Makros angepasst werden, um die Ausgabe in Variablen zu speichern, die über die endlokale Barriere hinaus überleben.

@Echo off & Mode 1000

::: / Creates two variables with one character DEL=Ascii-08 and /AE=Ascii-27 escape code. only /AE is used
::: - http://www.dostips.com/forum/viewtopic.php?t=1733
::: - https://stackoverflow.com/a/34923514/12343998
:::
::: - DEL and ESC can be used  with and without DelayedExpansion, except during Macro Definition
    Setlocal
    For /F "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do rem"') do (
        Endlocal
        Set "DEL=%%a"
        Set "/AE=%%b"
    )
::: \

::: / Establish Environment for macro Definition
    Setlocal DisableDelayedExpansion

    (Set LF=^


    %= NewLine =%)

    Set ^"\n=^^^%LF%%LF%^%LF%%LF%^^"
::: \

::: / Ascii code variable assignment
::: - Variables used for cursor Positiong Ascii codes in the form of bookends to prevent ansi escape code disrupting macro definition
    Set "[=%/AE%["
    Set "]=H"
::: - define Variables for Ascii color code values
    Set "Red=%/AE%[31m"
    Set "Green=%/AE%[32m"
    Set "Yellow=%/AE%[33m"
    Set "Blue=%/AE%[34m"
    Set "Purple=%/AE%[35m"
    Set "Cyan=%/AE%[36m"
    Set "White=%/AE%[37m"
    Set "Grey=%/AE%[90m"
    Set "Pink=%/AE%[91m"
    Set "BrightGreen=%/AE%[92m"
    Set "Beige=%/AE%[93m"
    Set "Aqua=%/AE%[94m"
    Set "Magenta=%/AE%[95m"
    Set "Teal=%/AE%[96m"
    Set "BrightWhite=%/AE%[97m"
    Set "Off=%/AE%[0m"
::: \

::: / mini-Macro to Pseudo pipe complex strings into Macros.
    Set "Param|=Set Arg-Output="
::: \

::: / Macro for outputing to cursor position Arg1 in color Arg2
    Set Pos.Color=^&for /L %%n in (1 1 2) do if %%n==2 (%\n%
        For /F "tokens=1,2 delims=, " %%G in ("!argv!") do (%\n%
            Echo(![!%%G!]!!%%H!!Arg-Output!!Off!^&^&Endlocal%\n%
        ) %\n%
    ) ELSE setlocal enableDelayedExpansion ^& set argv=, 
::: \

::: / Macro variable for creating a Colored prompt with pause at Cursor pos Arg1 in Color Arg2
    Set Prompt.Pause=^&for /L %%n in (1 1 2) do if %%n==2 (%\n%
        For /F "tokens=1,2 delims=, " %%G in ("!argv!") do (%\n%
        Echo.!/AE![%%G!]!!/AE![%%Hm!Arg-Output!!Off!%\n%
        pause^>nul ^&^& Endlocal%\n%
        ) %\n%
    ) ELSE setlocal enableDelayedExpansion ^& set argv=, 
::: \

::: / Macro variable for outputing to stdout on a new line with selected color Arg1 and store output to VarName Arg2
    Set std.out=^&for /L %%n in (1 1 2) do if %%n==2 (%\n%
        For /F "tokens=1,2 delims=, " %%G in ("!argv!") do (%\n%
        Echo.!/AE![%%Gm!Arg-Output!!Off!^&^& Endlocal ^&(Set %%H=!Arg-Output!)%\n%
        ) %\n%
    ) ELSE setlocal enableDelayedExpansion ^& set argv=, 
::: \

::: / Stringlength Macro. Not utilized in this example.
::: Usage: %Param|%string or expanded variable%get.strLen% ResultVar
Set get.strLen=^&for /L %%n in (1 1 2) do if %%n==2 (%\n%
    For /F "tokens=1,* delims=, " %%G in ("!argv!") do (%\n%
        Set tmpLen=!Arg-Output!%\n%
        Set LenTrim=Start%\n%
        For /L %%a in (1,1,250) Do (%\n%
            IF NOT "!LenTrim!"=="" (%\n%
                Set LenTrim=!tmpLen:~0,-%%a!%\n%
                If "!LenTrim!"=="" Echo.>nul ^&^& Endlocal ^&(Set %%G=%%a)%\n%
            )%\n%
        ) %\n%
    ) %\n%
) ELSE setlocal enableDelayedExpansion ^& set argv=, 
::: \


::: / Create Script break for Subroutines. Subroutines not utilized in this example
    Goto :main
::: \

::: / Subroutines

::: \

::: / Script main Body
:::::: - Example usage
:main

    Setlocal EnableDelayedExpansion

For %%A in ("31,1,37" "41,1,47" "90,1,97" "100,1,107") do For /L %%B in (%%~A) Do %Param|%[Color Code = %%B.]%std.out% %%B AssignVar

        Set "XP=20"
    For %%A in (red aqua white brightwhite brightgreen beige blue magenta green pink cyan grey yellow purple teal) do (
        Set /A XP+=1
        Set /A YP+=1
        Set "output=%%A !YP!;!XP!"
        %Param|%Cursor Pos: !YP!;!XP!, %%A %Pos.Color% !YP!;!XP! %%A
    )
    %Param|%Example %green%Complete.%prompt.pause% 32;10 31

    Endlocal

Exit /B
::: \ End Script

Mein Dank geht an @Martijn Pieters für das Löschen meiner vorherigen Antwort. Beim Umschreiben meines Codes habe ich auch einige neue Möglichkeiten entdeckt, Makros zu manipulieren.

Skriptausgabe

T3RR0R
quelle
0

Windows 10 ((Version 1511, Build 10586, Release 2015-11-10)) unterstützt ANSI-Farben .
Mit der Escape-Taste können Sie die Farbcodes auslösen.

In der Eingabeaufforderung:

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

Echo Ctrl+ [[32m HI Ctrl+[[0mEnter

Bei Verwendung eines Texteditors können Sie ALT-Tastencodes verwenden.
Der Code ESC - Taste kann folgendermaßen angelegt werden ALTund NUMPADZahlen: Alt+027

[32m  HI  [0m
Yochai Timmer
quelle