UNIXシステム管理者にとって,Windowsスクリプティングは長い間笑いの種だった。これにはいくつかの理由があったが,代表的なのは,Windowsにはスクリプティングを本当の意味で役立つものにするための主要機能の多くが欠けていたことだ。しかしWindowsの新しいスクリプト環境「Windows PowerShell」によって,米Microsoftは他OSのスクリプティング機能に追いついただけでなく,追い抜こうとしている。

 かつて「Monad」という開発コード名で呼ばれていた「PowerShell」は,これまでのWindowsにはなかったスクリプティング機能を提供するとともに,既存機能も大幅に改善している。PowerShellはまだリリース候補版だが,PowerShellがどのように性能の格差を埋めているのか,PowerShellがどのような仕組みになっているのか,知っておいて損はないだろう。

新しく作り直したスクリプト環境

 Microsoftは,以前のWindowsに搭載されていたものよりも強力なスクリプティング・コマンド環境を提供するために,PowerShellを設計した。設計チームのメンバーは,いくつかの目標を持っていた。要約すると,彼らはWindowsのスクリプティング環境を,他のどのOSのスクリプティング・ツールよりも強力で使いやすいものにしようとしていたのである。さらに彼らは,システム管理タスクやアプリケーション開発にも使える環境や,.NET Frameworkと融合する環境も構築しようとしていた。これらの目標を達成するに当たり,MicrosoftはWindowsのスクリプティング・ツールに欠けていたいくつかの機能に取り組む必要に迫られた。Microsoftは,様々なコマンド・ライン環境の最も優れた部分をPowerShellに組み込むことによって,性能の格差を埋めようとしたのだ。その実例をいくつか紹介しよう。

・コマンドを組み合わせる「composition」

 「composition」を使うと,短いコマンドを組み合わせて複雑なコマンドを作成できる。これらの短いコマンドの1つ1つは,通常1種類のタスクのみを行う。UNIXシェルには,間違いなくこの機能が存在している。UNIX管理者の多くは,「composition」という名称は知らないが,この機能を毎日使っているのだ。UNIXシェル環境を最初に設計した人々は,1つの機能のみを持つ短いコマンドをたくさん組み合わせて,シェルに使わせるという明確な目標を持っていた。管理者は,これらの短いコマンドを様々な方法で組み合わせて利用できた。長くて複雑なコマンド構造を使う傾向にあった当時の環境と比較すると,この機能は際立って対照的だった。

・コマンドの出力を引き継ぐ「パイプライン処理」

 パイプライン処理を使うと,コマンドの出力を「composition」内の次のコマンドに入力として渡せる。現在のWindows OSのコマンド・インタプリタにもこの機能はあるものの,非常に制限されている。例えば「dir | more」というコマンドを実行すると,Dirコマンドの出力は,Moreコマンドにパイプされる。だがWindowsのコマンドの多くは,パイプライン処理(あるいは,これとよく似た機能である入出力リダイレクト)をサポートしていない。

・オブジェクト指向

 PowerShellのコマンドは,テキストのブロックではなくオブジェクトを出力する。オブジェクトは,プロパティ(閲覧と変更が可能なアイテム)とメソッド(実行可能なアクション)を持っている。例えば,「get-mailbox」コマンドを使ってメールボックス・オブジェクトのリストを入手し,その後リストを様々な方法で操作できる。「get-mailbox」コマンドは,メールボックス名のリストではなく,メールボックス自体を表すオブジェクトを返す。後から実例を示すが,オブジェクト・セットを返すコマンドがあると,非常に多くのことができるようになる。

・安全性

 オブジェクトの作成や変更を行うPowerShellコマンドの多くは,2種類のフラグをサポートしている。「confirm(確認)」と「whatif(もし~だったらどうなるか)」だ。「confirm」フラグを設定すると,指定したアクションを本当に実行したいかどうか,確認を求められる。「whatif」フラグを設定すると,実際には何も変更することなく,その変更を行った場合の結果を確認できる。これらのフラグは非常に貴重である。実際に変更を行う前に,その変更の結果をテストする手段を与えてくれるからだ。

・一貫性のある構造と命名法

 ほぼすべてのPowerShellコマンドは,一貫性のある「動詞-オブジェクト」構造を使っており,一貫性のある命名法に従っている。おまけに,使われている動詞の数は少ない。こうした一貫性と動詞の数の少なさのおかげで,作業対象のオブジェクトが分かっていれば,簡単にコマンドの構築法を把握できる。

・情報量の多いオンライン・ヘルプ

 PowerShellは,オブジェクトやコマンド,そしてシェル環境自体に関して情報量の多いオンライン・ヘルプを提供している。

実際にPowerShellを使ってみよう

 PowerShellは,cmdlet(コマンドレットと発音する)と呼ばれる多くのオブジェクトで構成されている。cmdletは,自分自身では起動できない実行オブジェクトであるという点で,DLLに類似している。こうした理由から,cmdletはPowerShellコマンド・インタプリタの内部から実行される。PowerShell Release Candidate 1 (RC1)には,120以上のcmdletが含まれている。

 cmdletはパラメータを持っており,位置指定パラメータと名前付きパラメータの2種類がある(言い換えると,PowerShellはコマンド・ライン上のパラメータの位置を基に,パラメータを解釈する)。例えば,「get-mailbox」cmdletを使うとき,最初のパラメータは,必ず手に入れたいメールボックスを指定する。名前を指定することによって,このcmdletに他のパラメータを含めることが可能だ。

 頻繁に利用されるであろう内蔵cmdletがいくつかあるので,ここで紹介することにする。

・cmdletのフォーマット・ファミリー

 cmdletのフォーマット・ファミリー,すなわちフォーマット・テーブルとフォーマット・リストは,オブジェクトの流れを受け取り,オブジェクトを適切にフォーマットしていく。このコマンドを使うと,表示するプロパティを選択できる。例えば,メールボックスのリストを表示させるとき,

get-mailboxstatistics | format-table name, size

 というコマンドを実行することによって,メールボックスの名前と合計サイズだけを表示させられる。

・「where」cmdlet

 「where」cmdletを使うと,使用するオブジェクトを選択できる。例えば,

get-eventlog application | where {$_.ID eq "-1018"}

 というコマンドを実行すると,PowerShellはアプリケーション・イベント・ログを検索して,イベントIDが1018のイベントをすべて取り出す。面白いことに「where」cmdletは,先述した「動詞-オブジェクト」記述法に従わない数少ないPowerShell cmdletの1つである。

・「group」cmdlet

 名前が示唆するように,「group」cmdletは指定したプロパティに基づいて,オブジェクトをグループ分けする。例えば,組織内にあるすべてのメールボックスとそれらのサイズのリストを,メールボックスが属するメールボックス・データベース別にグループ分けするとしよう。こういうときは,次のコマンドを使うとよい。

get-mailboxstatistics | group MailboxDatabase | format-table count,name
(改行せず1行で使用する)

 他人が作ったPowerShellのスクリプトを見ると,いくつかのcmdletを示すのに面白い略字が使われていることに気づくかもしれない。例えば,フォーマットリスト(format-list)は「fl」と表記されることがある。PowerShellは,エイリアスに対して広範なサポートを提供している。一般的なコマンドの多くに対しては,エイリアスが内蔵されている。その上,シェル・プロフィールで独自のエイリアスを定義できる。シェル・プロフィールとは,ユーザーごとのデフォルトと設定を適用するときにPowerShellが利用する特別なファイルのことだ。

 VBScriptスクリプトの記述に慣れている管理者と同様に,スクリプト記述者も慣れ親しんだ要素があることに気づくだろう。