PowerShell 将历史记录作为跨会话的完整对象进行跟踪

PowerShell track history as full objects across sessions

我是Win 10下使用PowerShell 5.1的新手。 我在修补历史。到目前为止,我设法在 PSReadline 的会话中拥有持久的历史记录。 *

但这是“有限的”持久历史,因为只有命令保存在文本文件中,启动新会话时会读取该文件。于是资料就很多了HistoryInfo objects is lost, in particular the StartExecutionTime。 那么,

  1. Get-Content (Get-PSReadlineOption).HistorySavePath 给出所有没有“时间戳”的命令,并且
  2. Get-History 给出带时间戳的命令,但仅针对当前会话。

我习惯在bashhistory,这两个点都对。

This old doc (2009) 显示了一种可能的解决方法。 在离开 Get-History | Export-Clixml $env:PSDIR'\my_history.xml' 的会话之前,我设法导出了所有历史信息。 在新会话开始时执行 Import-Clixml $env:PSDIR'\my_history.xml' | Add-History 会恢复完整的历史记录,包括时间戳。

我想缺少的是:

  1. 一种在关闭会话时自动导出历史记录的方法。 我什至不知道这是否可能。

  2. 导入后删除历史记录中的第一行,因为它包含导入命令本身。我没有处理这个,但我想我可以处理它。 没有必要。如果导入命令是在启动脚本中执行的,它不会进入历史记录。

这是实现预期结果的可行方法吗? 如果是这样,我怎样才能体现项目 1?

还有其他选择吗?


* 虽然I could not make it work in the PS ISE.

感谢,我可以继续前进。 我做了什么:

  1. 已将 Register-EngineEvent PowerShell.Exiting -Action { . $env:PSDIR'\history\save_history.ps1' } 添加到我的 profile.ps1

  2. 已创建文件$env:PSDIR'\history\save_history.ps1' 包含 Get-History | Export-Clixml $env:PSDIR'\my_history.xml'

这几乎提供了一个解决方案。 仅剩的两个问题是:

  1. 删除作为历史上最后一个命令留下的 exit 命令。 这似乎是可以管理的。

  2. 通过点击“X”关闭时使这项工作。* 在这种情况下,我观​​察到一个奇怪的结果。如果我用“X”关闭会话 #1,并打开一个新的会话 #2,我在会话 #1 中输入的命令不会显示在 Get-History 的底部。 然而,它们可以使用 Up/Dpwn 箭头。 这可能值得另一个问题。


* 根据 this,从 PS v3 开始,“X”按钮与退出事件相关联。但是“X”似乎并不完全像 exit,鉴于上面的第 2 点。