it-swarm-ja.com

PowerShellを使用して、ネイティブコマンドラインアプリを呼び出し、STDERRをキャプチャします

通常のステータスメッセージをSTRERRに書き込むWindows上のcygwinツールのポートを使用しています。これにより、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

もっと良い方法はありますか?

P.S.私が見つけた1つの解決策を投稿し、それを他の人からの回答と比較するつもりです。

6
yzorg

これは私が見つけた解決策の1つです。より良い回答がある場合は、回答を投稿してください(これは、通常の出力ストリームではなく、ステータスメッセージを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 ...
1
yzorg

いいえ、残念ながら。この醜さはPowershellの設計による機能です:(アプリケーションが標準エラーで出力する場合(および他のものがリッスンしている場合)、Powershellは各行を難読化された「NativeCommandError」オブジェクトでラップします。 https:// stackoverflow詳細については、.com/questions/1394084/ignore-an-errorlevel-0-in-windows-powershell

醜いオブジェクトを沈黙させることはできますが、そうすると有用なコンテンツも失われます。

2
Colonel Panic

@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...
1
penguin359