简短说明
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 标记的“单词”移动和删除
- 预测 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 默认禁用。 若要启用预测,只需运行以下命令:
Set-PSReadLineOption -PredictionSource History
PredictionSource 参数还可以接受用于特定领域和自定义需求的插件。
若要禁用预测性 IntelliSense,只需运行:
Set-PSReadLineOption -PredictionSource None
注释
预测 IntelliSense 在 PSReadLine 2.2.6 中默认启用。 有关详细信息,请参阅下面的 Notes 部分中的 PSReadLine 版本历史记录。
自定义键绑定
PSReadLine 支持使用 Set-PSReadLineKeyHandler cmdlet 的自定义密钥绑定。 例如,大多数自定义键绑定都会调用可绑定函数之一
Set-PSReadLineKeyHandler -Key UpArrow -Function HistorySearchBackward
可以将 ScriptBlock 绑定到密钥。 ScriptBlock 几乎可以执行所需的任何操作。 一些有用的示例包括
- 编辑命令行
- 打开新窗口(例如帮助)
- 更改目录而不更改命令行
ScriptBlock 接收两个参数:
$key- 一个 [ConsoleKeyInfo] 对象,它是触发自定义绑定的键。 如果将同一 ScriptBlock 绑定到多个密钥,并且需要根据密钥执行不同的操作,则可以检查$key。 许多自定义绑定忽略此参数。$arg- 任意参数。 通常,这将是用户从键绑定 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 模块文件夹中安装的文件 中看到更多示例。
大多数键绑定使用一些帮助程序函数来编辑命令行。 这些 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 尝试筛选出敏感信息。 包含以下字符串的任何命令行不会写入历史记录文件。
passwordasplaintexttokenapikeysecret
PSReadLine 2.2.0 改进了敏感数据的筛选
- 使用已分析命令行的 PowerShell 抽象语法树(AST)查找敏感数据。
- 使用 SecretManagement 模块中的安全 cmdlet 允许列表来允许将这些命令添加到历史记录中。 允许列表包含:
Get-SecretGet-SecretInfoGet-SecretVaultRegister-SecretVaultRemove-SecretSet-SecretInfoSet-SecretVaultDefaultTest-SecretVaultUnlock-SecretVaultUnregister-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的示例,请参阅 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
该版本还改进了敏感历史记录清理,以允许使用 az、gcloud和 kubectl 命令行工具检索令牌。
例如,以下用例被视为安全,可以保存到历史记录中。
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 版
除了几个 bug 修复之外,此版本还包括以下增强功能:
用于预测 IntelliSense 的可滚动 ListView
- 根据终端窗口的大小自动调整大小
- 最多可以包含 50 个预测结果
- 显示结果数和当前预测源的动态列表标头
改进了敏感历史记录清理,以允许从
az、gcloud和kubectl检索令牌改进默认敏感历史记录清理以允许安全属性访问
添加了对单词大写转换、小写转换和大写的支持
使选项卡完成显示其
ListItemText仅大小写不同的结果在 VI 编辑模式下支持文本对象命令
<d,i,w>将内联预测的默认颜色更改为暗色
将示例添加到 README,以便通过
Alt+x将 Unicode 代码点转换为 Unicode char在 Windows 上添加 TerminateOrphanedConsoleApps 选项,以终止孤立的控制台附加进程,这些进程可能会弄乱从控制台输入读取
PSReadLine 2.2.6 版
在此版本中,默认情况下会启用预测 IntelliSense 功能,具体取决于以下条件:
- 如果支持虚拟终端(VT),并且 PSReadLine 在 PowerShell 7.2 或更高版本中运行,则 PredictionSource 设置为
HistoryAndPlugin - 如果支持 VT,并且 PSReadLine 在 7.2 之前在 PowerShell 中运行,则 PredictionSource 设置为
History - 如果 VT 不受支持,PredictionSource 会被设置为
None
- 如果支持虚拟终端(VT),并且 PSReadLine 在 PowerShell 7.2 或更高版本中运行,则 PredictionSource 设置为
PSReadLine 版本 2.2.5
官方维护版本,修复了一些小错误。
PSReadLine 2.2.2
- PSReadLine 添加了两个新的预测性 IntelliSense 功能:
- 添加了参数 PredictionViewStyle,以允许选择新的
ListView。 - 将 PSReadLine 连接到 PowerShell 7.2 中引入的
CommandPredictionAPI,以允许用户导入可从自定义源呈现建议的预测器模块。
- 添加了参数 PredictionViewStyle,以允许选择新的
- 已更新为使用 1.0.0 版本的
Microsoft.PowerShell.Pager来获取动态帮助 - 改进了敏感历史记录项的清理
- 大量的 bug 修复和较小的改进
- PSReadLine 添加了两个新的预测性 IntelliSense 功能:
PSReadLine 2.1.0 版本
此版本汇总了自 2.0.4 版本以来添加的以下增强功能:
- 从命令历史记录添加预测性 IntelliSense 建议
- 许多错误修复和 API 改进
PSReadLine 2.0.4 版本
此版本汇总了自 2.0.0 版本以来添加的以下增强功能:
-
-Chord添加了参数 toGet-PSReadLineKeyHandler以允许搜索特定的键绑定
-
反馈和 PSReadLine 贡献
您可以随时在 GitHub 页面上提交拉取请求或反馈意见。
另请参阅
- PSReadLine 深受 GNU readline 库的影响。