9

当可执行文件写入标准错误流 ( stderr) 时,PowerShell 控制台和 PowerShell ISE 的行为不同。控制台 (powershell.exe) 将其显示为标准输出。例如,当我在非存储库上获得 Mercurial 状态时,它会写入标准错误:

> hg st -R C:\Windows
abort: repository C:\Windows not found!

但是,在 PowerShell ISE ( powershell_ise.exe) 中,该错误会传递给 PowerShell 的Write-Errorcmdlet:

> hg st -R C:\Windows
hg.exe : abort: repository C:\Windows not found!
At line:1 char:3
+ hg <<<<  st -R C:\Windows
    + CategoryInfo          : NotSpecified: (abort: repository C:\Windows not found!:String) [], RemoteExcepti 
   on
    + FullyQualifiedErrorId : NativeCommandError

有没有办法将 ISE 配置为像控制台一样运行,而不是将 stderr 流发送到Write-Error

4

2 回答 2

7

将标准错误输出重定向到标准输出“应该”工作,但它在 ISE 中不起作用。在这种情况下,最好的办法是像这样使错误输出静音:

& {
    $ErrorActionPreference = 'SilentlyContinue'
    hg st -R C:\Windows 2>&1
}

通过在嵌套范围内执行设置此变量,您可以避免全局设置它。当上述范围退出时,全局版本$ErrorActionPreference仍设置为之前的任何版本。

不幸的是,ISE 和控制台的行为不同,但我的理解是,使用“控制台”,另一个控制台应用程序只是获取控制台句柄,因此直接输出到控制台(绕过 PowerShell)。ISE 不是基于控制台的,因此它试图使本机 stderr 与 PowerShell 错误流很好地配合使用。在这种情况下,IMO 控制台的行为并不理想。那么让 ISE 与控制台保持一致还是让 ISE 更好地处理 stderr 更好(除了关于不尊重流重定向的一点)?显然 PowerShell 与后者一起使用。

于 2012-09-21T21:46:48.983 回答
3
hg st -R C:\Windows 2>&1 | %{ if ($_ -is [System.Management.Automation.ErrorRecord]) { $_.Exception.Message } else { $_ } }

这会保留 stderr 输出并将其作为正常输出发送,而不是丢弃它。

于 2013-10-18T11:17:50.460 回答