In einer Batch Datei Text mit Farbe?
Hallo! Ich habe die Frage ob es möglich ist z.b. (Hallo Welt!) Rot angezeigt wird oder Gelb? Also in der Batch datei wenn mann sie öffnet.
2 Antworten
Die Ausgabefarbe der Console lässt sich mit dem Befehl COLOR setzen.
Diese bezieht sich jedoch auf die gesamte Console und nicht auf einzelne Zeilen oder Zeichen.
demo1.cmd
@echo off
color 1F
echo Hallo Welt
rem warte 3Sekunden
timeout 3 >nul
rem die Änderung der Farbattribute mit color ändert auch bereits ausgegebene Zeilen.
color 49
echo Hallo Welt
pause
Batch ist eigentlich keine Sprache, um igendwelche Schönheitspreise zu gewinnen. Individuelle Farbgebung einzelner Zeilen/Worte/Zeichen geht entsprechend weit über den Anfängerlevel hinaus.
BasisFormatierung.cmd
::https://docs.microsoft.com/de-de/windows/console/console-virtual-terminal-sequences#text-formatting
@echo off
chcp 65001 >nul & rem Umlaute anzeigen
rem teste ob unter Win 10 (ab 1903) die neuen Consolfunktionen eingeschalten sind...
for /f "tokens=3 delims=." %%a in ('ver') do (
if %%a geq 18362 (reg query "HKCU\Console" /v "ForceV2"|find "REG_DWORD 0x0">nul && (
echo Neue Consolenfunktionen sind ausgeschaltet!) || goto :init
) else ( echo Benötige Windows 10 ab Version 1903)
)
timeout 3 >nul
exit /b
:init
rem erzeuge Escape-Char
for /f %%. in ('"echo prompt $E|cmd"') do set "ESC=%%."
rem Basis-Sequenzen
rem setze gib Zeile mit 16 Vordergundfarbe aus:
echo %ESC%[0mHallo Standard
echo %ESC%[32mHallo Vordergrund Grün
echo %ESC%[95mHallo Vordergrund leuchtend Magenta
rem Kombination verschiedener Basissequenzen (frei kombinierbar getrennt semikolon)
echo %ESC%[93;104mHallo Vordergrund leuchtend Gelb,Hintergrund leuchtend Blau
echo %ESC%[91;4;49mHallo Vordergrund leuchtend Rot,Unterstrichen,Hintergrund Standard
echo %ESC%[7mFarben negativ,nächste Zeile wieder Positiv%ESC%[27m
rem innerhalb der Zeile farben ändern
echo %ESC%[97;44mHallo Vordergrund leuchtend Weiß,Hintergrund blau,%ESC%[95mVordergrund leuchtend Magenta,nächste Zeile komplett Standard%ESC%[0m
pause
Die Testroutine kannst Du weglassen, wenn Sicher ist, das die getesteten Bedingen passen (dürfte in allen einigermaßen aktuellen Windowsversionen zutreffen).
ExtendetColors.cmd
::https://docs.microsoft.com/de-de/windows/console/console-virtual-terminal-sequences#extended-colors
@echo off
setlocal enableDelayedExpansion
chcp 65001 >nul & rem Umlaute anzeigen
mode 150,20
:init
rem erzeuge Escape-Char
for /f %%. in ('"echo prompt $E|cmd"') do set "ESC=%%."
set "saveCursorPos=%ESC%7"
set "loadCursorPos=%ESC%8"
set "CursOff=%ESC%[?25l"
set "CursOn=%ESC%[?25h"
:: Ende Vorbereitung
color 1f
echo 16 Colors
echo %saveCursorPos%
for /l %%a in (0,1,15) do (
rem Leerzeichen voranstellen
set "__num= %%a"
set "__num=!__num:~-4!"
echo %loadCursorPos%%ESC%[48;5;%%am!__num!%saveCursorPos%
)
echo %ESC%[44m6x6x6 Farbraum
rem Cursorposition ist noch immer am Ende der vorangehenden Schleife gespeichert!
rem Der Cursor befindet jedoch woanders... Diese Position für den Begin der neuen Schleife speichern.
rem !!! Die Cursorposition wird gespeichet bevor der Zeilenvorschub von echo ausgeführt wird!!!! (dieser --und alles Folgende-- wird von %loadCursor% Nichtig gemacht)
echo %saveCursorPos%
for /l %%r in (15,36,225) do (
for /l %%c in (1,1,36) do (
set /a "__num=%%r+%%c"
set "__numstr= !__num!"
echo %loadCursorPos%%ESC%[48;5;!__num!m!__numstr:~-4!%saveCursorPos%
)
echo %saveCursorPos%
)
echo %ESC%[1A%ESC%[44m24 Graustufen
echo %saveCursorPos%
for /l %%a in (232,1,255) do (
set "__num= %%a"
set "__num=!__num:~-4!"
echo %loadCursorPos%%ESC%[48;5;%%am!__num!%saveCursorPos%
)
echo %ESC%[44mRegenbogen
echo %saveCursorPos%
for /l %%a in (16,36,196) do (echo %loadCursorPos%%ESC%[48;5;%%am %saveCursorPos%)
for /l %%a in (202,6,226) do (echo %loadCursorPos%%ESC%[48;5;%%am %saveCursorPos%)
for /l %%a in (190,-36,46) do (echo %loadCursorPos%%ESC%[48;5;%%am %saveCursorPos%)
for /l %%a in (41,-5,21) do (echo %loadCursorPos%%ESC%[48;5;%%am %saveCursorPos%)
for %%a in (20,55,53,16) do (echo %loadCursorPos%%ESC%[48;5;%%am %saveCursorPos%)
echo:
pause
exit /b
Wenn Du bisher noch keinen Nervenzusammenbruch hast, das ganze auf die Spitze getrieben:
GostTyper_Multicolor.cmd
@echo off
chcp 65001 >nul
setlocal enableDelayedExpansion
call :initAnsi
call :initMacro
rem Farbtabelle für den Regenbogen definieren
set "Regenbogen=,52,88,124,160,196,202,208,214,220,226,190,154,118,82,46,41,36,31,26,21,20,55,53,"
rem Regenbogen Spiegeln (letzte Farbe zuerst) (auch Variablennamen unterliegen der Kreativität XD)
for %%a in (%Regenbogen%) do (set "negobnegeR=,%%a!negobnegeR!")
rem mach nen Schmetteling draus
set "RegenbogenBfly=%Regenbogen%%negobnegeR%"
set "ShadesOfGray=237 238 239 240 241 242 243 244 245 246 247 248 249"
for %%a in (%ShadesOfGray%) do (set "notShadesOfGray=,%%a!notShadesOfGray%!")
rem mach nen Schmetteling draus
set "SoGrayBfly=%ShadesOfGray%%notShadesOfGray%"
set "NightBlue=17"
set "OrangeWave=202 208 214 220 214 208"
rem initilisiere für die angegebene Farbtabelle jeweils ein Array mit den Escape seqenzen für
rem Hintergrund Fabtabelle.B und Vordergrund Fabtabelle.F
for %%a in (RegenbogenBfly , ShadesOfGray , SoGrayBfly , NightBlue , OrangeWave) do ( call :initANSI_ColorArray %%~a)
)
rem Aufruf: verzögerung FarbeTabelleB/F ode =für Default "Text "
%#__gostType% 0 NightBlue.B ".so geht man mit ""Gänsefüßchen"" & $$ um und ..."
%#__gostType% 0 NightBlue.B "... so macht man ein Ausrufezeichen $x ....."
%#__gostType% 0 NightBlue.B """..?.+.*.~.§.@.µ.€.|.<.>.&.=.$p.$x.$$..........."""
%#__gostType% 2000 OrangeWave.F "...$$x=$x.,.$$p=$p.,.$$$=$$.,.""""="".................."
%#__gostType% 2000 OrangeWave.b "...$$x=$x.,.$$p=$p.,.$$$=$$.,.""""="".................."
%#__gostType% 2000 = "......................I......................."
%#__gostType% 2000 = "....................like......................"
%#__gostType% 2000 = "..................Scripting. ................."
%#__gostType% 0 RegenbogenBfly.B "......................I......................."
%#__gostType% 1000 RegenbogenBfly.B "....................like......................"
%#__gostType% 4000 RegenbogenBfly.B "..............Background Colors..............."
%#__gostType% 8000 SoGrayBfly.B ".............. some Gray ..............."
%#__gostType% 2000 RegenbogenBfly.F "......................I......................."
%#__gostType% 2000 RegenbogenBfly.F "....................like......................"
%#__gostType% 2000 RegenbogenBfly.F "..............Foreground Colors..............."
%#__gostType% 20000 ShadesOfGray.F ".............. more Gray ..............."
echo ende...
pause
exit /b
:::::: Helper Routines ::::::
:initANSI_ColorArray %1 VarName Colortable
set ".cIndex=0"
for %%a in (!%1!) do (
rem Arrays mit Farbsequenzen anlegen BackGround und ForeGround
set "CArray.%1.F.!.cIndex!=%ESC%[38;5;%%am"
set "CArray.%1.B.!.cIndex!=%ESC%[48;5;%%am"
set /a ".cIndex+=1"
)
set "%1.F.cIndex=%.cIndex%"
set "%1.B.cIndex=%.cIndex%"
exit /b
:initMacro
rem als estes wird der else-Zweig aufgelöst beim aufruf des Macros folgen die Argumente dem set argv=
rem im zweiten Schritt wird argv aufgelöst und die belegten Variablen getunnelt (wegen evt Sonderzeichen)
set #__gostType=for %%. in (1 2) do^
if %%.==2 (^
for /f "tokens=1,2*" %%a in ("^!argv^!") do (^
set __StringToSplit=%%~c^&^
call :draw __StringToSplit %%~a %%~b^
)^
) else set argv=
exit /b
:initAnsi
rem prüfe ob Escape-Sequenzen erlaubt sind (Windows 10 v1903)
rem nur der !!!DWord!!!-Wert ForceV2=0 deaktiviert, alles andere erlaubt Escapesequenzen (ansonsten scheinen ANSISequenzen inzwischen by default unterstützt zu werden)
for /f "tokens=3 delims=." %%a in ('ver') do (
if %%a geq 18362 (reg query "HKCU\Console" /v "ForceV2"|find "REG_DWORD 0x0">nul && (
echo Neue Consolenfunktionen sind ausgeschaltet!) || goto :initAnsiVars
) else ( echo Benötige Windows 10 ab Version 1903)
)
timeout 5 >nul
exit /b
)
:initAnsiVars
rem erzeuge ESC-Zeichen (ASCII 27)
for /f %%. in ('"echo prompt $E|cmd"') do set "ESC=%%."
rem Cursormacros:
set "saveCursorPos=%ESC%7"
set "loadCursorPos=%ESC%8"
set "CursOff=%ESC%[?25l"
set "CursOn=%ESC%[?25h"
set "resetColor=%ESC%[0m"
rem Cursor unsichtbar machen
echo %saveCursorPos%%CursOff%
exit /b
:::::: subroutines :::::
:draw
set "lastColorIndex=-1
set "%~1=!%~1:""="!"
rem Stringlänge-1 ermitteln
@(echo !%~1!)>"%temp%\%~n0.len"
for %%a in ("%temp%\%~n0.len?") do set /a "%~1.maxIndex=%%~za-3"
for /l %%. in (0,1,!%~1.maxIndex!) do (
set Char=!char!!%~1:~%%.,1!
rem kommt ein Platzhalter:
if "!char!" neq "$" (
rem für ein Ausrufezeichen?
if /i "!char!"=="$X" set "char=^!"
if /i "!char!"=="$P" set "char=%%"
if "!char!"=="$$" set "char=$"
set /a "lastColorIndex+=1 , __cNr=lastColorIndex %% %3.cIndex" 2>nul
rem Fabnummer in den als Laufvariable in den Arrayindex mogeln... (!array!index !! geht nicht)
for %%. in ("!__cNr!") do (
echo:%loadCursorPos%!CArray.%~3.%%~.!!char!%saveCursorPos%
)
rem Bremsschleife
for /l %%. in (1,1,%~2) do (call)
set "char="
)
)
echo:%resetColor%%saveCursorPos%
exit /b
Danke! Aber könntest du mir bitte wenn es möglich den Text mit meiner gewünsten Farbe in einer Batch Datei Programmieren
Hallo{Grün} Welt{Schwarz}
Hallo{Grün} Welt{Schwarz}
Hallo{Grün} Welt{Schwarz}
Hallo{Grün} Welt{Schwarz}
----------------Servus---------------- {Blau}
Frage an den Experten erzesel
Bei der Programmierung dieser Batchdatei hat die Ganze Sache nur einen Haken
Tauscht man die Pause Funktion gegen die Choice.exe (mit entsprechenden Parametern) oder
die reply.exe (Tastaturunterbrecherprogramm) auch bekannt als keyin.exe aus, dann
funktionieren unterstrichene Zeilen in einer Batch oder CMD Datei nicht mehr.
Der Unterstrich in der Zeile verschwindet.
Das Thema wurde auch schon bei DrWindows.de behandelt.
Vielleicht hast Du ja einen Lösungsansatz.