为什么Windows控制台在一段时间后会失去命令历史记录(上箭头)?

29

问题看起来很随机:在Windows Vista上使用任何控制台一段时间/次数后,我失去了使用命令行历史记录(或命令缓冲区,如果您愿意的话...)的能力,按上箭头或下箭头不再有任何反应,这意味着历史记录中基本上没有可用项。

我已经在Cygwin、CMD和PowerShell中看到了这种行为。

有时,这种行为也适用于运行在控制台内部的进程-例如Python、MySQL客户端等。

这是Windows中的固有问题吗?还是某个设置?是否有其他控制台没有这个问题?

附注-如果您认为这与编程无关,请查看其他有关编程工具的问题,例如几乎所有标记为“eclipse”的问题,这些问题处理如何使用IDE而不是为其编程。


+1 我偶尔在使用cygwin时会遇到这个问题。我非常依赖ctrl+r来提醒我一些我经常使用的复杂命令。然后这个功能就失效了,我不得不重新学习一堆命令的确切语法。 - Ruan Mendes
你解决这个问题了吗? - Mike Nakis
7
好的,我停止使用Windows了。 - wsorenson
10个回答

17

我想有两种方法:

1)Far Manager 是一个很好的 shell 工具。即使您不需要它的全部功能(文件/归档管理,编辑器,大量插件和宏),您仍然可以将其用作 cmd、tcc、sh 或任何其他程序、shell 或命令处理器的包装器/执行器。

例如:

  • 从发行版中取出 3 个文件 (Far2 或 Far3):far.exe、fareng.lng 和 (可选的) fareng.hlp
  • 运行 "far.exe /w",按 Ctrl+B Ctrl+O
  • 在命令行中输入任何命令:dir、set、notepad、putty 等等……

历史记录将在会话之间保存,并且您可以通过按 Alt+F8(按下 Ctrl+Alt+F 切换历史记录到过滤模式)访问它。

Far 2.0 将历史记录(和设置)存储在注册表中。

Far 3.0 在 SQLite 数据库中存储历史记录,并且可以是便携式的。

此外,Far 还可以自动完成来自历史记录的命令或来自磁盘的文件/路径。而且还有一个插件(YAC),可以从别名等自动完成……

2) 我最近发现了一个有趣的项目:Clink,将 Bash 的强大命令行编辑功能带到 Microsoft Windows 的 cmd.exe。

  • 来自 GNU Readline 库的强大 Bash 类型行编辑。请在 Readline 的键盘快捷键上阅读更多信息。
  • 优秀的路径自动补全(TAB)。
  • 从剪贴板粘贴 (Ctrl-V)。
  • 支持可执行文件/命令和环境变量的完成。
  • 撤消/重做 (Ctrl-_Ctrl-XCtrl-U)
  • 改进的命令行历史记录。
  • 跨会话持久化。
  • 可搜索(Ctrl-RCtrl-S)。
  • 历史扩展(例如 !!,!和!$)。
  • 使用Lua脚本完成自动补全。
  • 这似乎是一个年轻但正在崛起的项目,因此我已经创建了一个选项供我的控制台模拟器使用。


    3
    为什么会有这么多赞?这是很好的信息,但并没有回答实际问题(用户可能按下了“滚动锁定”键)。 - ThisGuy

    5

    检查你的 Scroll Lock 键。 糟糕!我不小心按到了我的键盘,导致向上和向下箭头只能滚动窗口。


    5
    在Windows "DOS Box"中,历史缓冲区有一个最大大小限制--点击左上角图标,在菜单中选择属性,你会看到命令历史默认的缓冲区大小为50。

    然而,这并不是问题的关键——你会期望这意味着一个浮动的历史窗口,而不是当你达到50时历史记录就中断——中断是被注意到的行为,有时甚至在50之前就出现了。 - wsorenson
    3
    向上箭头不再能够回忆任何物品。 - wsorenson

    4
    我多年来一直遇到这个问题,大多数情况下是在bash shell中使用python命令行时出现的。今天经过一些尝试当这个问题第1000次(或多或少)再次发生时,我将shell的Command History缓冲区大小设置为999,并将Number of Buffers设置为999来解决了这个问题(我选择了每个最大可能的设置,除了之前的50/50)。要访问命令历史记录,请右键单击shell窗口左上角,选择属性,然后选择选项卡。我不确定这些设置对shell性能的影响,但到目前为止似乎没有其他影响,而且命令行历史记录在之前无法工作的同一个shell中再次正常工作了。我承认我的答案只涉及1个实验,但它起作用了。

    从999/4到999/10的转换解决了我在Windows 10上运行的bash shell中python shell的问题。 - Ovaflo
    这对我有用,谢谢!虽然我不得不重新启动带有我的环境的shell。我还没有尝试过小于999的数字,但我打赌有一个甜蜜点。 - Fernando Ortega

    4

    在PowerShell中,您可以通过MaximumHistoryCount自动变量来控制历史记录的最大大小(默认值为64)。

    PS > $MaximumHistoryCount


    1

    控制台中的所有历史记录都由Doskey提供。它也始终可用于所有基于字符的交互式程序(例如程序调试器或文件传输程序),并维护每个启动的程序的命令历史记录缓冲区和宏。

    在DOS时代,人们可以记得执行后清除历史记录的软件。我不确定它们是错误、预期行为还是两者混合。但是一些Doskey错误是众所周知的,您可以在this link的末尾看到。

    我建议任何遇到此问题的人尝试使用Doskey命令选项,并查看是否可以纠正它。


    0
    如果“突然间”所有历史记录都消失了,也许会启动一个新的cmd-shell? 测试:
    C:\Users\Guest\>doskey /history
     …long history…
    C:\Users\Guest\>cmd
    Microsoft Windows [Version 6.1.7601]
    Copyright (c) 2009 Microsoft Corporation.  All rights reserved.
    C:\Users\Guest\>doskey /history
     …no history…
    C:\Users\Guest\>exit
    C:\Users\Guest\>doskey /history
     …old long history…
    

    当然,在这个例子中,你会看到新的cmd-Start,但如果你尝试这样做:

    doskey /history
      …history list…
    cmd echo /k
    doskey /history
      …no list !
    

    你看不到

    Microsoft Windows [Version 6.1.7601]
    Copyright (c) 2009 Microsoft Corporation.  All rights reserved.
    

    但是一个新的CMD-Shell已经启动。 因此,在这种情况下,“exit”可能会有所帮助!


    0

    我从未遇到过这种情况,但我想知道按下键盘组合ALT+F7是否会清除命令历史记录,根据DOSKEY /?的说明,这可能是原因。


    0
    1. 在 Windows 命令提示符的左上角,单击鼠标右键,选择 C:\ 图标。
    2. 选择“属性”。
    3. 在“选项”选项卡中,找到“命令历史记录设置”。
    4. 将缓冲区大小更改为 999。
    5. 关闭终端并重新启动它。

    0

    当我在Windows 10上的Rez环境中时,这种情况发生了。

    根据@user1769064上面的答案,将缓冲区设置为999并使用新环境重新启动shell,问题就解决了。可能有比999更低的数字也可以工作,但我没有尝试过。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接