about_PSReadLine

簡短描述

PSReadLine 在 PowerShell 控制台中提供改良的命令行編輯體驗。

完整描述

PowerShell 7.4 隨附於 PSReadLine 2.3.4。 目前的版本是 PSReadLine 2.3.4。 目前的 PSReadLine 版本可以在 Windows PowerShell 5.1 和更新版本上安裝及使用。 針對某些功能,您必須執行 PowerShell 7.2 或更高版本。

PSReadLine 為 PowerShell 控制台提供功能強大的命令行編輯體驗。 提供:

  • 命令行的語法著色
  • 語法錯誤的視覺指示
  • 更好的多行體驗(編輯和歷程記錄)
  • 可自定義的按鍵系結
  • Cmd 和 Emacs 模式
  • 許多組態選項
  • Bash 樣式完成(在 Cmd 模式中為選擇性,預設為 Emacs 模式)
  • 埃馬克斯洋克/殺環
  • 以 PowerShell 令牌為基礎的“word” 移動和刪除
  • 預測性 IntelliSense
  • 控制台中說明的動態顯示,而不會遺失命令行上的位置

PSReadLine 需要 PowerShell 5.1 或更新版本。 PSReadLine 適用於預設的 Windows 主機、Windows 終端機 和 Visual Studio Code。 無法在 Windows PowerShell ISE 中使用。

PSReadLine 可以從 PowerShell 資源庫 安裝。 若要在支援的 PowerShell 版本中安裝 PSReadLine,請執行下列命令。

Install-Module -Name PSReadLine -AllowClobber -Force

注意

從 PowerShell 7.0 開始,如果偵測到螢幕助讀程式程式,PowerShell 會略過 Windows 上的自動載入 PSReadLine。 目前,PSReadLine 不適用於螢幕助讀程式。 Windows 上 PowerShell 7.0 的預設轉譯和格式設定可正常運作。 您可以視需要手動載入模組。

預測性 IntelliSense

預測性 IntelliSense 是索引標籤完成的概念,可協助用戶順利完成命令。 它可讓使用者根據使用者歷程記錄和其他網域特定外掛程式的比對預測來探索、編輯和執行完整命令。

啟用預測性 IntelliSense

預設會停用預測性 IntelliSense。 若要啟用預測,只要執行下列命令:

Set-PSReadLineOption -PredictionSource History

PredictionSource 參數也可以接受網域特定和自定義需求的外掛程式。

若要停用預測性 IntelliSense,請直接執行:

Set-PSReadLineOption -PredictionSource None

注意

根據預設,PSReadLine 2.2.6 會啟用預測性 IntelliSense。 如需詳細資訊,請參閱下方附注一節中的 PSReadLine 版本歷程記錄

自定義索引鍵系結

PSReadLine 支援使用 Cmdlet 的 Set-PSReadLineKeyHandler 自定義金鑰系結。 大部分的自定義索引鍵系結都會呼叫其中一個可系結的 函式,例如

Set-PSReadLineKeyHandler -Key UpArrow -Function HistorySearchBackward

您可以將 ScriptBlock 系結至金鑰。 ScriptBlock 幾乎可以執行任何您想要的動作。 一些有用的範例包括

  • 編輯命令行
  • 開啟新視窗 (例如說明)
  • 變更目錄而不變更命令行

ScriptBlock 會收到兩個自變數:

  • $key - [ ConsoleKeyInfo] 物件,該對像是觸發自定義系結的索引鍵。 如果您將相同的 ScriptBlock 系結至多個索引鍵,而且需要根據金鑰執行不同的動作,您可以檢查 $key。 許多自定義系結會忽略這個自變數。

  • $arg - 任意自變數。 這通常是使用者從 Key Bindings DigitArgument 傳遞的整數自變數。 如果您的系結不接受自變數,則忽略這個自變數是合理的。

讓我們看看將命令行新增至歷程記錄的範例,而不執行它。 當您意識到忘記執行某些動作,但不想重新輸入您已輸入的命令行時,這會很有用。

$parameters = @{
    Key = 'Alt+w'
    BriefDescription = 'SaveInHistory'
    LongDescription = 'Save current line in history but do not execute'
    ScriptBlock = {
      param($key, $arg)   # The arguments are ignored in this example

      # GetBufferState gives us the command line (with the cursor position)
      $line = $null
      $cursor = $null
      [Microsoft.PowerShell.PSConsoleReadLine]::GetBufferState([ref]$line,
        [ref]$cursor)

      # AddToHistory saves the line in history, but does not execute it.
      [Microsoft.PowerShell.PSConsoleReadLine]::AddToHistory($line)

      # RevertLine is like pressing Escape.
      [Microsoft.PowerShell.PSConsoleReadLine]::RevertLine()
  }
}
Set-PSReadLineKeyHandler @parameters

您可以在安裝於 PSReadLine 模組資料夾中的 檔案SamplePSReadLineProfile.ps1中看到更多範例。

大部分的按鍵系結會使用一些協助程式函式來編輯命令行。 這些 API 記載於 about_PSReadLine_Functions

備註

命令歷程記錄

PSReadLine 會維護歷程記錄檔,其中包含您從命令行輸入的所有命令和數據。 歷程記錄檔是名為的 $($host.Name)_history.txt檔案。 在 Windows 系統上,歷程記錄檔會儲存在 $env:APPDATA\Microsoft\Windows\PowerShell\PSReadLine。 在非 Windows 系統上,記錄檔會儲存在 $env:XDG_DATA_HOME/powershell/PSReadLine$env:HOME/.local/share/powershell/PSReadLine

歷程記錄可以包含機密數據,包括密碼。 PSReadLine 會嘗試篩選掉敏感性資訊。 任何包含下列字串的命令行都不會寫入歷程記錄檔。

  • password
  • asplaintext
  • token
  • apikey
  • secret

PSReadLine 2.2.0 可改善敏感數據的篩選

  • 使用剖析命令行的PowerShell抽象語法樹狀結構 (AST) 來尋找敏感數據。
  • 使用 SecretManagement 模組中安全 Cmdlet 的允許清單,允許將這些命令新增至歷程記錄。 allowlist 包含:
    • Get-Secret
    • Get-SecretInfo
    • Get-SecretVault
    • Register-SecretVault
    • Remove-Secret
    • Set-SecretInfo
    • Set-SecretVaultDefault
    • Test-SecretVault
    • Unlock-SecretVault
    • Unregister-SecretVault

例如,允許將下列命令寫入歷程記錄檔:

Get-Secret PSGalleryApiKey -AsPlainText # Get-Secret is in the allowlist
$token = Get-Secret -Name github-token -Vault MySecret
[MyType]::CallRestAPI($token, $url, $args)
$template -f $token

下列命令不會寫入歷程記錄檔:

$token = 'abcd' # Assign expr-value to sensitive variable name.
Set-Secret abc $mySecret # Set-Secret is not in the allowlist.
ConvertTo-SecureString stringValue -AsPlainText # '-AsPlainText' is an alert.
Invoke-WebRequest -Token xxx # Expr-value as argument to '-Token'.
Get-ResultFromTwo -Secret1 (Get-Secret -Name blah -AsPlainText) -Secret2 sdv87ysdfayf798hfasd8f7ha # '-Secret2' has expr-value argument.

如果您還有其他命令不想寫入歷程記錄檔,您可以使用 Cmdlet 的 Set-PSReadLineOption AddToHistoryHandler 參數。 如需如何使用 AddToHistoryHandler 的範例,請參閱 Set-PSReadLineOption範例 7。

PSReadLine 2.3.4 可改善敏感數據的篩選

已改善預設敏感性歷程記錄清除,以允許歷程記錄包含安全屬性存取。

當敏感性字串是屬性存取的一部分時:

  • 如果此成員存取作業不屬於指派的一部分,我們會將其視為安全
  • 否則,如果右側是管線或變數,我們也將其視為安全

例如,下列使用案例會被視為安全,而且可以儲存至歷程記錄。

$a.Secret = Get-Secret -Name github-token -Vault MySecret
$a.Secret = $secret
$a.Password.Secret | Set-Value
$token = (Get-AzAccessToken -ResourceUrl 'https://app.contoso.com').Token

此版本也改善了敏感性歷程記錄清除,以允許使用 azgcloudkubectl 命令行工具來擷取令牌。

例如,下列使用案例會被視為安全,而且可以儲存至歷程記錄。

kubectl get secrets
kubectl get secret db-user-pass -o jsonpath='{.data.password}' | base64 --decode
kubectl describe secret db-user-pass
az account get-access-token --resource=https://app.contoso.com --query accessToken --output tsv
$env:PGPASS = gcloud auth print-access-token

PSReadLine 發行歷程記錄

自 Windows PowerShell 5.1 隨附的版本以來,PSReadLine 有許多更新。

  • 目前的版本是 PSReadLine 2.3.4
  • PowerShell 7.4 隨附於 PSReadLine 2.3.4
  • PowerShell 7.3 隨附於 PSReadLine 2.2.6
  • PowerShell 7.2 隨附於 PSReadLine 2.1.0
  • 隨附於 PSReadLine 2.0.4 的 PowerShell 7.0.11
  • PowerShell 5.1 隨附於 PSReadLine 2.0.0

如需變更的完整清單,請參閱 PSReadLine ChangeLog

  • PSReadLine 2.3.4

除了數個錯誤修正之外,此版本還包含下列增強功能:

  • 適用於預測性 IntelliSense 的可捲動 ListView

    • 根據終端機視窗的大小自動調整大小
    • 最多可以包含 50 個預測結果
    • 顯示結果數目和目前預測來源的動態清單標頭
  • 改善敏感性歷程記錄清除,以允許從 azgcloud和 擷取令牌 kubectl

  • 改善默認敏感性歷程記錄清除以允許安全屬性存取

  • 已新增對縮小字組、縮小大小寫及大寫的支援

  • 讓索引標籤完成顯示只 ListItemText 依大小寫而不同的結果

  • 支援 VI 編輯模式中的 text-object 命令<d,i,w>

  • 將內嵌預測的預設色彩變更為暗色

  • 將範例新增至自述檔,以將 Unicode 程式代碼點轉換成 Unicode char by Alt+x

  • 在 Windows 上新增 TerminateOrphanedConsoleApps 選項,以終止孤立的控制台附加程式,這可能會使控制台輸入的讀取混亂

  • PSReadLine 2.2.6

    在此版本中,根據下列條件,預設會啟用預測性 IntelliSense 功能:

    • 如果支援虛擬終端機 (VT),且在 PowerShell 7.2 或更高版本中執行的 PSReadLine,PredictionSource 會設定為HistoryAndPlugin
    • 如果支援 VT,且 PSReadLine 在 7.2 之前於 PowerShell 中執行, PredictionSource 會設定為 History
    • 如果不支援 VT,PredictionSource 會設定為None
  • PSReadLine 2.2.5

    具有次要錯誤修正的正式服務版本。

  • PSReadLine 2.2.2

    • PSReadLine 新增了兩個新的預測性 IntelliSense 功能:
      • 新增 PredictionViewStyle 參數,以允許選取新的 ListView
      • 連線 PSReadLine 至CommandPredictionPowerShell 7.2 中引進的 API 可讓用戶匯入可轉譯自定義來源建議的預測工具模組。
    • 已更新為使用 1.0.0 版 Microsoft.PowerShell.Pager 的 動態說明
    • 已改善敏感性歷程記錄專案的清除
    • 許多錯誤修正和較小的改進
  • PSReadLine 2.1.0

    此版本會匯總自 2.0.4 版之後新增的下列增強功能:

    • 從命令歷程記錄新增預測性 IntelliSense 建議
    • 許多錯誤修正和 API 增強功能
  • PSReadLine 2.0.4

    此版本會匯總自 2.0.0 版之後新增的下列增強功能:

    • -Chord已將 參數新增至 Get-PSReadLineKeyHandler 以允許搜尋特定索引鍵系結

意見反應和參與 PSReadLine

GitHub 上的 PSReadLine

歡迎在 GitHub 頁面上提交提取要求或提交意見反應。

另請參閱

  • PSReadLine 受到 GNU 讀線 連結庫的嚴重影響。