![]() |
特集:Windows PowerShellレビュー(後編)Windows PowerShellのパワーの源は.NETオブジェクトデジタルアドバンテージ 遠藤 孝信 |
|
|
前編ではWindowsの新しいシェルであるWindows PowerShell(以下、PowerShell)の対話式シェルとしての基本機能について紹介した。
後編となる今回では、PowerShellにおけるオペレーションのベースとなっている「オブジェクトの操作」について解説していく。これはPowerShellがこれまでのテキスト・ベースのシェルと比較して画期的に異なるポイントだ。
コマンドの実行結果はオブジェクト
これまでのUNIXシェルやWindowsのコマンド・プロンプトで実行されるコマンドの多くは、その実行結果をテキスト・データとして返す。これに対してPowerShellでは、コマンド(Cmdlet)の実行結果はすべて「オブジェクト」である。これはメソッドやプロパティを持った、.NET Frameworkのオブジェクト・モデルをベースとするオブジェクトだ。
もちろん、最終的に画面に出力されたりファイルへリダイレクトされたりするときにはコマンドの実行結果はテキストとなるのだが、それまでにオブジェクトとしてさまざまな操作が可能だ。PowerShellを実際に使いながらそれを見てみよう。
■dirコマンドが返すファイル情報オブジェクト
ここではまず、「dirコマンド」(前回で解説したように、これはCmdletの1つである「Get-ChildItemコマンド」のエイリアス)の実行結果をシェル変数$resultに代入する。シェル変数は「$変数名」の形式で表記され、宣言なしで使える(以降の実行例では、キーボードからの入力を黄色い文字で示している)。
|
|
| dirコマンドの実行結果をシェル変数に代入 | |
| dirコマンドの実行結果はオブジェクトであるため、シェル変数「$result」にはそのオブジェクトが代入される。 |
では、実行結果であるオブジェクトの型を知るために、$resultに対してGetTypeメソッドを呼び出してみよう。.NET開発者ならご存じのように、GetTypeメソッドはすべてのクラスの基本クラスであるObjectクラスで定義されているため、どのオブジェクトもこのメソッドを持っている。
|
|
| コマンドの実行結果に対するGetTypeメソッドの呼び出し | |
| GetTypeメソッドはその型に関する情報を返す。このメソッドはすべてのクラスの基本クラスであるObjectクラスで定義されているため、どのオブジェクトに対しても呼び出し可能だ。 |
このようにdirコマンドはファイル「Form1.cs」の情報をFileInfo型のオブジェクトで返している。これは、.NET Frameworkクラス・ライブラリにあるFileInfoクラス(System.IO名前空間)のオブジェクトだ*。
| * 実際には完全に同一ではない。PowerShell上でのFileInfoオブジェクトは、.NET Frameworkクラス・ライブラリのFileInfoオブジェクトにいくつかのプロパティやメソッドを追加して拡張している。標準のCmdletがその実行結果として利用する基本的なオブジェクトの多くはそのようになっている。これらの拡張のためのプロパティやメソッドの定義は、PowerShellのインストールされたディレクトリにある「types.ps1xml」で記述されている。また、「Add-Memberコマンド」によりコマンドラインからユーザーが動的にメンバを追加することもできる。 |
FileInfoクラスには例えば、そのファイルをコピーするためのCopyToメソッドが用意されている。実際に、このメソッドを以下のようにして呼び出すことができる。
|
|
| FileInfo型の実行結果に対するCopyToメソッドの呼び出し | |
| $resultが示すファイル「Form1.cs」をCopyToメソッドにより「c:\tmp\tmp.cs」にコピーしている。メソッド呼び出しの結果、tmp.csについての情報が表示されるのは、このメソッドの戻り値が、コピーされた新しいファイルを示すFileInfoオブジェクトのためである。 |
また、FileInfoクラスにはファイルのサイズを取得するためのLengthプロパティも用意されている。もちろんこれも問題なく実行できる。
|
|
| FileInfo型の実行結果に対するLengthプロパティのアクセス | |
| FileInfoクラスのLengthプロパティはそのファイルのサイズを返す。 |
ちなみに、Lengthプロパティの型は64ビット符号付き整数であるInt64型である。
|
|
| FileInfoクラスのLengthプロパティの型 | |
| ファイル・サイズを取得するLengthプロパティの値も単なる数値ではなく、実際にはInt64型のオブジェクトである。 |
FileInfo型についての情報はMSDNなどに記述されているが、あるオブジェクトがどのようなメンバ(=メソッドやプロパティ)を持っているかは「Get-Memberコマンド」により参照可能だ*。
|
|
| Get-Memberコマンドによるオブジェクトのメンバ一覧表示 | |
| Get-Memberコマンドでは-InputObjectオプションにより、対象となるオブジェクトを指定する。 |
| * ここでは入力オブジェクトを-InputObjectオプションにより指定しているが、Get-Memberコマンドはパイプ(|)と組み合わせて使用するのが一般的だ。これについては後述する。 |
なお、ここまでは分かりやすいようにコマンドの実行結果を最初にシェル変数に代入したが、実際にはコマンドをカッコでくくることにより、その実行結果のオブジェクトを直接扱うことができる。つまり以下のような実行が可能だ。
|
|
| カッコによるコマンドの実行結果の参照 | |
| コマンドをカッコでくくることにより、その実行結果となるオブジェクトを直接扱うことができる。 |
以下の例では、この記述方法を使っていく。
■オブジェクトの配列を返すdirコマンド
ここまでの例では、dirコマンドのパラメータに「Form1.cs」を指定して1つのファイルについてのオブジェクトを扱ったが、dirコマンドは通常、複数のファイルやディレクトリを返す。このような場合にはコマンドの結果はオブジェクトの配列となる。
|
|
| dirコマンドの実行結果の型 | |
| 実行結果の型が「Object[]」となっていることから、それがObject型のオブジェクトの配列であることが分かる。 |
配列では、その要素数(dirコマンドの場合にはファイルやディレクトリの総数)をLengthプロパティから得ることができる。
|
|
| dirコマンドの実行結果の要素数 | |
| dirコマンドは結果を配列で返すが、その要素数はArrayクラス(System名前空間)のLengthプロパティにより取得できる。ここではファイルとディレクトリが合計8個あるので、Lengthプロパティの値は8となる。 |
また、配列の各要素へは大カッコ([])によりアクセスできる。
|
|
| 配列の要素へのアクセス | |
| 配列の個々の要素へは大カッコでインデックス番号を指定してアクセスする。「(dir)[0]」はdirコマンドの実行結果の先頭のオブジェクトを示している。 |
配列の全要素を順に操作したければ、foreachステートメントが使える*。foreachステートメントの記述方法はC#のそれとほぼ同様だ。以下の例では、拡張子が.csの各ファイルに対して、そのファイル名のみを小文字で表示している。
|
|
| foreachステートメントによる配列要素のアクセス | |
| 「dir *.cs」の実行結果として返される配列の各要素が順にシェル変数$fileに代入され、中カッコ({})内のスクリプト(スクリプト・ブロックと呼ばれる)が実行される。ここではファイル名を得るためのNameプロパティを呼び出し、さらにそのToLowerメソッドを呼び出して小文字に変換している。NameプロパティはString型であり、ToLowerメソッドはStringクラスのメソッドである。 |
| * PowerShellにはこれ以外にif、for、whileなどのステートメントが用意されている。これらはコマンドラインからも利用できるが、シェル・スクリプトの記述時に使用されるのが一般的だ。 |
■プロセスの操作
ここまではファイルを扱ってきたが、別の例として実行中のプロセスを扱う場合についても簡単に紹介しておこう。
実行中のプロセスの一覧はUNIXでは「psコマンド」で得られるが、PowerShellではそれが「Get-Processコマンド」のエイリアスとして用意されている。
|
|
| psコマンドによる実行中のプロセス一覧 | |
| 項目ヘッダの項目名はそれぞれ以下のProcessクラスのプロパティを示している。 ・NPM:NonpagedSystemMemorySize ・PM:PagedMemorySize ・WS:WorkingSet ・VM:VirtualMemorySize ・CPU:TotalProcessorTime |
このように、psコマンドでは現在実行されているプロセスの一覧が、メモリ使用量やCPU使用時間などとともに表示される。
psコマンドも先ほどのdirコマンドと同様にオブジェクトの配列を返す。
|
|
| psコマンドの実行結果の型 | |
| psコマンドの実行結果もdirコマンドと同様にオブジェクトの配列となっている。 |
配列の要素となっているオブジェクトはこの場合、Processクラス(System.Diagnostics名前空間)のオブジェクトである。
|
|
| psコマンドの実行結果の配列要素の型 | |
| ここではエクスプローラがすでに実行されているものとする。psコマンドが表示する各プロセスは、Process型のオブジェクトである。 |
以下の例ではメモ帳(notepad.exe)を起動し、そのウィンドウのタイトルを表示してから、Killメソッドを呼び出すことによって強制終了させている。
|
|
| Processオブジェクトによるプロセスの操作 | |
| メモ帳(notepad.exe)を起動し、そのウィンドウのタイトルを表示してから、Killメソッドを呼び出して強制終了させている。 |
なおここではKillメソッドを呼び出しているが、Cmdletとして「Kill-Processコマンド」(エイリアス名は「kill」)が用意されており、プロセスを強制終了させるには通常こちらを使う。
| INDEX | ||
| [特集]Windows PowerShellレビュー | ||
| [前編]次世代Windowsシェル「Windows PowerShell」を試す | ||
| 1.エイリアスが基本となるオペレーション | ||
| 2.プロバイダとして提供される各種ドライブ | ||
| 3.Cmdlet(コマンドレット)と関数(Function) | ||
| [後編]Windows PowerShellのパワーの源は.NETオブジェクト | ||
| 1.コマンドの実行結果はオブジェクト | ||
| 2.オブジェクトが流れるパイプ | ||
| 3.クラス・ライブラリの活用 | ||
ホワイトペーパー(TechTargetジャパン)
- LocalConnection APIと動的なスタイリング (2010/2/9)
Webページ上の複数のSilverlightアプリ間でメッセージ通信をする方法とは? コントロールの見た目を動的に設定する方法とは? - ASP.NET MVC 2:モデルの検証 (2010/2/8)
ASP.NET MVC 2で導入される入力検証機能を使った実装を紹介。シンプルな属性の追加によるエレガントな実装が可能となっている - ASP.NETによる3階層Webアプリ「ITブック」構築 (2010/2/5)
ちょっとした改造で、あなたのWebアプリは劇的に使いやすく、かっこよくなる。まずは元となるWebアプリを標準的手法で構築 - .NET TIPS - .NET開発のテクニックとヒント集 - (2010/2/4)
− カスタムMVCビューエンジンを利用するには?(活用編)
− フォーム全体へのドッキングでつまみを表示するには?
− リストボックスでTextBlockの文字列を折り返すには?
|
|
スキルアップ/キャリアアップ(JOB@IT)
スポンサーからのお知らせ
- - PR -
- - PR -
お勧め求人情報

**先週の人気講座ランキング**
〜CCNA編〜
| ◆ | 企業の仮想化に足りない“発想”とは? 仮想化運用管理のキモは意外なところに! New! |
| ◆ | 操作もマニュアルも分かりやすい! ユーザー視点で開発されたPC管理ツール New! |
| ◆ | 仮想化すればコストは削減できるか? 仮想化に必要な「3つの視点」を解説する |

| ◆ | セキュリティを知り尽くす上野氏が登壇! @ITメールソリューションLive! in Tokyo |
| ◆ | 運用管理の課題を“2つの観点”から分析 ユーザー満足度の高い「仮想環境」とは? |
| ◆ | 世界に通用するストレージの作り方とは? 製品に込めた思いを富士通の開発者に聞く |

| ◆ | OSSで手間も時間も、障害も減った―― 「マピオンの事例」オープンソース活用法 |
| ◆ | 「ノートPCの持ち出し禁止」で大丈夫? 情報漏えいを防ぐ管理手法とインフラは? |
| ◆ | 1日の処理を1秒に――MySQLの達人が語る 「コスト削減」できるチューニング |

| ◆ | ドキュメント作成を自動化して、SEの作業 効率を大幅アップ! Visio 2007の魅力 |
| ◆ | 急速に広がるHyper-Vでのサーバ仮想化 そのベストプラクティスをデルが解説 |
| ◆ | @IT主催セミナーで語られた、「担当者に 求められるセキュリティ対策」をレポート |

| ◆ | @IT「Windows 7」 特設サイトオープン! 最新情報・移行ノウハウを公開しています |







