以下是一种方法,但它涉及到很多妥协。首先,它仅在 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 删除光标下的当前单词,你可以。