如何向 STDERR 写入详细信息和警告?
How to write verbose and warnings to STDERR?
我有一个脚本 returns 数据通过 stdout
流(只需在脚本末尾执行 Write-Output
)。
可悲的是,我的代码中有很多 Write-Verbose
和 Write-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 调用它,包括 WarningVariable
和 WarningAction
在这个特定的脚本中,需要 ErrorAction 以确保它不会因写入错误消息而停止。显然不需要实现您想要的。
通过将 SilentlyContinue 放在 WarningAction 上,您将从标准输出流中取出警告消息,通过将它们保存在 WarningVariable 中,您可以在最后对它们做任何您想做的事情。在这种情况下,只需遍历它们并将它们传递给 stderr
InformationAction
和 InformationVariable
关于 verbose
流也是如此。
我有一个脚本 returns 数据通过 stdout
流(只需在脚本末尾执行 Write-Output
)。
可悲的是,我的代码中有很多 Write-Verbose
和 Write-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 调用它,包括 WarningVariable
和 WarningAction
在这个特定的脚本中,需要 ErrorAction 以确保它不会因写入错误消息而停止。显然不需要实现您想要的。
通过将 SilentlyContinue 放在 WarningAction 上,您将从标准输出流中取出警告消息,通过将它们保存在 WarningVariable 中,您可以在最后对它们做任何您想做的事情。在这种情况下,只需遍历它们并将它们传递给 stderr
InformationAction
和 InformationVariable
关于 verbose
流也是如此。