【问题标题】:Windows 10 console colors not working (Virtual terminal control character sequences)Windows 10 控制台颜色不起作用(虚拟终端控制字符序列)
【发布时间】: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.exegit\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 我又做了几个实验...

有趣/令人困惑的是typecat 的不同结果以及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 设置新模式;最后CreateProcessWaitForSingleObject 生成并等待新的cmd shell。或者修改 git-cmd.exe 来做到这一点。
  • 如果 15063 显示这些转义序列的方式是正确的,那么控制台应用程序的作者做错了什么,即他们的输出没有正确着色?为什么ls 命令不起作用,但来自文件的相同输出typed 起作用了?如果我理解正确的话,cmd.exe 确实启用了对 VT 序列的支持,但没有将其传递给控制台应用程序 - 为什么?
  • @eryksun 你说得非常简单!你将如何做你提到的所有事情。比方说,在powershell中?如果它如此简单,你能指出一个更可行的解决方案吗?甚至可能是代码示例。

标签: windows cmd


【解决方案1】:

就目前而言,我已“修复”它,将新的cmd_10.0.15063.0 替换为从旧系统复制的旧cmd_10.0.10586.0。如果您已运行 Windows 升级,您可能会在 C:\Windows.old\Windows\System32\cmd.exe 中找到较旧的 cmd 版本。 (文件夹被隐藏)

要替换系统的cmd.exe,您需要获得文件Properties -> Security -> Advanced 的所有权,在顶部Owner: TrustedInstaller (Change) 设置为Administrators,然后在Permissions -> Change permissions -> Administrators -> Edit -> Full control 中授予管理员完全权限。

【讨论】:

  • 如果有机会,我将不得不在 RS3 中再次检查一下。我希望他们能解决这个问题...
猜你喜欢
  • 1970-01-01
  • 2011-03-31
  • 1970-01-01
  • 1970-01-01
  • 2022-09-29
  • 2016-11-23
  • 2013-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多