Использование powershell вызывает собственное приложение командной строки и захватывает STDERR
Я использую порт инструмента cygwin в Windows, который пишет обычные сообщения о состоянии в STRERR. Это приводит к ужасному выводу при запуске из PowerShell:
PS> dos2unix.exe -n StartApp.sh StartApp_fixed.sh
dos2unix.exe : dos2unix: converting file StartApp.sh to file StartApp_fixed.sh in UNIX format ...
At line:1 char:13
+ dos2unix.exe <<<< -n StartApp.sh StartApp_fixed.sh
+ CategoryInfo : NotSpecified: (dos2unix: conve...UNIX format ...:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
Есть ли способ лучше?
PS Я намерен опубликовать одно решение, которое я нашел, и сравнить его с ответами других.
2 ответа
Это одно решение, которое я нашел. Пожалуйста, оставьте свой ответ, если у вас есть лучший ответ (он предназначен только для утилит командной строки, которые отправляют сообщения о состоянии в STDERR вместо обычного потока вывода):
PS> $output = dos2unix.exe -n StartApp.sh StartApp_fixed.sh 2>&1
$output.CategoryInfo.TargetName | Out-Default
dos2unix: converting file StartApp.sh to file StartApp_fixed.sh in UNIX format ...
Нет увы Это безобразие является особенностью Powershell :( Если приложение печатает со стандартной ошибкой (и все остальное слушает), то Powershell оборачивает каждую строку в запутывающий объект 'NativeCommandError'. См. Https://stackoverflow.com/questions / 1394084 / игнорирование уровня ошибки-0-в-Windows-PowerShell для более подробной информации
Вы можете замолчать уродливые объекты, но тогда вы потеряете и полезный контент.
Думаю, я только что наткнулся на решение чуть более чистое, чем у @yzorg. Перенаправления stdout на stderr недостаточно, поскольку на данный момент это все еще объект ErrorRecord, а не строка. Вместо этого это должны быть процессы, и следующее, кажется, извлекает именно то, что необходимо, с минимальными усилиями:
PS> dos2unix.exe -n StartApp.sh StartApp_fixed.sh 2>&1 | %{"$_"}
dos2unix: converting file StartApp.sh to file StartApp_fixed.sh in Unix format...