【发布时间】:2017-10-18 06:45:47
【问题描述】:
控制台的文本颜色在 Windows 10 中不起作用build 15063.296。
我挖了一点,发现自己迷路了。这是我找到的所有内容...
从多次讨论来看,似乎在最新版本的 Windows 10 中删除了对 “虚拟终端序列” 或 “控制字符序列” 的支持 (#1 ,#2)。有些人还建议降级 git 版本(这对我不起作用)。
我试图从我的另一台机器上复制cmd.exe,版本是10.0.10586.0,并且着色有效,但是,在进一步阅读和试验后,我不再确定问题出在哪里。
查看ls --color=autogit\git-cmd.exe、git\git-bash.exe、windows 原始cmd.exe 和旧版cmd.exe 的输出比较
根据this site,对着色的支持不在命令窗口中,而是在conhost.exe中,这就引出了一个问题——为什么它在某些控制台中有效而在某些控制台中无效?
如果您从 cmd.exe 启动 powershell.exe,它将继承 conhost 设置,因为它附加到以前创建的控制台,而不是分配新的控制台;这也可以在 powershell.exe 中启用转义序列。
鉴于这句话,我尝试了以下只会加深我的困惑。
我在每个 cmd 版本中运行 ls --color=auto 命令,然后尝试从新版本运行旧 cmd,反之亦然,并得到以下结果。
(红色下划线是cmd v15063,绿色下划线是cmd v10586)
从旧到新
新旧换新
/EDIT 我又做了几个实验...
有趣/令人困惑的是type 和cat 的不同结果以及ls --color=auto 与文件中相同内容typed 的比较结果。
Console Virtual Terminal Sequences msdn
ANSI.SYS historical documentation
【问题讨论】:
-
在 build 15063 中启用的 cmd.exe 实际上是一个错误。在下一个版本中更正。令人惊讶的是,一个 bug 可以如此迅速地变成一个特性 :)
-
“对着色的支持不在命令窗口中,而是在 conhost.exe 中”。这是一个令人困惑的说法。控制台窗口始终由 conhost.exe 托管,而 cmd.exe 是控制台客户端程序,即它可以使用控制台。是否启用 VT 支持取决于控制台屏幕缓冲区的模式标志。碰巧的是,版本 10586 中的 cmd.exe 有一个错误,导致控制台的 VT 模式为继承当前控制台的控制台应用程序(例如 cat.exe)启用。这已在版本 14393 中修复,您尝试取消修复它是错误的。
-
如果你想启用 VT 模式,你必须自己做。 cmd.exe 将尊重启动值,因此只需编写一个打开
CONOUT$的小控制台程序(不要假设StandardOutput句柄是控制台句柄);调用GetConsoleMode获取当前模式;设置ENABLE_VIRTUAL_TERMINAL_PROCESSING标志;调用SetConsoleMode设置新模式;最后CreateProcess和WaitForSingleObject生成并等待新的cmd shell。或者修改 git-cmd.exe 来做到这一点。 -
如果 15063 显示这些转义序列的方式是正确的,那么控制台应用程序的作者做错了什么,即他们的输出没有正确着色?为什么
ls命令不起作用,但来自文件的相同输出typed 起作用了?如果我理解正确的话,cmd.exe 确实启用了对 VT 序列的支持,但没有将其传递给控制台应用程序 - 为什么? -
@eryksun 你说得非常简单!你将如何做你提到的所有事情。比方说,在powershell中?如果它如此简单,你能指出一个更可行的解决方案吗?甚至可能是代码示例。