ポイント1 - コマンド指向とオブジェクト指向
シェルスクリプトと同じエクスペリエンスが適用できるように工夫されているが、種々のシェルスクリプトスキーマをそのままPowerShellに適用しようとしてもうまくいかない。
それは本質的な仕組みがシェルスクリプトとPowerShellは違うからだ。逆に言えば、この部分を最初に抑えておくと、PowerShellの理解が早くなる。
シェルスクリプトは基本的にコマンドを組み合わせるためのものだ。パイプという1方向のデータストリームがあり、標準出力と標準入力というインタフェースを結びつける。これに制御構文を加えることで、コマンドのみでさまざまな処理ができるようになっている。UNIXの仕組みに詳しくなればなるほど、システムのパワーを活用するシェルスクリプトの組み方がわかってくる。
一方、PowerShellはオブジェクト指向のスクリプト言語だ。パイプが用意されているが、パイプで流れるデータはテキストやバイナリなどのまさに「データ」ではなく、オブジェクトそのものが渡される。このため、渡ってくるオブジェクトのメソッドを叩いて処理を実行するということができる。
パイプでオブジェクトを渡すというのはきわめて強力なものだ。オブジェクト指向プログラミングの経験があるなら、以降はほとんどなんの違和感もなくPowerShellを飲み込めるはずだ。
ポイント2 - コマンドとコマンドレット
PowerShellではipconfig.exeやnetstat.exeのようなコマンドも実行できるが、大半はコマンドレットと呼ばれるものになっている。シェルスクリプトでいえば組み込みコマンドや組み込み関数に該当する。その実体は.NETのクラスだ。
シェルスクリプトでコマンドと組み込みコマンド、関数を組み合わせたり、パイプでつないだりすることができるように、PowerShellでもコマンドとコマンドレット、エイリアスなどをパイプでつなぐことができる。コマンドからの出力は文字列のオブジェクトとして扱われる。
シェルスクリプトでは、コマンドをパイプでつなげることで複数のプロセスが並列に実行されるようになる。マルチコアでは特に有効な方法だ。コアの数が増えるにしたがって、単一のプログラムを組んで処理を行うよりも、簡単なコマンドをパイプでつなげて処理した方が高速に処理できるケースも増えている。
PowerShellのコマンドレットは別プロセスとして処理されることはないため、シェルスクリプトの場合のようにマルチコアの活用テクニックとしては使えない。システムの管理を目的としたツールであって、処理性能を発揮させるようなシステムではないといえる。
ポイント3 - ファイルシステムとプロバイダ
シェルスクリプトではファイルシステムをリソースのベースとしている。ディレクトリとファイルが特に代表的なものであり、コマンド名もこれらを反映したものになっている。PowerShellではプロバイダという概念を導入し、この部分をさらに抽象化している。
マニュアルやヘルプを参照すると、コマンドレット名がcdはSet-Location、cpならCopy-Item、lsならGet-ChildItemといったように、おおよそファイルシステムに限定されていないことに気がつくはずだ。これは対象となるリソーススキーマをファイルシステムに限定しないためにこうなっている。PowerShellではこれをプロバイダと呼んでいる。
デフォルトのプロバイダはファイルシステムになっているが、変更すればほかのリソースに対しても同じコマンドで処理が可能になる。コマンドレットを増やすことなく処理が可能になるため、新しくコマンドレットを覚えなくてよいという利点がある (なおUNIX的な発想からいえば、ここは逆にすべてのリソースをファイルシステムとして仮想化することで同様の処理をおこなうところ) 。