Frameworkのオブジェクト(以降「.NETオブジェクト」と呼ぶ)」を返す。これはともすると、そのまま軽く通り過ぎてしまいそうな事実であるが、PowerShellを使いこなすうえで重要なポイントを含んでいる。そのポイントについては、これから追って解説していくものとして、ここではまず、実際にコマンドレットが.NETオブジェクトを返すことを確認してみよう。System.ValueTypeGet-Dateは、システムの現在日時を取得するためのコマンドレットだ。15:01:53」のような日付時刻の文字列を返すが、ここではいったん変数$resultに格納しておくことにしよう(ちなみにPowerShellの変数は、1文字目は「$」、2文字目以降は「英字、数字、アンダースコア」とする必要がある)。次はこの変数$resultを介して、GetTypeメソッドを呼び出してみる。Frameworkの全オブジェクトの基底クラスとなるObjectクラスのメンバーであり、現在のオブジェクトの型情報を返す。コマンドレットが.NETオブジェクトを返すならば、GetTypeメソッドは呼び出し可能であるはずだ。GetTypeメソッドが変数$result(戻り値)の型情報を返すことを確認できた。上のリストの結果から、Get-Dateコマンドレットが戻り値としてSystem.DateTimeオブジェクトを返すことが分かったはずだ。ここではただ単に戻り値の型情報を出力しているだけだが、オブジェクトを取得しているということは、System.DateTimeオブジェクトで公開されているメンバーにもアクセスできるということだ。現在日時の曜日だけを取り出したいならば、先ほど取得した変数$result(DateTimeオブジェクト)を介して、DayOfWeekプロパティを呼び出せばよい。$result.DayOfWeekWednesdayパイプラインを流れる.NETオブジェクト以上でコマンドレットが.NETオブジェクトを返すことが確認できた。次は本題の、PowerShellを利用するうえで、この事実がどんな恩恵をもたらしているのかを見てみることにしよう。ここで紹介するパイプライン処理(以降「パイプ処理」)とは、従来のコマンド・プロンプトでもおなじみの機能で、あるコマンドによる処理結果を、異なるほかのコマンドの入力として引き渡す機能のこと。コマンド・プロンプト上で以下のような記述を利用したことがある方は少なくないのではないだろうか。moreこれがまさにパイプの代表的な一例で、ここではdirコマンドで取得したファイル一覧を、1画面ごとに入力の内容を出力するmoreコマンドに引き渡すことで、ファイル・リストをページ単位に区切って表示しているわけだ。パイプ処理を利用することで、複数のコマンドを組み合わせた処理を簡潔に記述することができることからも、パイプをいかに使いこなすかがシェル上の作業効率を左右するといってもよいだろう。従来のコマンド・プロンプトやUNIXシェルでは、コマンドの結果はテキスト・データであった。コマンドの結果を受け取ってパイプ処理を行う場合にも、いったん入力テキストを解析し、処理に必要な情報を取り出す必要があったわけだ。このようなテキスト解析は煩雑でもあり、入力するコマンドによっては正しい結果を取り出せなかったり、そもそも適切な正規表現を記述するには、それなりのスキルが要求されたりすることとなる。PowerShellのコマンドレットは(繰り返しであるが)オブジェクトを返す。パイプ処理に際しても、後続のコマンドに対してオブジェクトを引き渡すことができるので、こうした煩雑な解析は不要になるというわけだ。パイプの先のコマンドでは、オブジェクトがもともと公開しているプロパティを介して、必要な情報を取り出すことができる。「パイプをオブジェクトが流れる」といっても、なかなかイメージが分かりにくいかもしれないので、以下では、パイプ処理で利用されるコマンドレットの中でも特に重要ないくつかについて、具体的な使用例を挙げてみることにしよう。■Where-ObjectコマンドレットWhere-Objectコマンドレットは、パイプ経由で渡された入力オブジェクトを特定の条件式で比較し、合致した(Trueと判定された)オブジェクトのみを出力する。次のリストでは、Get-ChildItemコマンドレットで取得したファイル一覧から、サイズが1Mbytes以上のものだけを表示している。}で囲まれた部分)に記述することができる。変数「$_」はPowerShell上で利用可能な特殊変数の1つで、パイプ経由で渡されたオブジェクトを表す。「-ge」は比較演算子の1つで、「以上」を表すものだ(それ以外の比較演算子は次の表を参照)。"[a-z]{1,}\.log"PowerShellの比較演算子ただし、文字列比較で大文字/小文字を区別する場合には「c」、しない場合には「i」を演算子の先頭に付ける。「-ieq」などとする。ここでは、Get-ChildItemコマンドレットで取得したFileInfoオブジェクト群のそれぞれのLengthプロパティ(サイズ)を確認し、その値が1Mbytes以上である場合にのみ、そのオブジェクトを出力しているというわけだ。同じ要領で、例えば最終更新日が6カ月以上前のファイルのみを取得したければ、次のようにする。explorer.scf......(以下省略)......AddMonthsメソッドは、Get-Dateコマンドレットによって返されるDateTimeオブジェクトのメソッドで、指定された月数を現在の日付に加算するものだ。従って、ここではGet-ChildItemコマンドレットから渡されたFileInfoオブジェクト群のLastWriteTimeプロパティ(最終更新日)を6カ月前の日付と比較し、それ以前のもののみを出力することになる。■ForEach-ObjectコマンドForEach-Objectコマンドレットは、パイプ経由で渡された入力オブジェクトを順番に出力する。次のリストはGet-ChildItem/Where-Objectコマンドレット経由で取得した「6カ月以上更新のないファイル」を削除するためのコマンドの例である。長めではあるが、上の実行結果をもとに更にパイプでつないでいるだけなので、前半部を理解していれば、さほどに難しいことはないだろう。コマンドが長くなってきたので、次の例ではコマンドを複数行に分けている。行末を「|」(パイプ記号)で終えた場合、PowerShellではコマンドが複数行にまたがるものと見なし、次行では「>>」という続きの入力を促すプロンプト記号が表示される。パイプ処理を伴うコマンドは、往々にして長く複雑になりがちであるので、このように、適宜改行を入れておくと分かりやすいだろう。{$_.Delete()}」の部分だ。}」で囲まれたスクリプトブロックの中に記述できる。ここでは、特殊変数「$_」にはWhere-Objectコマンドレットでフィルタ済みのFileInfoオブジェクトが渡されているはずなので、Deleteメソッドによって、該当のファイルを削除している。■Format-ListコマンドレットFormat-Listコマンドレットは、パイプ経由で渡されたオブジェクトの内容をリスト形式で出力する。コマンドレットは、デフォルトで、その処理結果をテーブル形式で出力するが、表示すべきプロパティの数が多い場合には、テーブル形式では一部の情報が省略されてしまうなど、十分な情報が得られない。そのような場合には、Format-Listコマンドレットでリスト形式に整形すれば、必要な情報を見やすい形式で出力できる。次のリストは、Get-ChildItemコマンドレットで取得したファイル一覧を、Format-Listコマンドレットで整形した例だ。Settings\Yamada......(以下省略)......*)このコマンドを実行すると、カレント・フォルダの内容によっては大量の結果が表示されるはずだ。more」のように1ページずつ表示させるとよい。表形式では表示されていなかった多くのプロパティ情報が表示されていることが確認できるはずだ。Format-Listコマンドレットでパラメータとして「*」を指定しているのは、入力オブジェクトで公開されているすべてのプロパティを出力するという意味である。Name,Lengthのように、出力したいプロパティをカンマ区切りで指定することも可能だ。[参考]PowerShell独自のプロパティFormat-Listコマンドレットによる出力結果を見て、はたと違和感を覚えた方もいるかもしれない。いうのも、本来のDirectoryInfo/FileInfoオブジェクトには存在しないはずの「PS〜」で始まるプロパティが多く表示されているのだ。これは、(名前からも容易に想像できるように)PowerShellが本来の.NETオブジェクトを拡張しているためだ。Get-ChildItemコマンドレットに限らず、PowerShellでは多くのコマンドレットが戻り値オブジェクトを内部的に拡張し、必要な情報を追加している。どのような拡張がなされているのか興味のある方は、それぞれのコマンドレットの結果をFormat-Listコマンドレットでリスト表示してみるとよいだろう。more」というコマンド・プロンプトふうの記述は利用可能だ。このmoreコマンドは、厳密にはコマンド・プロンプトで提供されていたそれではなく、PowerShellの「関数」(エイリアスではない)を利用して擬似的にマッピングされているにすぎない(関数については後編で詳述の予定)。具体的な実装については、以下のリストのようにすれば確認できる。メールマガジンをご購読ください。申し込みページへITmediaはアイティメディア株式会社の登録商標です。