我对Powershell中的PSReadLine历史如何跨会话工作感到困惑。在PSVersion5.1中,我可以看到我以前的命令历史记录自动存储在
%userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\但是,如果我运行get-history,我只看到我当前的会话命令历史记录。我认为在Powershell的后期版本中不再需要钩子来保存跨会话的命令历史记录。我遗漏了什么?
发布于 2018-12-14 15:25:53
该文件
%userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt只包含输入的命令(这里是ATM22k行),
以及本届会议的历史
Get-History | Format-List -Property *Id : 88
CommandLine : get-help Get-History -online
ExecutionStatus : Completed
StartExecutionTime : 2018-12-14 16:16:49
EndExecutionTime : 2018-12-14 16:16:49是完全不同的东西。
发布于 2020-07-01 09:59:11
获取历史记录访问PowerShell历史记录(仅用于当前会话)。
PSReadLine使用自己的历史记录(在内存中,并保存在(Get-PSReadLineOption).HistorySavePath中)。使用PSReadLine输入的命令(通常)在输入时会附加到历史文件中(也可以使用Set-PSReadLineOption -HistorySaveStyle控制这种行为)。然后,各种搜索和导航键可以将任何历史记录条目带到当前命令行。注意,当使用向上箭头或向下箭头访问历史记录时,将跳过来自并发会话(即在当前会话启动后输入的命令)的新命令(设计决策)。然而,这些命令可以使用历史搜索函数(F8、SHIFT-F8、CTRL和CTRL)访问。不幸的是,您无法在搜索后使用向下箭头检索您搜索的命令列表。
如果确实需要使用箭头键从其他会话访问较新的命令,则可以启动一个新会话,但随后将丢失(访问)当前会话中的任何变量(和新输入的函数)。一种解决方案可以是使用export-clixml来传输一些(全部?)变量/函数,方法是创建一个哈希表,按变量/函数的名称键,然后使用import-clixml并在新会话中重新创建由此产生的哈希表中的变量/函数。但是,根据要传输的数据的类型和数量,临时文件可能很大,导出非常慢,而且只能获得可见数据,因此可能会丢失方法(因为它们可以依赖内部隐藏的成员,无法复制)。
另一种办法是在本届会议上简单地重建历史,具体如下:
[Microsoft.Powershell.PSConsoleReadLine]::ClearHistory()
$nulhist=($histfile=(Get-PSReadLineOption).HistorySavePath)+".NUL"
Set-PSReadLineOption -historysavepath $nulhist
(gc -raw $histfile) -split "[^```r]`r?`n" | foreach {[Microsoft.Powershell.PSConsoleReadline]::AddToHistory($_) }
Set-PSReadLineOption -HistorySavePath $histfile
Remove-Item $nulhist我们的想法是清除这个会话的内存历史记录(ClearHistory()不影响历史文件),然后再次添加历史文件的全部内容,确保跨越多行的命令保持完整。需要临时文件,因为添加会话历史记录条目也会将其添加到历史文件中。不幸的是,这也不是特别快,但至少它维护了您的变量。
https://stackoverflow.com/questions/53782159
复制相似问题