在powershell中调整窗口大小时,使用背景色写入主机会用背景色填充整行

在powershell中调整窗口大小时,使用背景色写入主机会用背景色填充整行,powershell,console,write-host,Powershell,Console,Write Host,例如,如果在powershell会话中执行此命令 write-host 'hello' -ForegroundColor 'red' -BackgroundColor 'cyan' 调整窗口大小会导致背景色填充整行: 我已经在Windows终端、Windows控制台和Fluent终端上测试过,它们都表现出这种行为。(我猜可能有一个虚拟终端序列/ANSI代码来解决这个问题,但我不知道这可能是什么) 那么,我们如何才能防止这种情况发生呢 λ $PSVersionTable Name

例如,如果在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在没有背景色的情况下显示,或者更准确地说,与默认值相同(黑色)

如果我们再向前迈出一步,在背景色设置为黑色的情况下打印一个额外的空间,那么这并不能达到预期的响应,即在调整大小后,我们又看到背景色青色填充整行

因此,我们需要某种不可见的字符来阻止背景颜色的过度渲染,或者是一种完全不同的方法,我目前还不知道。

这是从2017年开始的
conhost
。因此,任何依赖于
conhost
的东西都会有这个bug

这是windows控制台中的错误,而不是powershell中的错误。它在powershell外有四轮马车(试试,ex)

控制台使用最后一个字符的颜色填充行,该字符不是空格(0x20)、制表符(0x09)或换行符

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

1-在行尾使用字符空格。这是唯一一个空格单字节字符,它是空格,控制台不会忽略它,它不是换行符

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多字节,但它们可能会因许多因素而有所不同,包括字体和unicode支持int console\output file。

听起来更像是一个bug,而不是一个编程问题。非常感谢,非常有用。我最喜欢第一个选项,因为它适用于Windows终端、Fluent终端和Windows控制台。但我不确定mac(终端/iterm2)或linux