2

我是在 Win 10 下使用 PowerShell 5.1 的新手。我正在修补历史。到目前为止,我设法在与PSReadline. *

但这是一个“有限”的持久历史,因为只有命令保存在文本文件中,在启动新会话时会读取该文件。因此,有关HistoryInfo对象的很多信息都丢失了,尤其是StartExecutionTime。然后,

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

我习惯了historyin bash,这两个点都是正确的。

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

我想,缺少的是:

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

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

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

有没有其他选择?


* 虽然我无法让它在 PS ISE 中工作

4

1 回答 1

2

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

  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. 不过,它们可与向上/向下箭头一起使用。这可能值得另一个问题。


* 按照这个,从 PS v3 开始,“X”按钮与退出事件挂钩。exit但是,鉴于上面的第 2 点,“X”的工作方式似乎并不完全一样。

于 2020-07-14T01:58:28.177 回答