- Раскрашиваем консоль Windows под хохлому
- ANSI Colors
- Меняем цвета
- Интрига
- Обещанные два клика
- mlocati / win10colors.cmd
- This comment has been minimized.
- mlocati commented Jun 15, 2016 •
- This comment has been minimized.
- Tymski commented Jul 16, 2017
- This comment has been minimized.
- rourke commented Dec 13, 2017
- This comment has been minimized.
- AndyK70 commented Jan 9, 2018
- This comment has been minimized.
- mistergoliath41 commented Dec 20, 2018
- This comment has been minimized.
- xuanchuong commented Dec 28, 2018
- This comment has been minimized.
- T0MuX commented Feb 1, 2019
- This comment has been minimized.
- ACBob commented Mar 20, 2019
- This comment has been minimized.
- hXR16F commented May 21, 2019
- This comment has been minimized.
- ghost commented Jul 10, 2019
- This comment has been minimized.
- tuanla07 commented Aug 24, 2019
- This comment has been minimized.
- mlocati commented Aug 24, 2019
- This comment has been minimized.
- hXR16F commented Sep 2, 2019
- This comment has been minimized.
- Dr-WaSaBi commented Oct 4, 2019
- This comment has been minimized.
- mlocati commented Oct 4, 2019
- This comment has been minimized.
- gothicserpent commented Dec 26, 2019
- This comment has been minimized.
- gothicserpent commented Jan 15, 2020
- This comment has been minimized.
- gothicserpent commented Jan 15, 2020
- This comment has been minimized.
- dyslexicanaboko commented Jan 15, 2020
- This comment has been minimized.
- dyslexicanaboko commented Jan 16, 2020
- This comment has been minimized.
- mlocati commented Jan 16, 2020
- This comment has been minimized.
- dyslexicanaboko commented Jan 21, 2020
- This comment has been minimized.
- sepehrst commented Jun 1, 2020
- This comment has been minimized.
- Pongsapat3791 commented Jun 29, 2020 •
- This comment has been minimized.
- TheFlash2k commented Sep 18, 2020
- This comment has been minimized.
- hXR16F commented Sep 18, 2020
- This comment has been minimized.
- SPIKEYPUP commented Nov 29, 2020
- This comment has been minimized.
- Claudetom commented Dec 5, 2020
Раскрашиваем консоль Windows под хохлому
С наступающим, коллеги. Все знают, что для консоли в windows можно легко задать цвет текста и фона. Но мало кто знает, что остальные 14 цветов тоже можно задать, существенно упростив себе работу с консольными приложениями, поддерживающими цвета в windows — например, git или mercurial. Под катом я в лицах и картинках расскажу о своей борьбе с цветами и о получившейся в результате утилитке на python, которая позволяет раскрасить консоль одной командой, дабы больше не видеть этого бело-синего ужаса powershell.
ANSI Colors
Итак, я хочу поменять все цвета в консоли, а не только текста и фона. Для начала посмотрим, что это за цвета. В linux и osx все просто — есть стандарт «ANSI Colors», который гласит, что если вывести в консоль определенную последовательность символов, то следующий за ней текст будет покрашен во все цвета радуги:
К сожалению, авторы windows данный стандарт не поддержали, но нечто похожее имеется — 16 цветов, которыми можно раскрашивать текст и фон. Простенькая программа на python показывает, как это выглядит:
Цвета, мягко выражаясь, печальные. Особенно если сравнивать результаты с цветовой схемой по умолчанию в ubuntu:
Меняем цвета
Цветовые настройки консоли хранятся, что ожидаемо, в реестра. Нас интересует ключ HKEY_CURRENT_USER\Console, значения от «ColorTable00 (черный, он же цвет фона) до ColorTable15 (яркий белый). Значения: DWORD, 0x00BBGGRR. Меняем эти волшебные ключи и получаем то же самое, что и в Ubuntu. Единственная разница — цвета идут в другом порядке:
Цель достигнута? Похоже на то. Но тут есть…
Интрига
Радуемся новым цветам. Через некоторое время понимаем, что у нас Windows 7 или Windows 8 и мы хотим прикрепить консоль в taskbar, дабы вызывать ее через хоткей „win+номер“. Делаем „pin this program to taskbar“, запускаем, и видим ЭТО:
Откуда взялся этот синий фон, который при раскраске становится черным? Ведь если запустить консоль через „win+r“ — мы видим наши цвета, установленные на предыдущем шаге. Тут кроется самое интересное — когда мы прикрепляем консольное приложение на taskbar, Windows создает для него ярлык (файл с расширением .lnk) и устанавливает для этого ярлыка персональные настройки цветов. Что делать? Берем в руки python, немного COM, и модифицируем настройки ярлыка. Теперь совсем все работает.
Обещанные два клика
Чтобы не растерять квалификацию программиста, я оформил все вышеперечисленное в качестве небольшого модуля на python, который можно использовать в качестве утилиты командной строки. Если у вас уже установлен python, то для установки моего шедевра достаточно выполнить команду:
Если же python у вас не стоит, то рекомендую поставить сборку ActivePython — кроме python она содержит еще и ряд предустановленных расширений, полезных для работы под Windows. Как с помощью утилиты раскрасить консоль под хохлому? Если запустить утилиту без аргументов командной строки, то она попытается найти в директории пользователя файл .Xresources и применить цвета из него. Если же такого файла нет, то будут применены цвета из ubuntu, которые я демонстрировал в примерах выше. Файл .Xresources — это штатный для *nix способ хранения настроек терминала, в частности цветовых схем. Если погуглить, то можно найти красивые готовые схемы.
Работа с ярлыками чуть сложнее — чтобы модифицировать настройки ярлыка, необходимо вызвать утилиту с ключом командной строки ‘—update-link’ и полным путем к ярлыку. Ярлыки прикрепленных на taskbar программ в Windows хранятся в директории „%USERPROFILE%\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar“. Пример модификации ярлыка powershell, прикрепленного к taskbar:
Вроде все. Еще раз с наступающим всех, надеюсь кому-нибудь вышеизложенное пригодится :).
mlocati / win10colors.cmd
@ echo off |
setlocal |
call :setESC |
cls |
echo %ESC% [101;93m STYLES %ESC% [0m |
echo ^ ESC ^ > [0m %ESC% [0mReset %ESC% [0m |
echo ^ ESC ^ > [1m %ESC% [1mBold %ESC% [0m |
echo ^ ESC ^ > [4m %ESC% [4mUnderline %ESC% [0m |
echo ^ ESC ^ > [7m %ESC% [7mInverse %ESC% [0m |
echo . |
echo %ESC% [101;93m NORMAL FOREGROUND COLORS %ESC% [0m |
echo ^ ESC ^ > [30m %ESC% [30mBlack %ESC% [0m (black) |
echo ^ ESC ^ > [31m %ESC% [31mRed %ESC% [0m |
echo ^ ESC ^ > [32m %ESC% [32mGreen %ESC% [0m |
echo ^ ESC ^ > [33m %ESC% [33mYellow %ESC% [0m |
echo ^ ESC ^ > [34m %ESC% [34mBlue %ESC% [0m |
echo ^ ESC ^ > [35m %ESC% [35mMagenta %ESC% [0m |
echo ^ ESC ^ > [36m %ESC% [36mCyan %ESC% [0m |
echo ^ ESC ^ > [37m %ESC% [37mWhite %ESC% [0m |
echo . |
echo %ESC% [101;93m NORMAL BACKGROUND COLORS %ESC% [0m |
echo ^ ESC ^ > [40m %ESC% [40mBlack %ESC% [0m |
echo ^ ESC ^ > [41m %ESC% [41mRed %ESC% [0m |
echo ^ ESC ^ > [42m %ESC% [42mGreen %ESC% [0m |
echo ^ ESC ^ > [43m %ESC% [43mYellow %ESC% [0m |
echo ^ ESC ^ > [44m %ESC% [44mBlue %ESC% [0m |
echo ^ ESC ^ > [45m %ESC% [45mMagenta %ESC% [0m |
echo ^ ESC ^ > [46m %ESC% [46mCyan %ESC% [0m |
echo ^ ESC ^ > [47m %ESC% [47mWhite %ESC% [0m (white) |
echo . |
echo %ESC% [101;93m STRONG FOREGROUND COLORS %ESC% [0m |
echo ^ ESC ^ > [90m %ESC% [90mWhite %ESC% [0m |
echo ^ ESC ^ > [91m %ESC% [91mRed %ESC% [0m |
echo ^ ESC ^ > [92m %ESC% [92mGreen %ESC% [0m |
echo ^ ESC ^ > [93m %ESC% [93mYellow %ESC% [0m |
echo ^ ESC ^ > [94m %ESC% [94mBlue %ESC% [0m |
echo ^ ESC ^ > [95m %ESC% [95mMagenta %ESC% [0m |
echo ^ ESC ^ > [96m %ESC% [96mCyan %ESC% [0m |
echo ^ ESC ^ > [97m %ESC% [97mWhite %ESC% [0m |
echo . |
echo %ESC% [101;93m STRONG BACKGROUND COLORS %ESC% [0m |
echo ^ ESC ^ > [100m %ESC% [100mBlack %ESC% [0m |
echo ^ ESC ^ > [101m %ESC% [101mRed %ESC% [0m |
echo ^ ESC ^ > [102m %ESC% [102mGreen %ESC% [0m |
echo ^ ESC ^ > [103m %ESC% [103mYellow %ESC% [0m |
echo ^ ESC ^ > [104m %ESC% [104mBlue %ESC% [0m |
echo ^ ESC ^ > [105m %ESC% [105mMagenta %ESC% [0m |
echo ^ ESC ^ > [106m %ESC% [106mCyan %ESC% [0m |
echo ^ ESC ^ > [107m %ESC% [107mWhite %ESC% [0m |
echo . |
echo %ESC% [101;93m COMBINATIONS %ESC% [0m |
echo ^ ESC ^ > [31m %ESC% [31mred foreground color %ESC% [0m |
echo ^ ESC ^ > [7m %ESC% [7minverse foreground ^ — ^ > background %ESC% [0m |
echo ^ ESC ^ > [7;31m %ESC% [7;31minverse red foreground color %ESC% [0m |
echo ^ ESC ^ > [7m and nested ^ ESC ^ > [31m %ESC% [7mbefore %ESC% [31mnested %ESC% [0m |
echo ^ ESC ^ > [31m and nested ^ ESC ^ > [7m %ESC% [31mbefore %ESC% [7mnested %ESC% [0m |
: setESC |
for /F » tokens=1,2 delims=# » %% a in (‘ » prompt #$H#$E# & echo on & for %% b in (1) do rem » ‘) do ( |
set ESC = %% b |
exit /B 0 |
) |
exit /B 0 |
This comment has been minimized.
Copy link Quote reply
mlocati commented Jun 15, 2016 •
This comment has been minimized.
Copy link Quote reply
Tymski commented Jul 16, 2017
This comment has been minimized.
Copy link Quote reply
rourke commented Dec 13, 2017
@mlocati Thanks for this! However it doesn’t work in a for loop:
Do you know how to solve this?
This comment has been minimized.
Copy link Quote reply
AndyK70 commented Jan 9, 2018
@rourke it works in a loop, try
But if you put in timeout it works only for the first loop pass. Maybe there is something about this command which breaks the coloring codes:
If you go with pause it works:
if you only want the time delay but no user interaction you should go with the oldstyle ping:
This comment has been minimized.
Copy link Quote reply
mistergoliath41 commented Dec 20, 2018
This comment has been minimized.
Copy link Quote reply
xuanchuong commented Dec 28, 2018
This comment has been minimized.
Copy link Quote reply
T0MuX commented Feb 1, 2019
Not working for me too. Win7 SP1 NT6.1.7601.
I type directly thoses commands in cmd.exe it even no copying right.
This comment has been minimized.
Copy link Quote reply
ACBob commented Mar 20, 2019
Thank you for this.
Now it’s easier for me to identify my error codes!
This comment has been minimized.
Copy link Quote reply
hXR16F commented May 21, 2019
Very helpful
This comment has been minimized.
Copy link Quote reply
ghost commented Jul 10, 2019
@MG-Tech @T0MuX This is for Windows 10 (Build 16257 and higher)
This comment has been minimized.
Copy link Quote reply
tuanla07 commented Aug 24, 2019
@MG-Tech @T0MuX This is for Windows 10 (Build 16257 and higher)
How can we try it with Win7 & WinXP?
This comment has been minimized.
Copy link Quote reply
mlocati commented Aug 24, 2019
How can we try it with Win7 & WinXP?
@tuanla07 those versions of Windows don’t support this feature
This comment has been minimized.
Copy link Quote reply
hXR16F commented Sep 2, 2019
@tuanla07 By using ansicon.
This comment has been minimized.
Copy link Quote reply
Dr-WaSaBi commented Oct 4, 2019
Can anyone tell me how to enter an escape code using VS Code?
This comment has been minimized.
Copy link Quote reply
mlocati commented Oct 4, 2019
@Dr-WaSaBi the usual way to enter the ESC ascii character is to hold down the ALT key and press 027 on the numeric keypad (when NumLock is on).
This works in Notepad++, but it seems that VS Code doesn’t like it.
You have 2 options:
- download this raw win10colors.cmd file, open it in VS Code, copy the escape character included, and paste it wherever you want
- file an issue at https://github.com/Microsoft/vscode/issues
This comment has been minimized.
Copy link Quote reply
gothicserpent commented Dec 26, 2019
thank you so much for this! using this in a batch script! couldn’t find the escape characters anywhere once i downloaded this I was set! Thanks again.
This comment has been minimized.
Copy link Quote reply
gothicserpent commented Jan 15, 2020
@dyslexicanaboko I got it to work by simply downloading the .cmd file to my computer, and copying and pasting the breaks directly into my batch files.
REM updates git local windows copy
cls
echo.
echo Git will update from the current version:
echo.
git —version
echo.
set /p DUMMY=�[97mHit ENTER to continue. �[0m
echo.
git update-git-for-windows
echo.
set /p DUMMY=�[92mDone, Hit ENTER to continue. �[0m
updates my git install on windows.
This comment has been minimized.
Copy link Quote reply
gothicserpent commented Jan 15, 2020
@Dr-WaSaBi the usual way to enter the ESC ascii character is to hold down the ALT key and press 027 on the numeric keypad (when NumLock is on).
This works in Notepad++, but it seems that VS Code doesn’t like it.
You have 2 options:
- download this raw win10colors.cmd file, open it in VS Code, copy the escape character included, and paste it wherever you want
- file an issue at https://github.com/Microsoft/vscode/issues
have to perform these steps @dyslexicanaboko
This comment has been minimized.
Copy link Quote reply
dyslexicanaboko commented Jan 15, 2020
Just a general FYI for anyone scratching their head like I was. It may appear that if you type this directly into a command window it doesn’t work. However if you run the batch file it works. Upon further inspection if you open the batch file with Notepad++ it will show you the hidden «ESC» characters which are required in order to make it work. Don’t confuse this with the escape key on your keyboard, it’s not the same thing. It’s actually the alt code: ALT + 0 + 2 + 7
Therefore you can actually type this directly into the CMD window, it’s just a pain to do because you have to use that ALT code as mentioned above. I was able to do it, it was just torture.
This comment has been minimized.
Copy link Quote reply
dyslexicanaboko commented Jan 16, 2020
@Dr-WaSaBi the usual way to enter the ESC ascii character is to hold down the ALT key and press 027 on the numeric keypad (when NumLock is on).
This works in Notepad++, but it seems that VS Code doesn’t like it.
You have 2 options:
- download this raw win10colors.cmd file, open it in VS Code, copy the escape character included, and paste it wherever you want
- file an issue at https://github.com/Microsoft/vscode/issues
@gothicserpent Hey thanks for replying. I realized my error and I deleted my original post, sorry about that. I was just surprised to see hidden characters, that didn’t cross my mind before. It’s been a very long time since I have had to work with hidden characters. Reminds me of dealing with UART and TAP.
This comment has been minimized.
Copy link Quote reply
mlocati commented Jan 16, 2020
I updated the script: now the escape character (ASCII code decimal 27, hexadecimal 1B) is assigned to the new ESC environment variable by the setESC subroutine, we don’t have that invisible char anymore.
This comment has been minimized.
Copy link Quote reply
dyslexicanaboko commented Jan 21, 2020
I updated the script: now the escape character (ASCII code decimal 27, hexadecimal 1B) is assigned to the new ESC environment variable by the setESC subroutine, we don’t have that invisible char anymore.
Thank you for doing that! That does make it easier!
This comment has been minimized.
Copy link Quote reply
sepehrst commented Jun 1, 2020
The setESC subroutine can be simplified to:
This comment has been minimized.
Copy link Quote reply
Pongsapat3791 commented Jun 29, 2020 •
@echo off
setlocal
call :setESC
:setESC
for /F %%a in (‘»prompt $E$S & echo on & for %%b in (1) do rem»‘) do set «ESC=%%a»
exit /B
This comment has been minimized.
Copy link Quote reply
TheFlash2k commented Sep 18, 2020
Is it possible to use it with «PROMPT» command to create a colorful prompt?
This comment has been minimized.
Copy link Quote reply
hXR16F commented Sep 18, 2020
Is it possible to use it with «PROMPT» command to create a colorful prompt?
This comment has been minimized.
Copy link Quote reply
SPIKEYPUP commented Nov 29, 2020
Thanks for this @mlocati this was helpful for me today 👍
This comment has been minimized.
Copy link Quote reply
Claudetom commented Dec 5, 2020
Bonjour,
Dans un fichier Batch .bat,
Je pose des questions pour le renseignement de variables, j’ai choisi de coloriser le texte de la demande, mais le problème est qu’un retour à la ligne est présent, pour la saisie à la question ?
est-il possible de faire en sorte, que la réponse qui est saisie par l’utilisateur soit sur la même ligne que la question ?
English:
Hello,
In a Batch .bat file,
I ask questions for the information of variables, I chose to colorize the text of the request, but the problem is that a new line is present, for the seizure to the question?
is it possible to ensure that the answer entered by the user is on the same line as the question?
:: Demande Nom de l instance echo %ESC%[0;91m Saisissez votre Instance SQL: %ESC%[0m set /p INSTANCEC= if DEFINED INSTANCEC (SET «INSTANCE=%INSTANCEC%») ELSE (GOTO ENDPPOCESS:)
- Je voudrais que la réponse soit à la suite de » Saisissez votre Instance SQL: «