是否可以停止 `powershell` 以 ANSI 序列包装输出?
Is it possible to stop `powershell` wrapping output in ANSI sequences?
I CreateProcess
(win32) powershell
并从中读取原始字节。
我看到它会产生很多不可见的字符。
例如\u{1b}[2J\u{1b}[m\u{1b}[
有什么办法可以阻止吗?
*确实可以手动剥离它们,但我希望有其他方法。
您可以 disable ANSI output rendering by setting the environment variable TERM
至 dumb
:
SetEnvironmentVariable(TEXT("TERM"), TEXT("dumb"));
// proceed with your call to CreateProcess
你提到了powershell
(powershell.exe
),即Windows PowerShell.[=52=的CLI ]
Windows PowerShell(不同于 PowerShell (Core) 7+,见下文)本身 不 使用基于 VT/ANSI 转义序列的着色/格式。
这意味着 third-party 代码 正在生成您案例中的 VT 序列 ,所以您必须停用(或重新配置)它 以避免输出中出现此类序列。
主要候选是自定义 prompt
函数;此类功能通常涉及着色以获得更好的 command-line 体验。
在 程序化 中使用 powershell.exe
,但是,如果您提供 PowerShell,您只会看到提示函数打印的内容 命令到 CLI 的 stdin,同时将参数 -File -
传递给 CLI(以指示它从 stdin 读取命令)或默认情况下。
要从输出中完全排除 prompt-function输出,使用-Command -
,如answer to your previous question中所讨论.
如果您确实需要它,但想使用 默认 提示字符串,请使用 -NoProfile
参数抑制 $PROFILE
加载,这在程序化处理中通常更可取。
在 PowerShell (Core) 7.2+ 中控制彩色输出(VT/ANSI 转义序列)的使用
在 PowerShell (Core) 7+ (pwsh.exe
) - 但不在 Windows PowerShell (powershell.exe
) - PowerShell 本身 在某些情况下使用 VT (ANSI) 转义序列来生成 formatted/colored 输出,例如在 Select-String
的输出中,在 v7.2+ 中,通常在格式化输出中(表格输出中的列 headers / 列表输出中的 属性 名称).
在 PowerShell 7.2+ 中,您 可以 明确地 抑制这些 :
注意:断然禁用 VT (ANSI) 序列通常没有必要,因为当输出 未发送到主机(显示) 时,PowerShell 自动 抑制它们;也就是说,$PSStyle.OutputRendering
默认为 Host
[1].
- 这相当于 Unix 实用程序可能(明智地)表现出的相同行为:默认情况下仅在打印到 display(终端)时应用着色,而不是在管道传输到另一个时应用命令或重定向到文件。
从外部 PowerShell,在启动之前:
通过定义NO_COLOR
环境变量,用任何值,如1
.
这会导致 PowerShell 在启动时将 $PSStyle.OutputRendering
设置为 PlainText
,指示 PowerShell 不使用 VT/ANSI 转义序列。
越来越多的外部程序也尊重这个环境。变量 - 参见 no-color.org
或者,通过将 TERM
环境变量设置为 xtermm
/ xterm-mono
:
- 请注意值
dumb
,至少从 PowerShell Core 7.2.0-preview.9(撰写本文时的最新版本)开始,不会 工作:虽然它确实导致 $host.UI.SupportsVirtualTerminal
然后反映 $false
,如记录的那样,$PSStyle.OutputRendering
保持其默认值,Host
和 实际格式化输出(例如来自 Get-Item /
)仍然使用颜色。
- 但是,设置
TERM
可能 比 NO_COLOR
更有效 外部程序 不发射VT 序列 - 最终,不能保证。
- 也就是说,修改
TERM
,尤其是将其设置为值 dumb
,通常最好避免,因为外部程序(在 Unix-like 平台上)可能依赖于 TERM
用于推断(也 non-color-related)托管终端应用程序功能的变量(将变量设置为 dumb
完全消失,并且 - 至少假设 - 值 xtermm
/ xterm-mono
可能会歪曲真实的 基本 终端类型)。
来自内部 PowerShell:
- 与
$PSStyle.OutputRendering = 'PlainText'
- 请注意,与上面讨论的环境变量不同,仅此一项不会影响 外部程序.
的行为
请注意,使用 VT 序列的 third-party PowerShell 代码,特别是如果它早于 PowerShell (Core) 7+,可能不遵守任何上面描述的用于禁用它们的标准机制(尽管可以想象提供自定义机制)。
[1] 自 v7.2.0-preview.9 起适用,其中 Host
已设为默认值,之前的默认值 Automatic
已重新完全被爱了。
I CreateProcess
(win32) powershell
并从中读取原始字节。
我看到它会产生很多不可见的字符。
例如\u{1b}[2J\u{1b}[m\u{1b}[
有什么办法可以阻止吗?
*确实可以手动剥离它们,但我希望有其他方法。
您可以 disable ANSI output rendering by setting the environment variable TERM
至 dumb
:
SetEnvironmentVariable(TEXT("TERM"), TEXT("dumb"));
// proceed with your call to CreateProcess
你提到了
powershell
(powershell.exe
),即Windows PowerShell.[=52=的CLI ]Windows PowerShell(不同于 PowerShell (Core) 7+,见下文)本身 不 使用基于 VT/ANSI 转义序列的着色/格式。
这意味着 third-party 代码 正在生成您案例中的 VT 序列 ,所以您必须停用(或重新配置)它 以避免输出中出现此类序列。
主要候选是自定义
prompt
函数;此类功能通常涉及着色以获得更好的 command-line 体验。在 程序化 中使用
powershell.exe
,但是,如果您提供 PowerShell,您只会看到提示函数打印的内容 命令到 CLI 的 stdin,同时将参数-File -
传递给 CLI(以指示它从 stdin 读取命令)或默认情况下。要从输出中完全排除 prompt-function输出,使用
-Command -
,如answer to your previous question中所讨论.如果您确实需要它,但想使用 默认 提示字符串,请使用
-NoProfile
参数抑制$PROFILE
加载,这在程序化处理中通常更可取。
在 PowerShell (Core) 7.2+ 中控制彩色输出(VT/ANSI 转义序列)的使用
在 PowerShell (Core) 7+ (pwsh.exe
) - 但不在 Windows PowerShell (powershell.exe
) - PowerShell 本身 在某些情况下使用 VT (ANSI) 转义序列来生成 formatted/colored 输出,例如在 Select-String
的输出中,在 v7.2+ 中,通常在格式化输出中(表格输出中的列 headers / 列表输出中的 属性 名称).
在 PowerShell 7.2+ 中,您 可以 明确地 抑制这些 :
注意:断然禁用 VT (ANSI) 序列通常没有必要,因为当输出 未发送到主机(显示) 时,PowerShell 自动 抑制它们;也就是说,
$PSStyle.OutputRendering
默认为Host
[1].- 这相当于 Unix 实用程序可能(明智地)表现出的相同行为:默认情况下仅在打印到 display(终端)时应用着色,而不是在管道传输到另一个时应用命令或重定向到文件。
从外部 PowerShell,在启动之前:
通过定义
NO_COLOR
环境变量,用任何值,如1
.这会导致 PowerShell 在启动时将
$PSStyle.OutputRendering
设置为PlainText
,指示 PowerShell 不使用 VT/ANSI 转义序列。越来越多的外部程序也尊重这个环境。变量 - 参见 no-color.org
或者,通过将
TERM
环境变量设置为xtermm
/xterm-mono
:- 请注意值
dumb
,至少从 PowerShell Core 7.2.0-preview.9(撰写本文时的最新版本)开始,不会 工作:虽然它确实导致$host.UI.SupportsVirtualTerminal
然后反映$false
,如记录的那样,$PSStyle.OutputRendering
保持其默认值,Host
和 实际格式化输出(例如来自Get-Item /
)仍然使用颜色。 - 但是,设置
TERM
可能 比NO_COLOR
更有效 外部程序 不发射VT 序列 - 最终,不能保证。 - 也就是说,修改
TERM
,尤其是将其设置为值dumb
,通常最好避免,因为外部程序(在 Unix-like 平台上)可能依赖于TERM
用于推断(也 non-color-related)托管终端应用程序功能的变量(将变量设置为dumb
完全消失,并且 - 至少假设 - 值xtermm
/xterm-mono
可能会歪曲真实的 基本 终端类型)。
- 请注意值
来自内部 PowerShell:
- 与
$PSStyle.OutputRendering = 'PlainText'
- 请注意,与上面讨论的环境变量不同,仅此一项不会影响 外部程序. 的行为
- 与
请注意,使用 VT 序列的 third-party PowerShell 代码,特别是如果它早于 PowerShell (Core) 7+,可能不遵守任何上面描述的用于禁用它们的标准机制(尽管可以想象提供自定义机制)。
[1] 自 v7.2.0-preview.9 起适用,其中 Host
已设为默认值,之前的默认值 Automatic
已重新完全被爱了。