Скажите PowerShell ISE не отправлять stderr в ошибку записи

Консоль PowerShell и интегрированная среда сценариев PowerShell ведут себя по-разному, когда исполняемые файлы записывают в стандартный поток ошибок (stderr). Консоль (powershell.exe) отображает его как стандартный вывод. Например, когда я получаю статус Mercurial в нерепозитории, он пишет стандартную ошибку:

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

Однако в PowerShell ISE (powershell_ise.exe) эта ошибка передается командлету PowerShell 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

Есть ли способ настроить ISE, чтобы он работал как консоль и не отправлял поток stderr на Write-Error?


person Aaron Jensen    schedule 21.09.2012    source источник
comment
В настоящее время я вижу, что с моим Powershell 4 на Win7: консоль powershell и ISE ведут себя описанным образом, но при запуске сценария powershell .ps1 из консоли или при вызове powershell script.ps1 из, например, нормальные окна cmd, тогда поток stderr будет вести себя как в ISE, то есть использовать Write-Error.   -  person Martin Ba    schedule 25.10.2016


Ответы (2)


hg st -R C:\Windows 2>&1 | %{ if ($_ -is [System.Management.Automation.ErrorRecord]) { $_.Exception.Message } else { $_ } }

Это сохраняет вывод stderr и отправляет его как обычный вывод, а не отбрасывает его.

person Zenexer    schedule 18.10.2013

Перенаправление вывода stderr на stdout "должно" работать, но не в ISE. В этом случае лучше всего отключить вывод ошибки следующим образом:

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

Выполняя установку этой переменной во вложенной области видимости, вы избегаете устанавливать ее глобально. При выходе из указанной выше области для глобальной версии $ErrorActionPreference по-прежнему устанавливается то же значение, что и раньше.

К сожалению, ISE и консоль ведут себя по-разному, но я понимаю, что с «консолью» другое консольное приложение просто получает дескриптор консоли, поэтому оно выводит данные непосредственно на консоль (минуя PowerShell). ISE не является консольной, поэтому пытается заставить собственный stderr хорошо взаимодействовать с потоком ошибок PowerShell. ИМО, поведение консоли в этом случае не идеально. Так что лучше, чтобы ISE согласовывалась с консолью или лучше, чтобы ISE обрабатывал stderr лучше (за исключением бита о том, что не соблюдается перенаправление потока)? Очевидно, PowerShell выбрал второе.

person Keith Hill    schedule 21.09.2012
comment
Это не работает. По-прежнему пишет ошибку с помощью Write-Error. - person Aaron Jensen; 22.09.2012
comment
@splatteredbits Ага, все еще есть. Я обновил свой ответ, чтобы предложить другой вариант. - person Keith Hill; 23.09.2012
comment
Спасибо за это! После полудня экспериментов этот подход оказался явным победителем. У него есть недостатки, но в целом он работает для того, что мне нужно. - person Sander; 28.09.2012