如何将所有输出流写入 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 流重定向到同一个文件