【问题标题】:C# console application command session historyC# 控制台应用程序命令会话历史记录
【发布时间】:2012-11-21 09:51:45
【问题描述】:

我有一个简单的命令行应用程序,我想存储在程序启动之间输入的命令。

单独存储没问题,我知道怎么做,但是我怎么恢复呢? Console 类没有任何设置历史的方法,如果我在应用程序开始时按向上箭头,它是空的。

来自msdn 的非托管代码方法对我没有帮助,好的答案可以告诉我如何在 c# 中使用它们来获得我需要的东西。

我的想法是只用ReadKey 覆盖向上箭头,并以“硬”的方式进行操作,但如果有更简单的方法,我会很高兴。

【问题讨论】:

  • 内置功能还不够吗? stackoverflow.com/questions/6973260/…
  • 不,如您所见,我想在程序运行之间存储它,内置功能很好,但是当我关闭应用程序并再次打开它时,我没有历史记录。在 linux 中查看 bash,即使您将其关闭并再次打开,它也有命令,而不是 Windows 控制台。
  • 历史记录是命令处理器 cmd.exe 的一项功能。相当于 bash。它不会丢失历史记录,因为您不会在程序运行之间关闭它。如果您希望在您自己的程序中使用它,您必须自己构建。使用 Console.ReadKey() 肯定不是不可能的
  • 是的,我只是想利用我在命令行应用程序启动时拥有的那个功能,所以我想恢复保存的会话以在控制台窗口启动之间使用它,这就是我想要的知道该怎么做。

标签: c# command-line-interface


【解决方案1】:

我会简单地将命令保存为 XML 或关系数据库,当需要时,我会将 XML 反序列化为存储为列表或数组的适当对象(如果您有定义数量的命令,例如最后一个10)。然后覆盖您提到的相应事件,并通过保留您在列表中的位置的计数器来迭代命令对象列表。

【讨论】:

  • 我不会使用数据库或 XML 来完成此类任务,带有新行的纯文本就足够了。我会让它简单地循环遍历字符串数组,不需要对象。我发现重写 Console.ReadLine() 默认行为是相当不可能的,所以这是主要问题。
【解决方案2】:

我知道这是一个老问题,但我也在寻找答案。虽然找不到,所以我构建了 InteractivePrompt。它以NuGet Package 的形式提供,您可以轻松扩展GitHub 上的代码。它具有当前会话的历史记录,但我计划实现在会话之间保存命令的功能。

这是一个非常有用的封装 DLL 的包,例如 SQLite。

【讨论】:

    【解决方案3】:

    如果有人寻找类似的东西,我最终使用了 powershell 和一组脚本,但我设法设置了 powershell 历史记录:

    https://software.intel.com/en-us/blogs/2014/06/17/giving-powershell-a-persistent-history-of-commands

    $HistoryFilePath = Join-Path ([Environment]::GetFolderPath('UserProfile')) .ps_history
    Register-EngineEvent PowerShell.Exiting -Action { Get-History | Export-Clixml $HistoryFilePath } | out-null
    if (Test-path $HistoryFilePath) { Import-Clixml $HistoryFilePath | Add-History }
    # if you don't already have this configured...
    Set-PSReadlineKeyHandler -Key UpArrow -Function HistorySearchBackward
    Set-PSReadlineKeyHandler -Key DownArrow -Function HistorySearchForward
    

    将该代码保存到文件:C:\Users\\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1

    【讨论】:

      猜你喜欢
      • 2011-10-21
      • 2013-09-01
      • 2017-06-20
      • 2016-01-13
      • 1970-01-01
      • 1970-01-01
      • 2015-05-11
      • 2021-04-16
      • 1970-01-01
      相关资源
      最近更新 更多