如何向STDERR写下详细和警告?

时间:2016-02-02 14:21:34

标签: powershell stdout stderr

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

可悲的是,我在代码中有很多Write-VerboseWrite-Warning,我希望他们将数据写入stderr流,以免与我的输出混在一起。< / p>

我发现Write-Warning实际上是在$host.UI.WriteWarningLine下调用stdout,但它直接写入$('.dob1-day').on('keyup change', myNS.validate.dobChange); 而没有办法改变它。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

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

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

然后使用这样的包装器调用脚本(使用@ beatcracker&#39; s comment 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上,您将从stdout流中取出警告消息,通过将它们保存在WarningVariable中,然后您可以在最后使用它们执行任何操作。在这种情况下,只需循环遍历它们并将它们传递给stderr

关于InformationAction信息流的InformationVariableverbose也是如此。

答案 1 :(得分:0)

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

相关问题