Powershell如何在按键时更改提示符?

6

我是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*
3个回答

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
}

希望这有所帮助!

0

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

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

这将当前计算机名称放置在提示符中(您可能不需要此功能),但将当前路径放置在窗口标题中,特别是对于较长的路径,它们不会妨碍视线并且不会使提示符混乱。


0
以下是一种方法,但它涉及很多妥协。首先,它只能在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”功能直到下一个提示输出才能再次使用。但是,您可以代替返回处理所有“操作”键。如果按上箭头,则会检索上一个命令并将其输出到控制台。如果按下箭头,则会删除光标前面的字符。如果按Tab,则必须与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删除光标下的当前单词,你也可以这样做。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接