PowerShell 7 からエラーの表示が簡素化されます

2019.10.29

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

しばたです。
先日リリースされたPowerShell 7 Preview.5の新機能の一つにエラー表示の簡素化があります。

PowerShellのエラー表示

あまり知られていない機能ですが、PowerShellにはもともとエラー発生時の表示を変える設定が存在しており$ErrorView変数の内容を変えることでエラー時の表示内容を切り替えることができます。

デフォルトでは$ErrorView = "NormalView"となっており以下の様な表示がされます。

皆さん見慣れたやつですね。
これを$ErrorView = "CategoryView"に変更するとエラー表示をカテゴリー単位に変更することが可能です。

この機能の詳細についてはMicrosoft Docsの以下のページをご覧ください。

ConciseView の導入

これまでPowerShellのエラー表示(NormalView)は例外情報を中途半端に出してしまうなどお世辞にもユーザーにわかりやすいエラー表示でないとの批判があり、CategoryViewでは情報が不足しているため使われてこなかった現状がありました。
この様な現状を踏まえてよりわかりやすく簡素化されたエラー表示を追加しようというRFCが提出され、多くの議論を経て新しいエラー表示であるConciseViewが導入されました。

現在のRFCからConciseViewの概要を引用します。

  • ConciseView - provides a concise error message suitable for new or occasional PowerShell users and a refactored view for advanced module builders. If the error is not from a script or parser error, then it's a single line error message. Otherwise, you get a multiline error message that contains the error, a pointer and error message showing where the error is in that line. If the terminal doesn't support Virtual Terminal, then vt100 color codes are not used.

ざっくり説明すると、

  • コンソール上のコマンド実行で発生したエラーは1行表示の分かりやすいエラーメッセージに
  • スクリプト実行時のエラーはエラーの発生行を示した複数行のエラーメッセージに

といった感じになります。

$ErrorView = "ConciseView"

ConciseViewへの変更は$ErrorView = "ConciseView"とすれば直ちに反映されます。
コンソール上でのエラーは以下の様に表示されます。

(こちら元のエラーメッセージに改行があるため2行表示になっています。最後のSuggestionの部分は以前解説した別機能によるものです)

そしてスクリプトから同様のエラーを発生させるとこの様になります。

エラーの発生行が分かりやすく表示されています。

Get-Error

ConciseViewの導入に合わせて発生したエラーの詳細情報を取得するために新たにGet-Errorコマンドレットが導入されました。
実行方法は単純で、エラーが発生した直後に引数無しでコマンドを呼ぶだけです。

Get-Error

そうするとエラーの詳細情報を一度に表示してくれます。

ちなみに従来の$error変数も使うことが可能で表示の仕方も$ErrorViewの設定に従います。

注意事項

例によって?この機能は試験的な機能として導入されています。
プレビュー版のPowerShellでは既定で試験的な機能が利用可能となっているため直ちにConciseViewを利用できますが、試験的な機能を明示して無効にしている場合は以下のコマンドで機能を有効にしてください。

# Scopeは環境に応じて変えてください
Enable-ExperimentalFeature -Name PSErrorView -Scope CurrentUser
Enable-ExperimentalFeature -Name Microsoft.PowerShell.Utility.PSGetError -Scope CurrentUser