パイプラインチェイン演算子
PowerShell 7はそろそろ正式リリースへ向けたバグ修正や互換性向上、安定性改善、パフォーマンス向上などに取り組むべきタイミングに来ているが、先日公開された「PowerShell 7 Preview 5」にはいくつもの新機能が追加されている。どの機能も興味深いが、UNIX系のシェルに慣れたユーザーにとっては新しく追加された「パイプラインチェイン演算子」が特に興味深い。
新しく追加されたパイプラインチェイン演算子は次のようなものだ。
■パイプラインチェイン演算子「&&」
コマンド1 && コマンド2
■パイプラインチェイン演算子「||」
コマンド1 || コマンド2
「&&」のほうは、コマンド1が正しく終了するとコマンド2が実行され、コマンド1が正しく終了しなかった場合にはコマンド2は実行されない。「||」はこれとは逆に、コマンド1が正しく終了した場合にはコマンド2は実行されず、コマンド1が正しく終了しなかった場合にコマンド2が実行される。
コマンドの部分はコマンドレットでも関数でもエイリアスでもかまわないし、それらの組み合わせでも問題ない。また、パイプラインチェイン演算子は次のように複数回数組み合わせて利用することもできる。
■「&&」だけをつなげた場合
コマンド1 && コマンド2 && コマンド3
■「||」だけをつなげた場合
コマンド1 || コマンド2 || コマンド3
■「&&」と「||」を組み合わせた場合(その1)
コマンド1 && コマンド2 || コマンド3
■「&&」と「||」を組み合わせた場合(その2)
コマンド1 || コマンド2 && コマンド3
パイプラインチェイン演算子を使うと、「処理が成功しなかった場合にはこの処理を実行する」、または「処理が成功した場合にはこの処理を実行する」といった内容を簡単に記述することができる。これまでもif制御構文と「$?」と使えば同じことはできたが、よりコンパクトに記述できるのがパイプラインチェイン演算子の特徴になる。
UNIX系のシェルではこの演算子は「制御演算子」「リスト演算子」「ショートサーキットリスト演算子」などといった言葉で呼ばれている。基本的な機能はPowerShell 7のパイプラインチェイン演算子と同じだ。
パイプラインチェイン演算子は便利な機能ではあるのだが、if制御構文で書いておいたほうが後から読んだ際に理解しやすいとも言え、読みやすさの点からいうと議論の余地がある。
しかし、この演算子はUNIX系のシェルではありふれた機能であり、PowerShellが目指している「ユーザーが求める機能」でもある。最近PowerShell 7に取り込まれている機能には、Linuxユーザーからの要望が大きく影響しているように見える。「UNIX系のシェルとの書き方の互換性を向上させることで、UNIX系のシェルからPowerShell 7へ移行するときの学習コストを下げる」――そういった狙いがあるように見える。
パイプラインチェイン演算子の実行サンプル
実際にPowerShell 7 Preview 5のパイプラインチェイン演算子を実行してみよう。次のサンプルは、コマンド1に相当する部分がすべて正しく終了するものだ。「&&」の場合にはコマンド2に相当する部分の処理も実行され、「||」ではコマンド2に相当する部分の処理は実行されていないことが確認できる。
次のサンプルは、コマンド1に相当する部分がかならず失敗する場合のサンプルだ。「&&」の場合にはコマンド2に相当する部分が実行されていないことが確認できる。一方、「||」の場合にはコマンド2に相当する部分が実行されていることがわかる。
次のサンプルは、パイプラインチェイン演算子を2個使って3つのコマンドレットを接続した場合のサンプルだ。コマンド1、コマンド2、コマンド3のすべてが成功する場合の実行例となっている。これまでのサンプルで示した「&&」と「||」と同様の動作になっていることがわかる。
次のサンプルはコマンド1とコマンド3は成功し、コマンド2は失敗するパターンでの実行例だ。こちらもこれまでのサンプルの組み合わせの通りに機能していることがわかる。
パイプラインチェインでは、最後に実行されたコマンドの終了値が「$?」に代入されることになる。次のように、最後に実行されたコマンドが成功していれば「True」、最後に実行されたコマンドが失敗していれば「False」となる。
パイプラインチェイン演算子の特徴のほとんどはUNIX系のシェルとよく似ている。PowerShellが徐々にUNIX系のシェルの備えているシンタックスを提供するようになってきており、UNIX系シェルからの移行がより簡単になってきている。