about_PSReadLine

简短说明

PSReadLine 在 PowerShell 控制台中提供了改进的命令行编辑体验。

详细说明

PowerShell 7.3 随 PSReadLine 2.2.6 一起提供。 当前版本为 PSReadLine 2.3.4。 可以在 Windows PowerShell 5.1 及更新版本上安装并使用 PSReadLine 的当前版本。 对于某些功能,需要运行 PowerShell 7.2 或更高版本。

PSReadLine 为 PowerShell 控制台提供强大的命令行编辑体验。 提供以下功能:

  • 命令行的语法着色
  • 语法错误的可视指示
  • 更好的多行体验 (编辑和历史记录)
  • 可自定义的键绑定
  • Cmd 和 Emacs 模式
  • 许多配置选项
  • Bash 样式完成在 Cmd 模式下 (可选,在 Emacs 模式下默认)
  • Emacs 洋克/杀环
  • 基于 PowerShell 令牌的“word”移动和删除
  • 预测 IntelliSense
  • 在控制台中动态显示“帮助”,而不会在命令行上失去位置

PSReadLine 需要 PowerShell 5.1 或更高版本。 PSReadLine 适用于默认的 Windows 控制台主机、Windows 终端和Visual Studio Code。 它不适用于WINDOWS POWERSHELL ISE。

可以从PowerShell 库安装 PSReadLine。 若要在受支持的 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 绑定 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

可以在 文件 中看到 SamplePSReadLineProfile.ps1更多示例,该文件安装在 PSReadLine 模块文件夹中。

大多数键绑定使用一些帮助程序函数来编辑命令行。 这些 API 记录在 about_PSReadLine_Functions 中。

备注

命令历史记录

PSReadLine 维护一个历史记录文件,其中包含从命令行输入的所有命令和数据。 历史记录文件是名为 的文件 $($host.Name)_history.txt。 在 Windows 系统上,历史记录文件存储在 。$env:APPDATA\Microsoft\Windows\PowerShell\PSReadLine 在非 Windows 系统上,历史记录文件存储在 或 $env:HOME/.local/share/powershell/PSReadLine$env:XDG_DATA_HOME/powershell/PSReadLine

历史记录可以包含敏感数据,包括密码。 PSReadLine 尝试筛选出敏感信息。 包含以下字符串的任何命令行不会写入历史记录文件。

  • password
  • asplaintext
  • token
  • apikey
  • secret

PSReadLine 2.2.0 改进了敏感数据的筛选

  • 使用 PowerShell 抽象语法树 (分析的命令行的 AST) 来查找敏感数据。
  • 使用 SecretManagement 模块中安全 cmdlet 的允许列表,以允许将这些命令添加到历史记录中。 允许列表包含:
    • 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-PSReadLineOptionAddToHistoryHandler 参数。 有关如何使用 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 一起提供
  • PowerShell 7.0.11 随 PSReadLine 2.0.4 一起提供
  • PowerShell 5.1 随 PSReadLine 2.0.0 一起提供

有关更改的完整列表,请参阅 PSReadLine ChangeLog

  • PSReadLine 2.3.4

除了几个 bug 修复外,此版本还包括以下增强功能:

  • 用于预测 IntelliSense 的可滚动 ListView

    • 根据终端窗口的大小自动调整大小
    • 最多可以包含 50 个预测结果
    • 显示结果数和当前预测源的动态列表标头
  • 改进了敏感历史记录清理,允许从 azgcloud和 检索令牌 kubectl

  • 改进默认敏感历史记录清理以允许安全访问属性

  • 添加了对“文本”、“下写”和“大写”字的支持

  • 使 Tab 自动补全显示结果,这些 ListItemText 结果仅因大小写而异

  • 支持 VI 编辑模式下的文本对象命令<d,i,w>

  • 将内联预测的默认颜色更改为变暗

  • 将示例添加到自述文件,以便通过 将 Unicode 码位转换为 Unicode char Alt+x

  • 在 Windows 上添加 TerminateOrphanedConsoleApps 选项,以终止孤立的控制台附加进程,这些进程可能会使主机输入读取混乱

  • PSReadLine 2.2.6

    在此版本中,预测 IntelliSense 功能默认启用,具体取决于以下条件:

    • 如果支持虚拟终端 (VT) ,并且 PSReadLine 在 PowerShell 7.2 或更高版本中运行, 则 PredictionSource 设置为 HistoryAndPlugin
    • 如果支持 VT,并且 PSReadLine 在 7.2 之前的 PowerShell 中运行, 则 PredictionSource 设置为 History
    • 如果不支持 VT,则 PredictionSource 设置为 None
  • PSReadLine 2.2.5

    带有小 bug 修复的官方服务版本。

  • PSReadLine 2.2.2

    • PSReadLine 添加了两个新的预测 IntelliSense 功能:
      • 添加了 PredictionViewStyle 参数以允许选择新的 ListView
      • 已将 PSReadLine 连接到 CommandPrediction PowerShell 7.2 中引入的 API,以允许用户导入可呈现来自自定义源的建议的预测器模块。
    • 更新为使用 的 1.0.0 版本 Microsoft.PowerShell.Pager 获取动态帮助
    • 改进了敏感历史记录项的清理
    • 大量 bug 修复和较小的改进
  • PSReadLine 2.1.0

    此版本汇总了自 2.0.4 版本以来添加的以下增强功能:

    • 从命令历史记录添加预测 IntelliSense 建议
    • 许多 bug 修复和 API 增强功能
  • PSReadLine 2.0.4

    此版本汇总了自 2.0.0 版本以来添加的以下增强功能:

    • -Chord向 添加了 参数Get-PSReadLineKeyHandler,以允许搜索特定键绑定

为 PSReadLine 做出贡献 & 反馈

GitHub 上的 PSReadLine

可随时在 GitHub 页面上提交拉取请求或提交反馈。

另请参阅

  • PSReadLine 受到 GNU 读行 库的严重影响。