Como ter várias colors em um arquivo em lotes do Windows?

Eu queria saber se é possível ter texto colorido diferente na mesma linha em um arquivo de lote do Windows, por exemplo, se ele diz

echo hi world 

Eu quero “oi” para ser uma cor e “mundo” para ser outra cor. Talvez eu possa definir o comando COLOR como uma variável:

 set color1= color 2 set color9= color A 

e, em seguida, implantar os dois na mesma linha, juntamente com

 echo hi world 

mas eu não sei como eu faria isso.

Na verdade, isso pode ser feito sem criar um arquivo temporário. O método descrito por jeb e dbenham funcionará mesmo com um arquivo de destino que não contenha backspaces. O ponto crítico é que a linha reconhecida pelo findstr.exe não deve terminar com um CRLF. Portanto, o arquivo de texto óbvio a ser varrido com uma linha que não termina com um CRLF é o próprio lote de invocação, desde que seja finalizado com essa linha! Aqui está um script de exemplo atualizado trabalhando dessa maneira …

Alterações do exemplo anterior:

  • Usa um único traço na última linha como a string pesquisável. (Deve ser curto e não aparecer em nenhum outro lugar como este no lote.)
  • Rotinas e variables ​​renomeadas para serem um pouco mais orientadas a objects 🙂
  • Removido um nível de chamada para melhorar um pouco o desempenho.
  • Comentários adicionados (começando com: # para parecer mais com a maioria das outras linguagens de script).

 @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!"=="" " 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. Estou tendo um problema com a saída do! caractere que você não tinha no exemplo anterior. (Ou pelo menos você não teve os mesmos sintomas). Para ser investigado.

Você pode fazer saídas multicoloridas sem nenhum programa externo.

 @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  "%~2" findstr /v /a:%1 /R "^$" "%~2" nul del "%~2" > nul 2>&1 goto :eof 

Ele usa o recurso de cor do comando findstr.

O Findstr pode ser configurado para gerar números de linhas ou nomes de arquivos em uma cor definida.
Então eu primeiro criei um arquivo com o texto como nome de arquivo, e o conteúdo é um único caractere (ASCII 8).
Então eu pesquiso todas as linhas não vazias no arquivo e em nul, então o nome do arquivo será gerado na cor correta anexada com dois-pontos, mas o sinal de dois pontos é imediatamente removido pelo .

EDIT: um ano depois … todos os personagens são válidos

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

Isso usa a regra para caminhos / nomes de arquivos válidos.
Se um \..\ estiver no caminho, o elemento preemporado será removido completamente e não é necessário que este elemento contenha apenas caracteres de nome de arquivo válidos.

A resposta editada de jeb chega perto de resolver todos os problemas. Mas tem problemas com as seguintes strings:

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

Eu modifiquei sua técnica para algo que, na minha opinião, pode lidar com qualquer sequência de caracteres imprimíveis, exceto por limitações de comprimento.

Outras melhorias:

  • Usa o local% TEMP% para o arquivo temporário, portanto, não precisa mais de access de gravação ao diretório atual.

  • Criado 2 variantes, um leva uma string literal, o outro o nome de uma variável que contém a string. A versão da variável é geralmente menos conveniente, mas elimina alguns problemas de escape de caracteres especiais.

  • Adicionada a opção / n como um 3º parâmetro opcional para acrescentar uma nova linha no final da saída.

Backspace não funciona através de uma quebra de linha, portanto, a técnica pode ter problemas se a linha for envolvida. Por exemplo, imprimir uma seqüência de caracteres com comprimento entre 74 e 79 não funcionará corretamente se o console tiver uma largura de linha de 80.

 @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" "%temp%\x" set /p "=%DEL%%DEL%%DEL%%DEL%%DEL%%DEL%.%DEL%" exit /b :cleanupColorPrint del "%temp%\x" exit /b 

ATUALIZAÇÃO 2012-11-27

Esse método falha no XP porque FINDSTR exibe backspace como um período na canvas. A resposta original de jeb funciona no XP, embora com as limitações já observadas

ATUALIZAÇÃO 2012-12-14

Tem havido muita atividade de desenvolvimento em DosTips e SS64 . Acontece que FINDSTR também corrompe nomes de arquivos contendo ASCII estendido, se fornecido na linha de comando. Eu atualizei meu Q & A FINDSTR .

Abaixo está uma versão que funciona no XP e suporta todos os caracteres de byte único, exceto 0x00 (nul), 0x0A (linefeed) e 0x0D (retorno de carro). No entanto, quando executado no XP, a maioria dos caracteres de controle será exibida como pontos. Este é um recurso inerente do FINDSTR no XP que não pode ser evitado.

Infelizmente, adicionar suporte para XP e para caracteres ASCII estendidos retarda a rotina 🙁

Apenas por diversão, eu peguei algumas colors da arte ASCII da Galeria de Arte ASCII de joan stark e as adaptei para uso com o ColorPrint. Eu adicionei um ponto de input: c apenas para abreviar e para lidar com um problema com literais de cotação.

 @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 colorPrint.txt (echo %%s\..\') findstr /a:%~1 /f:colorPrint.txt "." "%temp%\'" set /p "=." subst ': "%temp%" >nul exit /b :cleanupColorPrint 2>nul del "%temp%\'" 2>nul del "%temp%\colorPrint.txt" >nul subst ': /d exit /b 

Se você tem um Windows moderno (que tem o powershell instalado), o seguinte pode funcionar bem também

 call :PrintBright Something Something (do actual batch stuff here) call :PrintBright Done! goto :eof :PrintBright powershell -Command Write-Host "%*" -foreground "White" 

Ajuste a cor como achar melhor.

Sem ferramentas externas .Este é um híbrido bat / .net auto-compilado (deve ser salvo como .BAT ) que pode ser usado em qualquer sistema que tenha instalado o framework .net (é raro ver um windows sem o .NET framework mesmo para as instalações XP / 2003 mais antigas). Ele usa o compilador jscript.net para criar um exe capaz de imprimir strings com diferentes colors de fundo / primeiro plano apenas para a linha atual.

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

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

Você também pode verificar a function das colors de carlos -> http://www.dostips.com/forum/viewtopic.php?f=3&t=4453

Sim, é possível com o cmdcolor :

 echo \033[32mhi \033[92mworld 

hi será verde escuro e verde claro.

Combinando o pássaro e a syntax do dbenham com o método write-host do powershell do skrebbel , parece que o PowerShell pode render a arte complexa mais rapidamente do que o método de lote puro do dbenham (bem, após o PowerShell ter sido iniciado uma vez). Massa mínima das cordas é necessária, embora eu não tenha testado isso com outra coisa senão o pássaro. Se você quiser um personagem de fim de transmissão verde shiny, por exemplo, você pode estar sem sorte. 🙂

Esse método requer ecoar para um arquivo temporário, simplesmente porque invoca o powershell para cada call :c demora uma eternidade e é muito mais rápido enfileirar a saída para uma invocação do powershell. Mas tem a vantagem da simplicidade e eficiência.

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

Resultado:

insira a descrição da imagem aqui

Apenas para concluir este tópico, você também pode mostrar o texto colorido usando meu programa auxiliar ColorShow.exe; você pode baixá-lo deste site , procure pelo programa # 12. Por favor, note que a primeira parte da documentação aparece no programa # 2-Show.exe.

Existem vários programas auxiliares nesse site que permitem alcançar algumas coisas interessantes. Por exemplo, o programa # 6-CursorPos.exe permite mover o cursor para qualquer lugar na canvas.

Este é um exemplo de saída produzido por um arquivo em lote usando meu programa auxiliar ColorShow.exe:

Monalisa

O arquivo em lote levou menos de 3 segundos para mostrar a imagem anterior, que tem uma resolução de 322×138 (usando a fonte Lucida Console @ size 5). Você pode rever o método usado para produzir esta imagem nesta postagem .

EDIT : Eu postei um método muito mais simples para obter o programa ColorShow.exe e uma breve descrição dele; basta seguir este link .

Você deve fazer o download do chgcolor.zip em http://www.mailsend-online.com/blog/setting-text-color-in-a-batch-file.html e também fazer o download do echoj.zip em http://www.mailsend-online.com / blog /? p = 41 Eles estão na parte inferior da página. Extraia as duas pastas para a área de trabalho e copie os executáveis ​​(arquivos .exe) de dentro das pastas extraídas para o diretório C: \ Windows. Isso permitirá que eles sejam executados a partir da linha de comando. Abra o bloco de notas e copie o seguinte para ele:

@echo off

chgcolor 03

echoj “oi”

chgcolor 0d

echoj “mundo”

chgcolor 07

echoj $ 0a

Salve o arquivo na área de trabalho como hi.bat. Agora abra o prompt de comando e navegue até a pasta Desktop e digite “hi.bat” sem as aspas. Isso deve ajudá-lo a ler as duas páginas da Web para obter um tutorial completo.

Vários methods são abordados em
“51} Como posso ecoar linhas em colors diferentes em scripts do NT?”
http://www.netikka.net/tsneti/info/tscmd051.htm

Uma das alternativas: Se você conseguir se apossar do QBASIC, usar colors é relativamente fácil:

  @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 

A menos que você esteja usando um sistema operacional mais antigo, isso não é possível com os comandos disponíveis para você.

No entanto nem tudo está perdido, dê uma olhada nesta página:

http://www.mailsend-online.com/blog/setting-text-color-in-a-batch-file.html

Isso lhe dará exatamente o que você precisa, mas o lado negativo é que você precisa adicionar os utilitários nessa página.

Se o seu console suporta códigos de colors ANSI (por exemplo, ConEmu , Clink ou ANSICON ), você pode fazer isso:

 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 

onde ESC variável contém caracteres ASCII 27.

Eu encontrei uma maneira de preencher a variável ESC aqui: http://www.dostips.com/forum/viewtopic.php?p=6827#p6827 e usando a lista de tasklist , é possível testar quais DLLs são carregadas em um processo.

O script a seguir obtém o ID do processo do cmd.exe em que o script está sendo executado. Verifica se possui uma DLL que adicionará suporte a ANSI injetado e, em seguida, define variables ​​de cor para conter seqüências de escape ou não.

 @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" (ie 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 (eg Administrator) accounts, :: - interactively or in the background. :: - work when the cmd.exe window cannot appear :: eg 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 

All alternatives described thus far use any temporary files. This is bad, it is not always possible to use temporary files. This script below uses no temporary file and can write text on any screen position. The best script for this purpose is this