【发布时间】:2019-12-06 20:52:39
【问题描述】:
我被指出了一个问题,如果我希望命令按顺序操作,建议使用 Write-Output over Write-Host(因为 Write-Host 不会将输出放在管道上,而其他命令会这样做,这意味着 Write-主机输出可能发生在管道上的其他命令之前或之后,导致输出非常混乱):command execution ordering inside a PowerShell scriptblock
按照这个建议,我使用 Write-Output 制作了一个简单的函数来模仿 Write-Host 的颜色语法。对于排序,这很有效,因此命令的输出现在是连续的,但是现在使用 Write-Output 的颜色输出很糟糕,因此如果我完全使用任何 BackgroundColor,结果会以非常难看的方式喷洒在屏幕上。 Write-Host 的颜色输出紧密可靠,不会渗入控制台的其他部分,因此使用带有颜色的 Write-Output 会产生一些非常丑陋/笨拙的控制台输出。
在离开该功能之前,我是否需要以某种方式重置 $host.ui,或者任何人都可以提出修改此功能的方法,以使颜色保持在所需区域并且不会流血其他控制台区域?
function Write-Color ($text, $ForegroundColor, $BackgroundColor) {
$defaultFore = $host.ui.RawUI.ForegroundColor
$defaultBack = $host.ui.RawUI.BackgroundColor
if ($ForegroundColor -ne $null) { $host.ui.RawUI.ForegroundColor = $ForegroundColor }
if ($BackgroundColor -ne $null) { $host.ui.RawUI.BackgroundColor = $BackgroundColor }
Write-Output $text
$host.ui.RawUI.ForegroundColor = $defaultFore
$host.ui.RawUI.BackgroundColor = $defaultBack
}
例如
Write-Color "The dog sat on the couch" -ForegroundColor Red -BackgroundColor White
【问题讨论】:
-
您被指向了错误的帖子(它仅与您的问题无关 - 请参阅 my recent answer 那里)。对于彩色输出,您确实需要
Write-Host,否则您必须在发送到成功流/传递给Write-Output的输出字符串中嵌入VT(虚拟终端)转义序列,但随后它们变为数据。要解决Write-Host和Write-Output/ success-stream 输出之间的排序问题,请参阅stackoverflow.com/a/43691123/45375,但请注意它需要将数据 输出发送到屏幕。 -
非常感谢。如果您将此作为答案发布,我会将其标记为答案。我不喜欢微软制造了这个烂摊子。应该有一些明确的区别:Write-Output / Write-Host,我不清楚 Write-Host 会以这种奇怪的方式行事。这是一种脚本语言,我们应该期望事情是连续的,第 1 行完全完成,然后第 2 行等。我对一些执行其他操作的特殊功能没有问题,但对于大多数人来说,大多数时候,他们只是希望命令 1 在命令 2 之前执行。
-
我想在过去,我遇到过这种“从不使用-Write-Host-for-no-reason-ever”,但我已经停止使用 PowerShell 很多年了,现在又回来了所以必须再次经历这种痛苦(感谢微软!)。好的,这门语言很棒,它比其他语言更容易分割信息,所以我可以原谅这样的事情,但你有什么建议?我应该a)使用Write-Output(它可怕地无法做背景颜色),还是b)使用Write-Host,如“Write-Host“123”-F Red -B White | Out-Host”,这将保证顺序?
-
转到上面的第二个链接,我尝试按照建议使用“| Out-Host”。因此,以第一个链接
Write-Host '------- 1'; Get-Item / | Select-Object FullName; Write-Host '------- 2'为例(这是非顺序的!)。因此,我(错误地)将| Out-Host添加到所有内容中,并认为这可以解决问题。Write-Host '------- 1' | Out-Host; Get-Item / | Select-Object FullName; Write-Host '------- 2' | Out-Host这(也是!)非连续的!我很难过...我只想以 sequential 方式可靠地输出颜色。是否可以?我真的很感激这个答案...... -
您需要将
Out-Host应用于non-Write-Host语句;Write-Host已经写入主机。因此:Write-Host '------- 1'; Get-Item / | Select-Object FullName | Out-Host; Write-Host '------- 2'
标签: powershell colors console