Windows:当运行嵌套在其自身的 cmd.exe 时,cmd.exe 历史记录(F3、F7、箭头键等)停止工作

Windows:当运行嵌套在其自身的 cmd.exe 时,cmd.exe 历史记录(F3、F7、箭头键等)停止工作

奇怪的是:我刚刚注意到,在运行嵌套在自身中的“cmd”时,命令提示符历史记录在 3 倍速以下正常工作,但在 4 倍速以上时失败。在我尝试过的几台电脑上,情况似乎一致。

知道它为什么会停止工作吗?有没有什么原因导致它在那个特定点失败?

答案1

这个特殊功能不是由 Cmd 提供的,而是由 Conhost 提供的,Conhost 是一个绘制“传统”控制台窗口的程序(即使你使用 Windows 终端,它仍然在后台运行,尽管它被称为打开控制台在这种情况下)。Conhost 为所有接受基于行的输入(在 Unix 术语中称为“cooked 模式”)的程序提供行编辑、历史记录和别名(“doskey”)功能。

每个 Conhost 实例将在每个控制台窗口保留固定数量的历史缓冲区(以及每个历史缓冲区记住的命令的固定限制):

“Cmd.exe 属性”窗口的屏幕截图,其中突出显示了命令历史记录设置

可以通过运行conhost cmd弹出“旧版”控制台来访问上述对话框,然后打开其窗口菜单并选择“默认”(而不是“属性”)来调整所有控制台窗口的这些限制。

“Windows 控制台”子系统是在 1995 年左右在 NT 3.x 中引入的,因此当时的限制可能是合理的(特别是考虑到历史缓冲区csrss.exe当时曾经是其中的一部分)并且从那时起就没有人对它们进行调整。

Conhost 的源代码作为 Windows Terminal 的一部分在 GitHub 上提供,您可以在其中找到这些默认设置设置.cpp(微软一般是搬走从 NT 风格的“控制台”架构转向 Unix 风格的“终端”模型,但 Conhost 仍然存在以提供现在的遗留“控制台” API。)

可以尝试建议增加默认的 Conhost 限制,但他们可能会建议在本地配置它们 - 或者转到 PowerShell(它不使用 Conhost 的历史记录;它以“原始”模式接受输入并实现自己的行编辑,就像 Bash 一样)。

相关内容