在PowerShell

时间:2017-05-02 08:02:25

标签: powershell psreadline

我的目标是编写一个函数,该函数与调用PsReadline的Ctrl-R功能时的行为类似:在当前命令行中插入文本,但不接受该行,这样当函数返回光标仍在同一行。我尝试了以下

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 / ...但是没有一个组合可以解决这个问题。使用Set-PSReadlineKeyHandler -Key 'Ctrl+P' -ScriptBlock {Invoke-Foo}将函数作为PsReadline键处理函数调用然后按Ctrl-P完成我想要的工作是什么。所以问题可能是:如何挂钩到PsReadline来模仿被调用的函数作为它的关键处理程序?

更新解决方案非常简单,感谢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}

1 个答案:

答案 0 :(得分:1)

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

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