如何在powershell中使用Write-Host将输出和结果都写入变量?

q9yhzks0  于 2022-12-29  发布在  Shell
关注(0)|答案(1)|浏览(195)

我刚刚在powershell上使用Write-Host时遇到了一个有趣的行为。
我想做的是从Write-Host中获取彩色输出,并同时将结果保存在一个变量中。检查其他SO问题,让我尝试以下操作:

$zz = &{
   Write-Warning "hello"
   Write-Error "hello"
   Write-Output "hi"
} 3>&1 2>&1

$zz 
#WARNING: hello
#Write-Error: hello
#hi

$zz = &{ Write-Host -ForegroundColor Red "[ERROR]: Package id: ""jaja""  not found!"; } 3>&1 2>&1
# [ERROR]: Package id: "jaja"  not found!

$zz
# [nothing]

输出令人惊讶,我找不到一种方法,既可以将输出保存到变量中,又可以看到它的显示,这与使用其他Write-xxx commandlet时不同。

    • Q:什么是gong on on,我怎样才能得到显示的输出并将结果保存到变量中?**

REFERENCES:

多亏了 * mklement0 * 更新的answer,我还尝试了以下方法,它几乎达到了我想要的效果,但不产生颜色

Write-Host -ForegroundColor Red "[ERROR]: Package id: ""jaja""  not found!" 6>&1 | Tee-Object -Variable zz

($zz = Write-Host -ForegroundColor Red "[ERROR]: Package id: ""$package""  not found!" 6>&1)

结论似乎是,当使用与重定向Write-Host的输出有关的任何内容时,任何着色信息都会丢失。

    • 更新-2**

有趣的是,颜色信息仍然在某个地方,按照mklement0的建议,我尝试保存两个不同行的颜色信息,但是解析不正确,如下所示。
因此:

$captured = &{ Write-Host -ForegroundColor Red -NoNewline "[ERROR]: some error! " 6>&1; Write-Host -ForegroundColor Green "OKAY"  6>&1 }

我们得到:

jhdbpxl9

jhdbpxl91#

the answer you link to中所述,您需要重定向6>&1以便捕获Write-Host输出(仅适用于PowerShell v5及更高版本):

  • 通过6>&1捕获的Write-Host输出由一个或多个System.Management.Automation.InformationRecord示例组成,这些示例 * 打印 * 就好像它们是字符串一样,即通过它们的.MessageData.Message属性值,该属性值是传递给Write-Host的自变量的字符串内容。
  • 因此,源自使用-ForegroundColor-BackgroundColor参数的任何 * 着色 * 都 * 不 *(直接)通过:
  • 然而,信息 * 被 * 保留,即在.MessageData.ForegroundColor.MessageData.BackgroundColor属性中,沿着关于-NoNewLine是否被传递到Write-Host的信息,在布尔属性.MessageData.NoNewLine
  • 相反,通过ANSI / VT转义序列 * 嵌入到原始字符串参数 * 中的着色被保留。

因此,您可以*重新创建 * 原始着色,如下所示-请注意,Write-Host将再次使用:

$captured = Write-Host -ForegroundColor Red "[ERROR]: some error" 6>&1

$captured | ForEach-Object {
  $messageData = $_.MessageData
  $colorArgs = @{}
  if (-1 -ne $messageData.ForegroundColor) { $colorArgs.ForegroundColor = $messageData.ForegroundColor }
  if (-1 -ne $messageData.BackgroundColor) { $colorArgs.BackgroundColor = $messageData.BackgroundColor }
  Write-Host -Object $captured @colorArgs -NoNewline:$messageData.NoNewLine
}

相关问题