首页 > 解决方案 > 是否有写入提示缓冲区的命令/程序/Cmdlet?

问题描述

我正在尝试查看是否可以将命令的输出写入提示缓冲区以允许进一步编辑?像这样,Write-PromptBuffer所需的命令在哪里:

PS C:\> echo "foo bar" | Write-PromptBuffer
PS C:\> foo bar

相当于 zsh 所做的事情print -z(参见http://zsh.sourceforge.net/Guide/zshguide03.html

我这样做的主要动机是:

PS C:\> Get-Content (Get-PSReadLineOption).HistorySavePath | fzf

这会将选定的(用fzf术语接受的)条目“转储”为提示符中的可编辑命令。

(注意:我很熟悉PSFzf,但我正在尝试找到一个通用命令来执行此操作,因为我还有其他可以从中受益的用例)

标签: powershell

解决方案


PSReadLine 模块可以插入缓冲区,例如

[Microsoft.PowerShell.PSConsoleReadLine]::Insert("foo bar")

但是,因为这是为了编辑当前行缓冲区而不是下一行,所以你需要这样做

#pipeline to variable $myBuffer function
function Write-PromptBuffer {
    param (  
        [parameter(ValueFromPipeline, ValueFromRemainingArguments = $true)]
        $global:myBuffer
        )
}
#Add a PSReadLineKeyHandler to insert $myBuffer
Set-PSReadLineKeyHandler -Key Alt+x `
    -ScriptBlock {
    param($key, $arg)   # The arguments are ignored in this example
    #write to buffer
    [Microsoft.PowerShell.PSConsoleReadLine]::Insert($myBuffer)
}

现在用一个字符串填充 $myBuffer 并用 Alt+w 调用它

PS C:\> echo "foo bar" | Write-PromptBuffer
PS C:\> foo bar

或者不漂亮,你可以使用 SendKeys

function Write-PromptBuffer {
    param (  
        [parameter(ValueFromPipeline, ValueFromRemainingArguments = $true)]
        $myBuffer
        )
    (new-object -com wscript.shell).SendKeys($myBuffer)
}

希望这可以帮助,


推荐阅读