about_ANSI_Terminals
简短说明
介绍 PowerShell 中可用于 ANSI 转义序列的支持。
长说明
PowerShell 具有许多功能,支持使用 ANSI 转义序列来控制托管 PowerShell 的终端应用程序中的输出呈现。
PowerShell 7.2 添加了新的自动变量 $PSStyle
,并对 PowerShell 引擎进行了更改,以支持 ANSI 修饰文本的输出。
ANSI 终端支持
ANSI 功能旨在与基于 xterm 的终端兼容。 有关详细信息,请参阅维基百科中的 xterm。
在 Windows 10 及更高版本上,Windows 控制台主机与 xterm 兼容。 Windows 终端应用程序也与 xterm 兼容。
在 macOS 上,默认终端应用程序与 xterm 兼容。
对于 Linux,每个发行版都附带不同的终端应用程序。 请查阅发行版的文档以找到合适的终端应用程序。
$PSStyle
该变量具有以下属性:
- Reset - 关闭所有修饰
- Blink - 打开闪烁
- BlinkOff - 关闭闪烁
- Bold - 打开粗体
- BoldOff - 关闭粗体
- Dim - 打开 Dim(在 PowerShell 7.4 中添加)
- DimOff - 关闭 Dim(在 PowerShell 7.4 中添加)
- Hidden - 打开隐藏
- HiddenOff - 关闭隐藏
- Reverse - 打开反转
- ReverseOff - 关闭反转
- Italic - 打开斜体
- ItalicOff - 关闭斜体
- Underline - 打开下划线
- UnderlineOff - 关闭下划线
- Strikethrough - 打开删除线
- StrikethroughOff - 关闭删除线
- OutputRendering - 控制何时使用输出渲染
- Formatting - 控制输出流默认格式的嵌套对象
- Progress - 控制进度条渲染的嵌套对象
- FileInfo - 用于控制 FileInfo 对象着色的嵌套对象。
- Foreground - 用于控制前景着色的嵌套对象
- Background - 用于控制背景着色的嵌套对象
基成员会返回映射到其名称的 ANSI 转义序列的字符串。 值可设置为允许自定义。 例如,可以将粗体更改为加下划线。 属性名称使你能够更轻松地使用 Tab 补全创建修饰字符串:
"$($PSStyle.Background.BrightCyan)Power$($PSStyle.Underline)$($PSStyle.Bold)Shell$($PSStyle.Reset)"
以下成员控制如何或何时使用 ANSI 格式:
$PSStyle.OutputRendering
是一个System.Management.Automation.OutputRendering
枚举,其值包括:ANSI
:转义序列始终按原样传递。重要
将输出重定向到要在下游执行的文件或管道时,应使用 ANSI 模式。 这可以确保不会改变输出。 使用任何其他模式都会通过删除 ANSI 转义序列来改变输出,这可能会改变执行行为。
PlainText
:ANSI 转义序列始终被剥离,因此它只是纯文本。 在远程会话中,如果远程主机设置为PlainText
,则输出会去除 ANSI 转义序列,然后再将其发送回本地客户端。Host
:这是默认行为。 ANSI 转义序列已从重定向或管道输出中删除。 有关详细信息,请参阅重定向输出。
$PSStyle.Background
和$PSStyle.Foreground
成员是包含 16 种标准控制台颜色的 ANSI 转义序列的字符串。Black
BrightBlack
White
BrightWhite
Red
BrightRed
Magenta
BrightMagenta
Blue
BrightBlue
Cyan
BrightCyan
Green
BrightGreen
Yellow
BrightYellow
这些值是可设置的,可以包含任意数量的 ANSI 转义序列。 此外,
FromRgb()
方法可以指定 24 位颜色。 可通过两种方法调用FromRgb()
方法。string FromRgb(byte red, byte green, byte blue) string FromRgb(int rgb)
以下任一示例可将背景色设置为 24 位颜色
Beige
。$PSStyle.Background.FromRgb(245, 245, 220) $PSStyle.Background.FromRgb(0xf5f5dc)
$PSStyle.Formatting
是一个嵌套对象,用于控制调试、错误、详细、警告消息以及列表和表标头的默认格式。 还可以控制粗体和下划线等属性。 它取代了$Host.PrivateData
,作为管理格式化渲染颜色的方式。$Host.PrivateData
继续存在以实现向后兼容性,但不连接到$PSStyle.Formatting
。$PSStyle.Formatting
包括以下成员:- FormatAccent - 列表项的格式设置
- ErrorAccent - 错误元数据的格式设置
- Error - 错误消息的格式设置
- Warning - 警告消息的格式
- Verbose - 详细消息的格式设置
- Debug - 调试消息的格式设置
- TableHeader - 表标头的格式设置
- CustomTableHeaderLabel - 对实际不是对象属性的表标题进行格式设置
- FeedbackName - 反馈提供程序名称的格式设置(在 PowerShell 7.4 中添加为实验性功能)
- FeedbackText - 反馈消息的格式设置(在 PowerShell 7.4 中添加为实验性功能)
- FeedbackAction - 反馈提供程序推荐操作的格式设置(在 PowerShell 7.4 中添加为实验性功能)
$PSStyle.Progress
可以控制进度视图栏呈现。- Style - 设置呈现样式的 ANSI 字符串。
- MaxWidth - 设置视图的最大宽度。 默认为
120
。 最小值为 18。 - View - 具有
Minimal
和Classic
值的枚举。Classic
为现有呈现,无更改。Minimal
为单行最小呈现。Minimal
是默认值。 - UseOSCIndicator - 默认为
$false
。 将此项设置为支持 OSC 指示器的终端$true
。
注意
如果主机不支持虚拟终端,
$PSStyle.Progress.View
会自动设置为Classic
。下面的示例将呈现样式设置为最小进度栏。
$PSStyle.Progress.View = 'Minimal'
$PSStyle.FileInfo
是一个嵌套对象,用于控制 fileInfo 对象的着色。- Directory - 用于指定目录颜色的内置成员
- SymbolicLink - 用于指定符号链接颜色的内置成员
- Executable - 用于指定可执行文件颜色的内置成员。
- Extension - 使用此成员定义不同文件扩展名的颜色。 “扩展”成员预先包括存档和 PowerShell 文件的扩展。
生成 ANSI 输出的 Cmdlet
- markdown cmdlet - Show-Markdown cmdlet 显示包含 markdown 文本的文件的内容。 输出使用 ANSI 序列呈现以表示不同的样式。 可以使用 Get-MarkdownOption 和 Set-MarkdownOption cmdlet 管理样式的定义。
- PSReadLine cmdlet - PSReadLine 模块使用 ANSI 序列对命令行上的 PowerShell 语法元素进行着色。 可以使用 Get-PSReadLineOption 和 Set-PSReadLineOption 管理颜色。
Get-Error
- Get-Error cmdlet 返回 Error 对象的详细视图,并进行格式化以使其更易于阅读。Select-String
- 从 PowerShell 7.0 开始,Select-String 使用 ANSI 序列突出显示输出中的匹配模式。Write-Progress
- ANSI 输出使用$PSStyle.Progress
管理,如上所述。 有关详细信息,请参阅 Write-Progress
在 Host
模式下重定向输出
默认情况下,$PSStyle.OutputRendering
设置为 主机。 ANSI 转义序列已从重定向或管道输出中删除。
OutputRendering 仅适用于主机、Out-File
和 Out-String
中的呈现。 本机可执行文件的输出不受影响。
PowerShell 7.2.6 更改了以下方案中 Out-File
和 Out-String
的行为:
- 当输入对象是纯字符串时,无论 OutputRendering 设置如何,这些 cmdlet 都会保持字符串不变。
- 当输入对象需要应用格式化视图时,这些 cmdlet 会根据 OutputRendering 设置从格式化输出字符串中保留或删除转义序列。
这是这些 cmdlet 与 PowerShell 7.2 相比的重大更改。
OutputRendering 不适用于 PowerShell 主机进程的输出,例如,从命令行运行 pwsh
并重定向输出时。
在以下示例中,PowerShell 在 Linux 上通过 bash
运行。 Get-ChildItem
cmdlet 生成 ANSI 修饰的文本。 由于重定向发生在 bash
进程中,因此在 PowerShell 主机外部,输出不受 OutputRendering 影响。
pwsh -noprofile -command 'Get-Childitem' > out.txt
检查 out.txt
的内容时,会看到 ANSI 转义序列。
相反,当重定向发生在 PowerShell 会话中时,OutputRendering 会影响重定向的输出。
pwsh -noprofile -command 'Get-Childitem > out.txt'
检查 out.txt
的内容时,没有 ANSI 转义序列。
禁用 ANSI 输出
可使用 TERM 或 NO_COLOR 环境变量关闭对 ANSI 转义序列的支持。
以下 $env:TERM
的值按如下方式更改该行为:
dumb
- 设置$Host.UI.SupportsVirtualTerminal = $false
xterm-mono
- 设置$PSStyle.OutputRendering = PlainText
xtermm
- 设置$PSStyle.OutputRendering = PlainText
如果存在 $env:NO_COLOR
,则 $PSStyle.OutputRendering
设置为 PlainText。 有关 NO_COLOR 环境变量的详细信息,请参阅 https://no-color.org/。
从 C# 使用 $PSStyle
C# 开发人员可以将 PSStyle
作为单一实例,如以下示例所示:
string output = $"{PSStyle.Instance.Foreground.Red}{PSStyle.Instance.Bold}Hello{PSStyle.Instance.Reset}";
PSStyle
存在于 System.Management.Automation 命名空间中。
PowerShell 引擎包含以下更改:
- PowerShell 格式系统已更新,现遵循
$PSStyle.OutputRendering
。 - 添加了
StringDecorated
类型来处理 ANSI 转义字符串。 - 添加了
string IsDecorated
布尔属性,以便在字符串包含ESC
或C1 CSI
字符序列时返回 true。 - 字符串的
Length
属性会返回没有 ANSI 转义序列的文本的长度。 StringDecorated Substring(int contentLength)
方法会返回一个子字符串,该字符串从索引 0 处开始,一直到超出 ANSI 转义序列的内容长度。 如果表格式设置要截断字符串,并保留未占用可打印字符空间的 ANSI 转义序列,则需要使用此方法。string ToString()
方法保持不变,并返回字符串的纯文本版本。Ansi
参数为 true 时,string ToString(bool Ansi)
方法会返回原始 ANSI 嵌入字符串。 否则,返回已删除 ANSI 转义序列的纯文本版本。FormatHyperlink(string text, uri link)
会返回一个字符串,其中包含用于修饰超链接的 ANSI 转义序列。 某些终端主机(如 Windows 终端)支持此标记,这使得呈现的文本在终端中可单击。
PSStyle 类的静态方法
PowerShell 7.4 向 [System.Management.Automation.PSStyle]
类添加了三个新的静态方法。
[System.Management.Automation.PSStyle] | Get-Member -Static -MemberType Method
TypeName: System.Management.Automation.PSStyle
Name MemberType Definition
---- ---------- ----------
Equals Method static bool Equals(System.Object objA, System.Object objB)
MapBackgroundColorToEscapeSequence Method static string MapBackgroundColorToEscapeSequence(System.ConsoleColor bac…
MapColorPairToEscapeSequence Method static string MapColorPairToEscapeSequence(System.ConsoleColor foregroun…
MapForegroundColorToEscapeSequence Method static string MapForegroundColorToEscapeSequence(System.ConsoleColor for…
ReferenceEquals Method static bool ReferenceEquals(System.Object objA, System.Object objB)
这些方法提供了一种将 ConsoleColor 值转换为 ANSI 转义序列的方法,用于前景和背景色或两者的组合。
以下示例显示了这些方法生成的 ANSI 转义序列。
using namespace System.Management.Automation
[PSStyle]::MapBackgroundColorToEscapeSequence('Black') | Format-Hex
Label: String (System.String) <3A04954D>
Offset Bytes Ascii
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
------ ----------------------------------------------- -----
0000000000000000 1B 5B 34 30 6D �[40m
[PSStyle]::MapForegroundColorToEscapeSequence('Red') | Format-Hex
Label: String (System.String) <38B50F41>
Offset Bytes Ascii
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
------ ----------------------------------------------- -----
0000000000000000 1B 5B 39 31 6D �[91m
[PSStyle]::MapColorPairToEscapeSequence('Red','Black') | Format-Hex
Label: String (System.String) <365A5875>
Offset Bytes Ascii
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
------ ----------------------------------------------- -----
0000000000000000 1B 5B 39 31 3B 34 30 6D �[91;40m