在 PowerShell 的当前命令行中插入文本

Insert text in current commandline in PowerShell

我的目标是编写一个函数,其行为类似于调用 PsReadline 的 Ctrl-R 功能时发生的情况:在当前命令行插入文本,但不接受该行,因此当函数 returns 光标仍在同一行。我尝试了以下

function Invoke-Foo() {
  [Microsoft.PowerShell.PSConsoleReadLine]::Insert('foo')
}

但是调用这个的时候,结果是:

PS> Invoke-Foo foo
PS> <cursor position>

我想要的是,如果在插入文本后,光标停留在该行上,那么

PS> Invoke-Foo foo<cursor position>

我研究了其他 PSConsoleReadLine 函数(因为我假设它们是自 PsReadline 处理控制台以来的方式?),例如 AddLine/CancelLine/... 但是 none 的组合可以解决问题.起作用的是使用 Set-PSReadlineKeyHandler -Key 'Ctrl+P' -ScriptBlock {Invoke-Foo} 将函数调用为 PsReadline 键处理程序,然后按 Ctrl-P 就可以完成我想要的操作。所以问题可能是:如何连接到 PsReadline 以模拟被调用的函数作为它的键处理程序?

update 解决方案很简单,感谢 Jason 的提示:只需绑定 Enter,如果正在调用 Invoke-Foo,则不要接受该行

function DealWithEnterKey() {
  $line = $null
  $cursor = $null
  [Microsoft.PowerShell.PSConsoleReadline]::GetBufferState([ref]$line, [ref]$cursor)

  if($line -match 'Invoke-Foo') {
    Invoke-Foo
  } else {
    [Microsoft.PowerShell.PSConsoleReadLine]::AcceptLine()
  }
}

Set-PSReadlineKeyHandler -Key 'Enter' -ScriptBlock {DealWithEnterKey}

我认为您需要使用自定义键处理程序或模拟键盘输入。

建议重新绑定回车。如果命令行匹配您的命令,运行 您的命令并替换命令行。如果不是,只需调用 Enter 的正常处理程序。