如何将所有输出流写入 PowerShell 中的变量?

Posted

技术标签:

【中文标题】如何将所有输出流写入 PowerShell 中的变量?【英文标题】:How do you write all output streams to a variable in PowerShell? 【发布时间】:2021-05-13 01:18:47 【问题描述】:

在 PowerShell 中,我无法将错误流输出写入变量。

在不将输出保存到变量的情况下运行命令将导致任何流的输出可见,但是,我需要将输出写入变量。

& terraform $action $arguments

最初我开始使用它。但是,只有成功流被写入变量(如预期的那样)。

$res = & terraform $action $arguments

于是我咨询了docs for about_Redirection,但问题是,当我将错误流(或所有流)重定向到成功流时,我仍然只看到写入变量的成功流。我做了几次尝试,都失败了。

$res = & terraform $action $arguments 2>&1
$res = & terraform $action $arguments *>&1
$res = & terraform $action $arguments *>&1 | ForEach-Object  $_.ToString() 

但是,如果我将错误流重定向到文件,则流会按预期写入。

$res = & terraform $action $arguments 2>> terraform-errors.log

如何将所有流的输出写入变量?

【问题讨论】:

& & terraform $action $arguments *>&1 工作吗? 遗憾的是它没有。目前我正在使用& terraform $action $arguments *>&1 | ForEach-Object Write-Host $_ ,并且我进行了一些更改,因此我不一定需要变量中的输出。不过,如果您有任何其他想法,我的偏好仍然是将输出存储在变量中。 看看这个 - ***.com/questions/15437244/… 【参考方案1】:

我终于找到了这个问题的答案,问题是由于设置$ErrorActionPreference = Stop

发生终止时,脚本会在输出重定向之前被终止。为了解决这个问题,必须更改错误操作首选项,然后可以使用Invoke-Expression 和一些common parameters 将错误和输出发送到变量。

$ErrorActionPreference = "SilentlyContinue"
Invoke-Expression "& terraform $action $arguments 2>&1" -ErrorVariable terraformError -OutVariable terraformState | Out-Null
$ErrorActionPreference = "Stop"

### Check if there was an error.
if ($terraformError) 
    throw $terraformError

为什么不使用-ErrorAction 来更改错误操作首选项?

遗憾的是 -ErrorAction 仅适用于非终止错误。因为脚本的错误操作首选项是Stop,这意味着无论-ErrorAction 通用参数的值如何,Invoke-Expression 命令都会触发终止错误。

要解决此问题,必须在运行 Invoke-Expression 命令之前更改错误操作首选项,然后在完成后更改回来。

为什么输出通过管道传送到Out-Null

尽管保存了错误并输出到变量,输出也将流式传输到控制台而不用管道传输到Out-Null

显然这是可选的,因为在某些情况下可能可以接受/预期输出也将流式传输到控制台。

【讨论】:

以上是关于如何将所有输出流写入 PowerShell 中的变量?的主要内容,如果未能解决你的问题,请参考以下文章

将输出流以外的两个或多个 Powershell 流重定向到同一个文件

Java 如何使用输入流和输出流 将txt文件中的某一行数据删除?

java中输出流不关闭为啥不能写入

如何将 EMR 流作业的输出写入 HDFS?

(17)Powershell中的重定向运算符

如何将所有系统输出写入JAVA中的文件?