当 window 在 powershell 中调整大小时,Write-Host with background color 用背景色填充整行

Write-Host with background colour fills the entire line with background colour when window is resized in powershell

例如,如果您在 powershell 会话中执行此命令

write-host 'hello' -ForegroundColor 'red' -BackgroundColor 'cyan'

调整 window 的大小会导致背景颜色填满整行:

我已经在 Windows 终端、Windows 控制台和 Fluent 终端中对此进行了测试,它们都表现出这种行为。 (我猜可能有一个虚拟终端 sequence/ANSI 代码来解决这个问题,但我不知道这是什么)。

那么,我们怎样才能防止这种情况发生呢?

λ $PSVersionTable

Name                           Value
----                           -----
PSVersion                      7.1.1
PSEdition                      Core
GitCommitId                    7.1.1
OS                             Microsoft Windows 10.0.19041
Platform                       Win32NT
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0

编辑:作为测试,我尝试了以下操作:

write-host 'hello' -ForegroundColor 'red' -BackgroundColor 'cyan' -NoNewline; write-host 'world' -BackgroundColor black

当然会显示 'HelloWorld',其中“世界出现时没有背景颜色,或者更准确地说与默认颜色(黑色)相同”。

如果我们再向前一步,在背景颜色设置为黑色后打印一个额外的 space,那么这不会达到预期的响应,IE 我们会回到看到背景颜色青色调整大小后填充整行。

所以我们需要某种不可见的字符来阻止背景颜色的溢出或我目前不知道的完全不同的方法。

这是 2017 年 conhost 中的 confirmed bug。所以,所有依赖 conhost 的东西都会有这个错误。

这是 windows 控制台中的错误,而不是 powershell 中的错误。它在 powershell 之外有问题(尝试 this,例如)。

控制台用最后一个字符的颜色填充行,该字符不是 space (0x20),也不是制表符 (0x09),也不是换行符。

您可以尝试以下解决方案之一:

1 - 在行尾使用 Non-Breaking space 字符 space。这是唯一的 space 单字节字符 space,并且不会被控制台忽略,也不是换行符。

write-host 'hello' -f 'red' -b 'cyan' -n;   write-host ([char]0xA0)

2 - 使用任何颜色与控制台颜色匹配的字符。这更糟,因为它被复制到剪贴板、输出等。

$hostBgColor = $Host.UI.RawUI.BackgroundColor
write-host 'hello' -f 'red' -b 'cyan' -n;   write-host 'X' -f $hostBgColor -b $hostBgColor

3 - 使用其他 unicode 多字节 whitespace characters,但它们看起来会因许多因素而有所不同,包括字体和 unicode 支持 int console\output 文件。