我有一个脚本通过stdout
流返回数据(只需在脚本末尾执行Write-Output
)。
可悲的是,我在代码中有很多Write-Verbose
和Write-Warning
,我希望他们将数据写入stderr
流,以免与我的输出混在一起。< / p>
我发现Write-Warning
实际上是在$host.UI.WriteWarningLine
下调用stdout
,但它直接写入$('.dob1-day').on('keyup change', myNS.validate.dobChange);
而没有办法改变它。
有什么想法吗?
答案 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调用它,包括WarningVariable
和WarningAction
在这个特定的脚本中,需要使用ErrorAction来确保它没有停止写入错误消息。显然不需要实现你所寻求的目标。
通过将SilentlyContinue放在WarningAction上,您将从stdout流中取出警告消息,通过将它们保存在WarningVariable中,然后您可以在最后使用它们执行任何操作。在这种情况下,只需循环遍历它们并将它们传递给stderr
关于InformationAction
信息流的InformationVariable
和verbose
也是如此。
答案 1 :(得分:0)
在PowerShell之外,你只有STDOUT和STDERR。错误流转到STDERR,所有其他流转到STDOUT。此时,您无法再将常规输出的详细或警告输出分开。