Gradient Colors in der Windows Konsole benutzen?

1 Antwort

Vom Beitragsersteller als hilfreich ausgezeichnet

Das ist nicht wirklich Gradientcolor, sondern Text Zeichen in verschiedenen Farben (geschickt angeordnet.

Die Console ist nicht wirklich dafür gemacht für bunten Farbenzauber. (was nicht bedeutet, das es nicht geht)

Die Nummer mit dem farbigen Zeichen gabs schon, als noch niemand an Windows oder Linux dachte. Farbige textbasierte Benutzeroberflächen für Dos wurden mit hilfe von ANSI-Escapesequenzen erstellt. (zB. der Norton-Commander 2.0)

Ansi-Escapesequenzen in Batch oder anderen Scriptsprachen waren auf Grund der Gefährlichkeit vieler Sequenzen fast 30 Jahre ins Abseits geraden..

Erst ab Win 10 wurde eine "sichere" Teminalemulation vorsichtig in Consolen integriert. (ab 1903 offiziell standardverhalten)

In Batch ist das Ganze etwas Tricky zu handhaben, da Batch nicht wirklich Zugang zu ASCII-Zeichen unterhalb 20hex (Leerzeichen) hat. ESC liegt mit 1Bhex unter 20.

Du kannst zwar folgende Zeile in eine Batch kopieren und dort ausführen...

  rem tiefblauer Hintergrund
echo  Test

...mit etwas Glück kappiert Dein Editor das das Zeichen hinter obigem kleinen Fragezeichen der ESC-Char ist. In die Console kopieren geht jedoch nicht, da ESC auch bis zum Zeilenbegin löscht.

Wie auch immer als Batchprogrammierer muss man zaubern können:

SimpleColoringDemo.cmd

@echo off
chcp 65001 >nul &rem UTF8 codepage aktivieren (Umlaute  anzeigen)
mode 128,50 &rem Fenstergröße
  rem erzeuge Escape-Chararakter %ESC%
for /f %%. in ('"echo prompt $E|cmd"') do set "ESC=%%."


color 05
echo Ich bin normal über  den "Color 05" -Befehl  gefärbt...


  rem setze 265Farben-Hintergrund und Lösche die Zeile auf  128 Zeichn Breite
echo %ESC%[48;5;18m%ESC%[128@Jetzt   hatt das Farbfeld eine feste Breite
echo %ESC%[128@..Weiter...
echo %ESC%[128@..Weiter...
echo %ESC%[128@..Weiter...
  rem die Farbwerte  findest Du  unter  https://docs.microsoft.com/de-de/windows/console/console-virtual-terminal-sequences#text-formatting
  rem vordrgrundFarbe  auf LeuchtendGrün schalten
echo %ESC%[128@%ESC%[92mHallo ich  wurde mit "%%ESC%%[92m" gefärbt...
  rem Hintergrund mit dem 256Farben Befehl setzen
echo %ESC%[128@%ESC%[48;5;202mJetz  ist auch noc ein 256Color-Palette Hintergrund  hinzugekommen Sequenz:(%%ESC%%[48;5;202m)...
  rem setze RGB-Hintergrund und RGB-Vordergrund
echo %ESC%[48;2;80;0;40m%ESC%[38;2;128;255;0mIch bin mit RGB-Sequenzen gefärbt 
  rem unterstreichen...
echo %ESC%[4mJetzt bin ich auch noch Unterstrichen.
echo:
echo %ESC%[7mund  Negativ.
echo %ESC%[27mwieder Positv.
rem Neue Farben , Lösche vor dem Schreiben die zeiel   auf 80 Zeichen Breite
echo %ESC%[48;2;40;0;0m%ESC%[38;2;0;255;255m
echo %ESC%[48;2;40;0;0m%ESC%[38;2;0;255;255m%ESC%[24mandere RGBFarben und  Unterstreichung aus...
echo schluss mit  dem Zauber ...%ESC%[0mab hier  ist Alles wieder Normal
pause

AnsiColorDemo.cmd

@echo off
setlocal enableDelayedExpansion
chcp 65001 >nul & rem Umlaute anzeigen
mode 150,20
  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=%%."
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

regenbogenPrompt.cmd

@echo off


  rem  prüfe  ob Escape-Sequenzen  erlaubt sind (Windows 10)
reg query "HKCU\Console" /v "ForceV2"|find "REG_DWORD    0x0">nul && (
    echo Sorry ANSI-Escapesequenzen sind fur diese Console deaktiviert.
    timeout 5 >nul
    exit /b
)


  rem Farbtabelle für Regenbogen erzeugen
set "colorTable=52,88,124,160,196,202,208,214,220,226,190,154,118,82,46,41,36,31,26,21,20,55,53"
set "fGroundClr=38"
set "bGroundClr=48"
set "__cIndex=0"
for %%a in (%colorTable%) do (
    call set "cTable%%__cIndex%%=$e[%fGroundClr%;5;%%am"
    set /a "__cIndex+=1"
)


set "string=cooler(&|<>) 10$$-RegenbogenPrompt $p"
set "string=Erzesels cooler 10$$-RegenbogenPrompt $p"


set "__strIndex=0"
set "lastColorIndex=-1"
::set "newPrompt=$e[7m"
:loop
call set "Char=%char%%%string:~%__strIndex%,1%%"
set /a "__strIndex+=1"


if "%char%"=="$" goto :loop
  rem Tricky: $_=Linefeed braucht keine Farbe!
  rem das Farbattribut wird jedoch vor jedes Zeichen/Platzhalter gesetzt und hochgezählt
  rem erst vor dem Zeichen  nach dem $_ ist ein Farbattribut nötig
  rem deshalb -2 (...+1 = für  $_ =-1 und +1 für  das nächste Zeichen =0)
if "%char%"=="$_" set "lastColorIndex=-2" 
if  "%char%"=="" goto :raus
set /a "lastColorIndex+=1 , __dummy=lastColorIndex %% __cIndex"


call set "newPrompt=%newPrompt%%%cTable%__dummy%%%%char%"


set "Char="
goto loop
:raus
  rem tausche Sonderzeichen gegen Prompt-Token 
for %%a in ("&=$a","|=$b","(=$c",")=$f","<=$l",">=$g") do call set "newPrompt=%%newPrompt:%%~a%%"
set "fPrompt=prompt %newPrompt%$e[0m$g"
set "bPrompt=prompt $e[30m%newPrompt:$e[38;5;=$e[48;5;%$e[0m$g"


echo %bPrompt%|clip
title BPrompt
start "" /b cmd /k "%bPrompt%"
start "FPrompt" cmd /k "%fPrompt%"

gostTyper.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


Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren

Nutzer4596 
Beitragsersteller
 23.12.2022, 07:03

Vielen dank für die Antwort, aber ich verstehe immer noch nicht ganz wie ich den jetzt das mit dem "Hunt Redeemer" Text replizieren kann.

ich meine bei der AnsiColorDemo.cmd bei dem 6x6x6 Farbraum gab es Farben die ich gerne nutzen wollen würde. Aber wie genau stelle ich das an?

Angenommen statt "Hunt Redeemer" würde ich jetzt einfach nur "Test" als ASCII art darstellen wollen aber eben mit solchen Farben wie im video / aus dem 6x6x6 Farbraum. Wie gehe ich da vor?

Erzesel  23.12.2022, 12:43
@Nutzer4596
@echo off
chcp 65001 >nul
for /f %%. in ('"echo prompt $E|cmd"') do set "ESC=%%."


echo:
  rem setze  RGB-Farben, ist für Violet-übergänge besser geeignet da in diesem  Bereich die 6x6x6-Palette nich genug Abstufungen bietet
  rem der Rest ist etwas probieren für den Start Rot und Blau auf 128 (halbe Leuchtkraft)
  rem Rot in jeder Zeile einigermaßen gleichmäßig bis Zielwert reduzieren
echo %ESC%[38;2;128;0;128m ███     ████     ███   ███   ███      █████               █   
echo %ESC%[38;2;105;0;128m█   █   █        █       █     █         █   ██    █  █   ████ 
echo %ESC%[38;2;80;0;128m█████    ███    █        █     █         █  ████    ██     █   
echo %ESC%[38;2;55;0;128m█   █       █    █       █     █         █  █      █  █    █   
echo %ESC%[38;2;30;0;128m█   █   ████      ███   ███   ███        █   ███   █  █     ██ %ESC%[0m  &rem Farben zurücksetzten