如果我的上一个命令是类似'dir'的命令,那么invoke-history似乎可以正常工作。如果我的上一个命令是'vim $ profile'之类的东西,invoke-history将显示该命令并挂起。有没有什么办法解决这一问题?我在Powershell中进行的许多工作都涉及编辑脚本然后运行它……这已成为一个巨大的问题。
从Windows PowerShell 5.1 / PowerShell [Core] 7.0起,它看起来像一个bug:
程序,诸如vim
依赖于能够打印到终端(控制台)直接,无PowerShell的作为中介。
通过直接调用,这可以按预期工作。
通过via调用时Invoke-History
,PowerShell似乎确实将其自身插入vim
到终端之间,从而导致vim
故障:
Invoke-History: Vim: Warning: Output is not to a terminal
发出错误。vim
UI并没有出现,即使vim
是运行,通过的事实,您可以键入证明:q
,然后Enter退出。该错误已在GitHub问题中报告。
解决方法:
您可以滚动自己的Invoke-History
函数以放置在$PROFILE
文件中,该文件从历史记录中手动检索并执行上一个命令:
function Invoke-History {
[CmdletBinding(SupportsShouldProcess)]
param(
[string] $Id = (Get-History -Count 1).Id
)
$cmd = if ($Id -as [long]) {
(Get-History -ErrorAction Stop -Id $Id).CommandLine
} else {
(Get-History).Where({ $_.CommandLine.TrimStart() -match ('^' + [regex]::Escape($Id)) }, 'Last').CommandLine
}
if (-not $cmd) { Throw "Cannot locate the history for command line $Id" }
if ($PSCmdlet.ShouldProcess($cmd)) {
# Note: Invoke-Expression is safe to use here, but
# should generally be avoided.
Invoke-Expression $cmd
}
}
注意:内置r
和ihy
别名将自动调用自定义函数而不是cmdlet,因为函数比cmdlet具有更高的命令查找优先级。
或者,使用其他方式从历史记录中执行命令:
键入#
,然后输入以下内容之一:
Id
),如所示Get-History
,然后按Tab显示该命令。使用PSReadLine
的ReverseSearchHistory
功能,Ctrl-R默认情况下绑定到组合键:
注意:从PowerShell 7.0开始,只有该PSReadLine
方法基于后者的持久性跨会话历史记录;该#
方法仅知道当前会话中的命令。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句