PowerShell 7.0.0 Preview6の新機能たち

PowerShell 7.0.0 Preview6の新機能を紹介する前にPowerShell 7.0.0 RCが公開されてしまったため、順序が逆になってしまったが、PowerShell 7.0.0 Preview6で導入された新機能を順次紹介していこうと思う。PowerShell 7.0.0 RCはすでにリリースへ向けたバグ修正などしか行われていないので、正式版がリリースされるまではPreview6で導入された機能を紹介したほうがよいだろう。

PowerShell 7を実行するための主要なターミナルアプリケーションは「Windows Terminal」になりそうなわけだが、こちらはもう少し開発が続く見通しだ。今後も毎月1回のプレビュー版公開が続き、2月か3月の段階で機能フィックスを目指すとしている。時期的に考えると、4月にRCがリリースされて、5月に1.0 GAが公開されるという流れになりそうだ。この頃にはフィーチャーアップデートとなるWindows 10 version 2004 (20H1)の公開が予想されるため、現在開発が進められているPowerShell 7やWindows Terminalは、2020年最初のフィーチャーアップデートで実質的に花開くことになるだろう。

Webコマンドレットにおけるエラーチェック回避機能の導入

PowerShellではWebコマンドレットでエラーが発生した場合、基本的にエラーオブジェクトからデータを取得する必要があった。例えば、サービスが停止したり、ネットワークがタイムアウトになったりすると、エラーとなっていつもの真っ赤な文字列がターミナルを埋め尽くすことになる。だが、PowerShell 7.0.0 Preview6に導入された機能では、この辺りの処理をもう少しスマートに書けるようになっている。

次のスクリーンショットは、コンテンツが存在しないURLを指定した場合のこれまでの動作である。

これまでの動作

このとき、コンテンツとしては次のような内容が返ってきている。

実際に返信として受け取っているコンテンツ

ヘッダは、次のように「HTTP/1.1 404 Not Found」が返ってきている。要するにエラーだ。

実際に返信として受け取っているヘッダ

PowerShell 7.0.0 Preview6のInvoke-RestMethodには「-SkipHttpErrorCheck」というパラメータが新しく追加されており、対象が「404 Hot Found」であろうとも、エラーにならずにコンテンツが取得できるようになった。これは、次のように動作する。

新しく追加された-SkipHttpErrorCheckパラメータを使うと、curlで取得したようにコンテンツの内容を取得できる

先程のコマンドレットにさらに「-ResponseHeadersVariable 変数名」といった指定を行うと、「curl —head」を指定した場合のように、ヘッダの内容を変数に収めることができる。

「-ResponseHeadersVariable 変数名」でレスポンスヘッダの中身を変数に収めることができる

変数の内容は次の通りだ。

変数に収められたレスポンスヘッダの内容

この仕組みになっていれば、コンテンツとヘッダを個別に取得した上で、エラーに対して処理を行うといった処理が実装しやすい。この機能はMicrosoftのエンジニアが考案したのではなく、コミュニティの開発者から寄せられたものとされている。最近はコミュニティから寄せられた機能が積極的に取り込まれており、実際に利用する側が扱いやすくなるような機能の追加が続いている。

エラー周りの処理をもっと扱いやすく

PowerShell 7.0.0 Preview5のときもそうだったが、このところエラーハンドリング周りの改善が進んでいる。PowerShellは便利なのだが、やはり、エラーが発生した場合の動きがとても煩雑な感は否めない。「何もそこまで主張しなくても……」といった反応が返ってくるので、どうしても若干面倒に感じてしまうところだ。

PowerShell 7はこのところ、徐々にだがこうした面倒な処理の改善が進んでいるように見える。来月公開が予定されているPowerShell 7は、Windows PowerShell 5.1の後継としても、新しいバージョンのプログラミング言語としても、なかなか魅力的なバージョンに仕上がっていきそうだ。

参考資料