我刚刚在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:
- Powershell Stream Redirection
- Powershell Script output to variable - capture Write-Host output
- PowerShell Capture Write-Host output
- PowerShell redirect output to Write-Host and return exit code
- 更新-1**
多亏了 * 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 }
我们得到:
1条答案
按热度按时间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
中因此,您可以*重新创建 * 原始着色,如下所示-请注意,
Write-Host
将再次使用: