例如,如果您在powershell会话中执行此命令
write-host 'hello' -ForegroundColor 'red' -BackgroundColor 'cyan'调整窗口大小会导致背景色填满整行:

我已经在Windows终端、Windows控制台和Fluent终端上进行了测试,它们都表现出了这种行为。(我猜可能有一个虚拟终端序列/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”,其中“World”没有背景颜色,或者更准确地说,与默认颜色(黑色)相同。
如果我们再前进一步,在背景颜色设置为黑色之后打印一个额外的空格,那么这并不能达到预期的响应,即在调整大小后,我们又看到背景颜色青色填充了整行。
因此,我们需要某种不可见的字符来阻止背景颜色的溢出,或者是一种完全不同的方法,而我目前还不知道这种方法。
发布于 2021-02-10 02:35:37
这是2017年conhost中的confirmed bug。所以,所有依赖于conhost的东西都会有这个bug。
这是windows控制台中的错误,而不是powershell中的错误。它在powershell之外是有buggy的(试试this,例如)。
控制台使用最后一个字符的颜色填充行,该颜色不是空格(0x20)、制表符(0x09)或换行符。
您可以尝试以下解决方案之一:
1-在行尾使用Non-Breaking 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 $hostBgColor3-使用其他unicode多字节whitespace characters,但根据许多因素,它们可能看起来不同,包括字体和unicode支持int console\output file。
https://stackoverflow.com/questions/66123718
复制相似问题