如何向 STDERR 写入详细信息和警告?

How to write verbose and warnings to STDERR?

我有一个脚本 returns 数据通过 stdout 流(只需在脚本末尾执行 Write-Output)。

可悲的是,我的代码中有很多 Write-VerboseWrite-Warning,我希望它们将数据写入 stderr 流,以免与我的输出混淆.

我发现 Write-Warning,例如,实际上在后台调用 $host.UI.WriteWarningLine,但它直接写入 stdout,无法更改它。

有什么想法吗?

在 PowerShell 之外,您只有 STDOUT 和 STDERR。错误流转到 STDERR,所有其他流转到 STDOUT。到那时,您无法再将详细或警告输出与常规输出分开。

如果你可以稍微修改原始脚本,然后 运行 一个包装脚本,你应该可以做这样的事情(如果你不能,那么这个答案完全没有意义;))

[CmdletBinding()]
Param()
Write-Error "error"
Write-Warning "warning"
Write-Output "output" 
Write-Verbose "verbose" 

然后用这样的包装器调用脚本(用@beatcracker 的评论 link 修改)

.\test1.ps1 -ErrorAction Continue -WarningVariable warn1 `
            -WarningAction SilentlyContinue  `
            -InformationVariable inf `
            -InformationAction SilentlyContinue 

$warn1 | foreach { $host.ui.WriteErrorLine($_)  } 

通过在原始脚本的顶部添加[CmdletBinding()],您可以使用 Powershell CommonParameters 调用它,包括 WarningVariableWarningAction

在这个特定的脚本中,需要 ErrorAction 以确保它不会因写入错误消息而停止。显然不需要实现您想要的。

通过将 SilentlyContinue 放在 WarningAction 上,您将从标准输出流中取出警告消息,通过将它们保存在 WarningVariable 中,您可以在最后对它们做任何您想做的事情。在这种情况下,只需遍历它们并将它们传递给 stderr

InformationActionInformationVariable 关于 verbose 流也是如此。