簡體   English   中英

Powershell如何在按鍵上進行快速更改?

[英]Powershell how to make the prompt change on key press?

我是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*

這不是一個超級優雅的解決方案,但它基本上將Ctrl + Alt + R轉換為熱鍵以顯示當前目錄。 您可以將和弦更改為“Ctrl + R”,但是您將覆蓋PowerShell的默認PSReadlineKeyHandler。 看起來它會卡在命令上,但是如果你開始鍵入,則會出現下一行。 您需要將這兩者添加到位於$env:USERPROFILE\\Documents\\WindowsPowershell\\ Microsoft.Powershell_Profile.ps1 $env:USERPROFILE\\Documents\\WindowsPowershell\\

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> "
}

這會將當前計算機名稱放在提示符中(您可能不需要這樣做),但是將當前路徑放在窗口標題中,其中長路徑特別是不在路上並且不會使提示混亂。

以下是一種方法,但它涉及很多妥協。 首先它只在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將一個鍵發送到控制台,以防止char被“吃掉” ”。 這樣你就可以得到20行腳本而不是幾百行,代價是ctrl-r僅在鍵入任何字符之前工作。

另一個復雜因素。 readkey()允許您同時獲得向下和向上鍵擊。 因此,只要按下ctrl-r中的'r',就可以顯示完整路徑。 但是,您的腳本需要了解其他位置的向上/向下鍵擊。 這可能就像忽略向下擊鍵一樣簡單。

這有一個好的方面。 您可以在PS通常執行的范圍之外實現密鑰處理功能。 因此,如果你想讓ctrl-t顯示當前時間,你可以這樣做。 如果你想讓ctrl-w刪除光標下的當前單詞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM