共用方式為


about_PSReadLine

簡短描述

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

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

  • v2.3.5 首先隨附於 PowerShell 7.4.2 和 7.5.0-preview.3
  • v2.3.4 首次隨附於 PowerShell 7.4.0-rc.1
  • v2.2.6 首次隨附於 PowerShell 7.3.0
  • v2.1.0 首次隨附於 PowerShell 7.2.5
  • v2.0.4 第一次隨附於 PowerShell 7.0.11
  • v2.0.0 隨附於 Windows PowerShell 5.1

如需版本差異的詳細資訊,請參閱 about_PSReadLine_Release_Notes

完整描述

目前的 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 支援使用 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

GitHub 上的 PSReadLine

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

另請參閱

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