带有 ANSI 颜色处理的 Windows 控制台

mrz*_*asa 49 windows console colors ansi

是否有任何用于解释 ANSI 着色的 Windows 控制台模拟器?

我们使用 rspec,我们团队的一部分使用 Windows,用于着色的特殊字符串对他们来说不是很有用 ;)。

Gle*_*den 61

此页面上的所有答案都没有提到对ANSI 终端控制的新支持的一个重要方面,该支持已在构建 16257(及更高版本)中添加到Windows 10控制台主机。也就是说,它不是吗?e?n?a?b?l?e?d? 默认情况下。除非您使用的特定软件通过调用带有标志的SetConsoleMode API来启用ANSI 处理,否则ENABLE_VIRTUAL_TERMINAL_PROCESSING (0x0004)您将看不到颜色或获得该应用程序的 ANSI 处理。

ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004
https://docs.microsoft.com/windows/console/setconsolemode

使用WriteFileWriteConsole 进行写入时,会为 VT100 和类似的控制字符序列解析字符,这些控制字符序列控制光标移动、颜色/字体模式以及也可以通过现有控制台 API 执行的其他操作。有关更多信息,请参阅控制台虚拟终端序列。

我猜原因本页工作所示的例子是,显然echo命令(或者也许是批处理的一部分CMD.EXEconhost)通过调用刚才提到的API支持ANSI处理。但是许多其他工具或可执行文件会写入stdinstdout可能不会执行此操作,在这种情况下,您将看不到这些进程的颜色。

幸运的是,全局默认值可以从opt-in更改为opt-out。注册表项HKEY_CURRENT_USER\Console\VirtualTerminalLevel设置了处理 ANSI 转义序列的全局默认行为。创建一个DWORD键(如有必要)并将其值设置为默认1全局启用(或0禁用)ANSI 处理。

[HKEY_CURRENT_USER\控制台]
"VirtualTerminalLevel"=dword:00000001

请注意,此注册表设置控制default,这意味着它仅影响未通过调用SetConsoleMode(...). 因此,虽然注册表值可能有助于为控制台模式忽略的应用程序启用ANSI ,但它不会对任何控制台模式(出于某种原因)可能显式禁用ANSI 的应用程序产生影响。

在此处输入图片说明

  • 在 Admin *Powershell* 中,只需使用:`Set-ItemProperty HKCU:\Console VirtualTerminalLevel -Type DWORD 1`。 (7认同)
  • 注意`VirtualTerminalLevel` 破坏了PowerShell 5.1 的`git status` 之类的东西。解决方法是 https://github.com/microsoft/terminal (5认同)
  • @luca.vercelli 是的,您可以在批处理文件中使用“reg.exe”工具来实现上面显示的更改。 (2认同)
  • @GlennSlayden 有没有更好的方法?我不想在用户的计算机上设置任何持久的默认设置。 (2认同)

Max*_*mus 47

ConEmu支持带有 Xterm 256 颜色扩展的 ANSI X3.64。我是这个控制台模拟器的作者。

Ansi 序列为所有进程处理,在 ConEmu 选项卡中运行。

AFAIK,ConEmu 比 Ansicon 支持更多的代码。

ConEmu 和 ANSI X3.64 / Xterm 256 色


rol*_*lve 22

从 Windows 10 TH2 (v1511) 开始,conhost.exe(并且,通过扩展,cmd.exe)支持 ANSI 转义序列,特别是颜色:

来自下面提到的 MSDN 页面的图像

关于控制台虚拟终端序列MSDN 页面解释了支持哪些序列以及如何启用它们:

您可以使用GetConsoleModeSetConsoleMode标志来配置此行为。[...]

以下序列的行为基于 VT100 和衍生的终端仿真器技术,尤其是 xterm 终端仿真器。有关终端序列的更多信息,请访问http://vt100.nethttp://invisible-island.net/xterm/ctlseqs/ctlseqs.html

  • 支持的序列在 https://msdn.microsoft.com/en-us/library/windows/desktop/mt638032(v=vs.85).aspx 中有描述 (4认同)

Jen*_*och 13

是否有任何用于解释 ANSI 着色的 Windows 控制台模拟器?

Windows 10 之前 - 控制台上没有对 ANSI 颜色的本机支持

对于低于 10 的 Windows 版本,Windows 命令控制台默认不支持输出着色。您可以安装CmderConEmuANSICONMintty(在 GitBash 和 Cygwin 中默认使用)来为您的 Windows 命令控制台添加着色支持。

Windows 10 - 命令行颜色

从 Windows 10 开始,Windows 控制台默认支持 ANSI 转义序列和一些颜色。

MSDN 文档

演示

在此处输入图片说明

批处理命令

win10colors.cmd被写了米歇尔Locati

@echo off
cls
echo [101;93m STYLES [0m
echo ^<ESC^>[0m [0mReset[0m
echo ^<ESC^>[1m [1mBold[0m
echo ^<ESC^>[4m [4mUnderline[0m
echo ^<ESC^>[7m [7mInverse[0m
echo.
echo [101;93m NORMAL FOREGROUND COLORS [0m
echo ^<ESC^>[30m [30mBlack[0m (black)
echo ^<ESC^>[31m [31mRed[0m
echo ^<ESC^>[32m [32mGreen[0m
echo ^<ESC^>[33m [33mYellow[0m
echo ^<ESC^>[34m [34mBlue[0m
echo ^<ESC^>[35m [35mMagenta[0m
echo ^<ESC^>[36m [36mCyan[0m
echo ^<ESC^>[37m [37mWhite[0m
echo.
echo [101;93m NORMAL BACKGROUND COLORS [0m
echo ^<ESC^>[40m [40mBlack[0m
echo ^<ESC^>[41m [41mRed[0m
echo ^<ESC^>[42m [42mGreen[0m
echo ^<ESC^>[43m [43mYellow[0m
echo ^<ESC^>[44m [44mBlue[0m
echo ^<ESC^>[45m [45mMagenta[0m
echo ^<ESC^>[46m [46mCyan[0m
echo ^<ESC^>[47m [47mWhite[0m (white)
echo.
echo [101;93m STRONG FOREGROUND COLORS [0m
echo ^<ESC^>[90m [90mWhite[0m
echo ^<ESC^>[91m [91mRed[0m
echo ^<ESC^>[92m [92mGreen[0m
echo ^<ESC^>[93m [93mYellow[0m
echo ^<ESC^>[94m [94mBlue[0m
echo ^<ESC^>[95m [95mMagenta[0m
echo ^<ESC^>[96m [96mCyan[0m
echo ^<ESC^>[97m [97mWhite[0m
echo.
echo [101;93m STRONG BACKGROUND COLORS [0m
echo ^<ESC^>[100m [100mBlack[0m
echo ^<ESC^>[101m [101mRed[0m
echo ^<ESC^>[102m [102mGreen[0m
echo ^<ESC^>[103m [103mYellow[0m
echo ^<ESC^>[104m [104mBlue[0m
echo ^<ESC^>[105m [105mMagenta[0m
echo ^<ESC^>[106m [106mCyan[0m
echo ^<ESC^>[107m [107mWhite[0m
echo.
echo [101;93m COMBINATIONS [0m
echo ^<ESC^>[31m                     [31mred foreground color[0m
echo ^<ESC^>[7m                      [7minverse foreground ^<-^> background[0m
echo ^<ESC^>[7;31m                   [7;31minverse red foreground color[0m
echo ^<ESC^>[7m and nested ^<ESC^>[31m [7mbefore [31mnested[0m
echo ^<ESC^>[31m and nested ^<ESC^>[7m [31mbefore [7mnested[0m
Run Code Online (Sandbox Code Playgroud)

  • 他们刚刚引入了一个标志,它控制彩色输出,默认情况下为 false。见 https://wpdev.uservoice.com/forums/266908-command-prompt-console-bash-on-ubuntu-on-windo/suggestions/15617610--re-enable-enable-virtual-terminal-processing-by) --- Symfony 在 Windows 上使用 PHP.exe,该标志已关闭,因此他们不得不等待补丁,该补丁位于:https://github.com/php/php-src/pull/2103。情况解决了。--- 对于 cmd.exe,该标志始终为真。这就是为什么您在控制台上支持颜色的原因。 (4认同)
  • 我为什么要相信?事实请。a) 更改日志中没有任何内容:https://support.microsoft.com/en-us/help/4009938 b) 对我有用:http://imgur.com/a/MNPNm (2认同)

Ped*_*o77 8

目前,Win10 中默认未启用 CMD 控制台颜色,因此,要启用它,请将以下内容添加到您的代码中:

#if defined WIN32 || defined _WIN32 || defined WIN64 || defined _WIN64
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    DWORD dwMode = 0;
    GetConsoleMode(hOut, &dwMode);
    dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
    SetConsoleMode(hOut, dwMode);

    // References:
    //SetConsoleMode() and ENABLE_VIRTUAL_TERMINAL_PROCESSING?
    //https://stackoverflow.com/questions/38772468/setconsolemode-and-enable-virtual-terminal-processing

    // Windows console with ANSI colors handling
    // https://superuser.com/questions/413073/windows-console-with-ansi-colors-handling
#endif
Run Code Online (Sandbox Code Playgroud)