PowerShellは、バッチやWSH(Windows Script Host)に代わるシステムスクリプト言語として開発されたもので、その名前の通り、CUIシェルとしての機能を持つ言語システムだ。最大の特徴は、コマンドレットと呼ばれるプログラムを使い、オブジェクトのパイプライン処理を可能にしたこと。cmd.exeやLinuxのbashなどのコマンドプロセッサでは、バイトストリームをパイプライン処理できる。

 cmd.exeなら

dir /s \ | Find "powershell.exe"

のように二つのコマンドプログラム(dirとfind)を「パイプ」(縦棒がコマンドのパイプ接続を意味する)でつなぐことで、dirコマンドの標準出力(テキストによるディレクトリのリスト)をfindの入力にできる。

 結果としてdirの出力(/sが指定されているのでサブディレクトリー全て)からpowershell.exeというファイル名を探せる。powershellでも同様のことが可能だが、解釈を相手プログラムに任せてしまうバイトストリームではなく、構造を持つオブジェクト(あるいはオブジェクトの配列)をパイプラインで次の「コマンドレット」に渡せるようになっている。

 具体的には、同様の処理は、powershellでは、

Get-ChildItem "\" -Recurse | Where-Object { $_.Name -eq "powershell.exe" }

となる。

 少し複雑だが、最初の「Get-ChildItem」は、親子関係を持つオブジェクトから子供部分を取り出すコマンドレットで、フォルダーオブジェクト"\"が対象で、"-Recurse"オプションは、全てのサブフォルダーから子供に当たるファイルオブジェクトを列挙する。意味としては前述のdirコマンドと同じだ。

 「Where-Object」は、渡されたファイルオブジェクトから特定条件のオブジェクトのみを取り出すもの。中括弧({、})で囲まれた部分がその条件指定で、前段のコマンドレットから渡された対象オブジェクトのNameプロパティ($_.Name)が"powershell.exe"に等しい(-eq)ものを取り出す、という意味になる。表記は複雑だが、プロパティを変えることで、一定サイズ以下、一定期間以内といった様々な条件を指定できる柔軟性がある。

 このとき、バイトストリームと異なり、データの並びなどを考える必要がなく、プロパティで情報にアクセスが可能だ。毎回、こうしたコマンドを入力するのが面倒なら、これをコマンドレットとして定義すればよい。次回からはシステム定義のコマンドレットと同じように利用できる。

 PowerShellは、cmd.exeと同じシェルとして動作できる。dirなどのコマンドも用意されているが、これは実際にはコマンドレットとして定義されている。