Zhi*_*urt 4 windows powershell winapi
我CreateProcess(win32)powershell并从中读取原始字节。我发现它产生了很多看不见的字符。例如\u{1b}[2J\u{1b}[m\u{1b}[
有什么办法可以阻止它吗?
*确实可以手动剥离它们,但我确实希望有其他方式。
mkl*_*nt0 11
你提到了powershell( ),即Windows PowerShellpowershell.exe的CLI 。
Windows PowerShell(与PowerShell (Core) 7+不同,见下文)本身不使用基于 VT/ANSI 转义序列的着色/格式。
这意味着第三方代码正在您的情况下生成 VT 序列,因此您必须停用(或重新配置)它以避免输出中出现此类序列。
主要候选者是自定义prompt函数;此类功能通常涉及着色以获得更好的命令行体验。
然而,在以编程方式使用 时,如果您将 PowerShell 命令提供给 CLI 的 stdin并同时将参数传递给 CLI(以指示它从 stdin 读取命令)或默认情况下,powershell.exe您只会看到提示函数打印的内容。-File -
要从输出中完全排除提示功能输出,请使用-Command -,如上一个问题的答案中所述。
如果您确实需要它,但想要使用默认提示字符串,请禁止$PROFILE使用参数加载-NoProfile,这在编程处理中通常更可取。
在PowerShell (Core) 7+ ( pwsh.exe)中- 但在Windows PowerShell中则不然( powershell.exe) - PowerShell本身有时会使用 VT (ANSI) 转义序列来生成格式化/彩色输出,例如在Select-Stringand 的输出中,在v7.2+中,在一般格式化输出,特别是表格输出中的列标题/列表输出中的属性名称。
在PowerShell 7.2+中,您可以按如下方式明确抑制这些内容:
注意:通常没有必要彻底禁用 VT (ANSI) 序列,因为当输出未发送到主机(显示器)时,PowerShell 会自动抑制它们;即$PSStyle.OutputRendering默认为Host[1]。
$PSStyle.OutputRendering仅适用于由 PowerShell 的用于显示的格式化系统格式化的对象,并且仅当此类格式化表示形式转换为字符串数据时(显式使用Out-String或隐式使用>/Out-File或通过管道传输到外部程序时) 。[2]从外部PowerShell启动之前:
通过定义NO_COLOR环境变量,可以使用任意值,例如1.
这会导致 PowerShell 设置$PSStyle.OutputRendering为PlainText启动时,指示 PowerShell 不要使用 VT / ANSI 转义序列。
越来越多的外部程序也尊重这个环境。变量 - 参见no-color.org
或者,通过将TERM环境变量设置为 xtermm/ xterm-mono(也设置$PSStyle.OutputRendering为'plaintext'):
dumb$host.UI.SupportsVirtualTerminal反映$false,如文档所述,$PSStyle.OutputRendering但仍保持其默认值,Host并且实际格式化输出(例如来自Get-Item /)仍然使用颜色。TERM可能比让外部程序不发出 VT 序列更有效- 但最终并不能保证。NO_COLORTERM,特别是将其设置为 value dumb,因为外部程序(在类 Unix 平台上)可能依赖该TERM变量来推断托管终端应用程序(也与颜色无关)的功能(其中将变量设置为dumb完全消失并且 - 至少在假设上 - 值xtermm/xterm-mono可能会歪曲真正的基本终端类型)。从PowerShell内部:
放$PSStyle.OutputRendering = 'PlainText'。
请注意,与上面讨论的环境变量不同,这一点本身并不影响外部程序的行为。
但是,如果$PSStyle.OutputRendering = 'PlainText'有效,您可以通过管道传输到或 甚至,或者通过包含外部程序调用,使用收集所有输出优先行为来抑制外部程序的stdout 输出中的 ANSI 转义序列的呈现在; 值得注意的是,这不会从实际数据中删除转义序列(PowerShell 7.2.x过去使用和执行此操作,但在 v7.3+ 中行为已更改 - 请参阅GitHub 问题 #17509)。Out-HostOut-String(...)Out-StringOut-File
请注意,使用 VT 序列的第三方PowerShell代码,尤其是在 PowerShell (Core) 7+ 之前的版本,可能不遵守上述用于禁用它们的任何标准机制(尽管可能会提供自定义机制)。
[1] 这从 v7.2.0-preview.9 开始适用,其中Host被设为默认值,并且之前的默认值Automatic被完全删除。在v7.3.0 的预览Ansi版本中,暂时为默认值,但自从官方 v7.3.0 发布后(合理的)默认值再次为Host。
[2] 值得注意的是,这意味着嵌入 ANSI / VT 转义序列的字符串数据在v7.3 + 中不受约束$PSStyle.OutputRendering(v7.2 的更改),因为字符串不由格式化系统处理(它们打印为-是)。
| 归档时间: |
|
| 查看次数: |
2674 次 |
| 最近记录: |