【问题标题】:Powershell how to make the prompt change on key press?Powershell如何在按键时进行提示更改?
【发布时间】:2015-08-09 02:52:42
【问题描述】:

我是 Powershell 新手。我正在尝试创建自己的自定义提示,该提示显示当前目录的截断版本,除非您通过按 CTRL + R 将其展开。此外,我想这样做:

$short\dir\path...>
*user presses CTRL+R*
$really\really\long\full\dir\path>
*Full dir path is shown as long as CTLR + R is held down*

【问题讨论】:

    标签: .net windows powershell command-line


    【解决方案1】:

    这不是一个超级优雅的解决方案,但它基本上将 Ctrl + Alt + R 变成了显示当前目录的热键。您可以将和弦更改为“Ctrl+R”,但您将覆盖 powershell 的默认 PSReadlineKeyHandler。看起来它卡在命令上,但是如果您开始输入,则会出现下一行。您需要将这两个都添加到位于$env:USERPROFILE\Documents\WindowsPowershell\Microsoft.Powershell_Profile.ps1

    function prompt {
        if(($pwd | split-path -Parent | Split-Path -Leaf) -match ':')
        {
            "$pwd\>"
        }
        elseif (($pwd | Split-Path -Leaf) -match ':')
        {
            "$pwd>"
        }
        else {
            "...\$($pwd | split-path -Parent | Split-Path -Leaf)\$($pwd | Split-path -Leaf)\>"
        }
    }
    
    Set-PSReadlineKeyHandler -Chord "Ctrl+Alt+R" -ScriptBlock {
        write-host $pwd -nonewLine
    }
    

    希望对您有所帮助!

    【讨论】:

      【解决方案2】:

      我认为没有办法做到这一点,但我可以与您分享一个我喜欢使用的自定义提示:

      function prompt {
          $Host.UI.RawUI.WindowTitle = Get-Location
          "[$env:COMPUTERNAME] PS> "
      }
      

      这会将当前计算机名称放在提示符中(您可能不需要这样做),但会将当前路径放在窗口标题中,特别是长路径不会妨碍提示符。

      【讨论】:

        【解决方案3】:

        以下是一种方法,但它涉及到很多妥协。首先,它仅在 PS 控制台中工作,而不是在 ISE 中,或者不在任何托管 PS 的应用程序中。其次,这将涉及大量工作,具体取决于您希望体验如何“流畅”。第三,它可能会导致其他意想不到的事情发生。

        基本上,您为提示函数编写一个脚本,该函数轮询键盘以查找 Ctrl-R 或任何其他“动作”字符。 “动作”字符是指诸如回车、制表符、退格、向上箭头、向下箭头等导致某些事情发生的东西。如果脚本看到 Ctrl-R,那么您可以在标题栏中或控制台中输出完整路径。如果您将其输出到控制台,那么您的脚本将必须确定控制台的哪一行包含当前提示。 Rawui 成员包含此信息。

        一个简单的轮廓可能看起来像:

          do {
            sleep -milli 250
            if ($host.ui.rawui.keyavailable) {
              $key = $host.ui.rawui.readkey()
              if ($key.character -eq [char]'x') {
                write-host burp
              } else { break}
            }
          } while ($true)
        

        脚本每四分之一秒查看一个密钥是否可用。如果是这样,它会读取密钥。如果键是'x'(你用ctrl-r),它会输出“burp”。但是您会将“burp”更改为完整路径,以及将消息放在正确位置(标题栏或控制台上的右行)的逻辑。

        如果键不是“x”,那么这个简单的例子就会返回。这意味着“x”被“吃掉”并且“x”功能在输出下一个提示之前不再起作用。但是,您可以自己处理所有“操作”键而不是返回。如果按下向上箭头,您将检索上一个命令并将其输出到控制台。如果按下后退箭头,您将删除光标之前的字符。如果按下选项卡,您必须与 PS 的内置命令完成进行交互(不确定这是否可能)。等等。

        最终当用户按下回车键时,您需要将构成命令行的所有键提供给控制台(您可以使用 WScript 主机的 SendKeys 方法),或者您可以直接从你提示功能,使用 Invoke-Expression (iex)。如果您使用 iex,PS 保留的命令历史记录(即 get-history)将不起作用,除非您想出一种方法来处理它(可能是 Add-History?)。如果您使用 SendKeys,那么快速打字的人可能会在他的击键中穿插 SendKeys。

        作为一种折衷方案,您可以在按下除 ctrl-r 之外的键时退出提示,而不是自己处理所有“操作”键,并使用 SendKeys 将该键发送到控制台,以防止字符被“吃掉”。这样一来,您可能只需要 20 行脚本而不是几百行,代价是 ctrl-r 只能在输入任何字符之前工作。

        另一个并发症。 readkey() 确实允许您向下和向上击键。因此,只要按下 ctrl-r 中的“r”,您就可以显示完整路径。但是,您的脚本需要了解其他地方的向上/向下击键。这可能就像忽略向下击键一样简单。

        这有一个光明的一面。您可以在 PS 通常执行的操作之外实现键处理功能。因此,如果您希望 ctrl-t 显示当前时间,您可以这样做。如果你想让 ctrl-w 删除光标下的当前单词,你可以。

        【讨论】:

          猜你喜欢
          • 2016-12-10
          • 1970-01-01
          • 2013-04-02
          • 1970-01-01
          • 1970-01-01
          • 2013-06-13
          • 2022-01-25
          • 2020-03-14
          相关资源
          最近更新 更多