9

実行可能ファイルが標準エラーストリーム()に書き込む場合、PowerShellコンソールとPowerShellISEの動作は異なりますstderr。コンソール(powershell.exe)は、標準出力のように表示します。たとえば、非リポジトリでMercurialのステータスを取得すると、標準エラーに書き込みます。

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

ただし、PowerShell ISE( )では、そのエラーはPowerShellのコマンドレットpowershell_ise.exeに渡されます。Write-Error

> 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

コンソールのように動作し、stderrストリームをに送信しないようにISEを構成する方法はありますWrite-Errorか?

4

2 に答える 2

7

stderr出力をstdoutにリダイレクトすることは「機能するはずです」が、ISEでは機能しません。この場合、最善の策は、次のようにエラー出力を無音にすることです。

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

ネストされたスコープでこの変数の設定を実行することにより、グローバルに設定することを回避できます。上記のスコープを終了しても、のグローバルバージョン$ErrorActionPreferenceは以前の状態のままになります。

ISEとコンソールの動作が異なるのは残念ですが、「コンソール」を使用すると、別のコンソールアプリがコンソールハンドルを取得するだけなので、コンソールに直接出力されます(PowerShellをバイパスします)ISEはコンソールベースではないため、PowerShellエラーストリームでネイティブstderrを適切に機能させようとしています。この場合、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 に答える