我是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*
我是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*
$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
}
我不认为有一种方法可以做到这一点,但是我可以与您分享我喜欢使用的自定义提示:
function prompt {
$Host.UI.RawUI.WindowTitle = Get-Location
"[$env:COMPUTERNAME] PS> "
}
这将当前计算机名称放置在提示符中(您可能不需要此功能),但将当前路径放置在窗口标题中,特别是对于较长的路径,它们不会妨碍视线并且不会使提示符混乱。
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)
最终,当用户按下回车键时,您需要将组成命令行的所有键传递给控制台(可以使用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删除光标下的当前单词,你也可以这样做。