【问题标题】:How to write verbose and warnings to STDERR?如何向 STDERR 写入详细信息和警告?
【发布时间】:2016-02-02 14:21:33
【问题描述】:

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

遗憾的是,我的代码中有很多 Write-VerboseWrite-Warning,我希望它们将数据写入 stderr 流,以免与我的输出纠缠在一起。

我发现Write-Warning,例如,实际上在后台调用$host.UI.WriteWarningLine,但它直接写给stdout,没有办法改变它。

有什么想法吗?

【问题讨论】:

  • 你首先如何调用/调用脚本?只要您在 PowerShell 中调用它,详细和警告流就会与标准输出分开
  • @MathiasR.Jessen powershell.exe -FilePath c:\script.ps1 2> NUL
  • @MathiasR.Jessen 就是这样,我在 powershell 范围之外使用stdout 流。
  • 也许,您可以尝试使用以下方法为Write-VerboseWrite-Warning 制作代理函数:How do I write to standard error in PowerShell?

标签: powershell stdout stderr


【解决方案1】:

如果您可以稍微修改原始脚本,然后运行包装脚本,您应该能够执行类似的操作(如果您不能,那么这个答案完全没有意义;))

[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

对于verbose 流,InformationActionInformationVariable 也是如此。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-18
      • 1970-01-01
      • 2021-02-21
      相关资源
      最近更新 更多