![]() |
特集: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ジャパン)
- .NET TIPS - .NET開発のテクニックとヒント集 - (2010/3/18)
− GridViewコントロールを階層表示させるには?
− Windowsフォームのボタンに画像を表示するには?
− C#でnullチェックを簡潔に行うには? - Chapter15:LINQとクエリ式 (2010/3/17)
C# 3.0の目玉機能であるLINQについて、さまざまな記述例を交えながら徹底解説。書籍『[完全版]究極のC#プログラミング』より転載 - VBラムダ式 基礎文法最速マスター (2010/3/16)
今度はVB。ラムダ式の基礎文法を、短い説明と簡単なコードでまとめる。「ラムダ式、どう書くんだっけ?」という場合の簡易リファレンスとして活用できる - ASP.NET MVC 2がリリース (2010/3/15)
ASP.NET MVC 2の正式版(VS 2008のASP.NET 3.5向け、VS 2010には標準で含まれる予定)のリリースについてのお知らせ
|
|
スキルアップ/キャリアアップ(JOB@IT)
スポンサーからのお知らせ
- - PR -
| 「いつかは壊れるサーバ」そんな故障に 迅速で安価に手軽に対応する方法とは? New! |
| 「特権ユーザー」の事件を防げ! 万能権限を持つユーザーの管理方法とは? New! |
| 仮想環境の構築とデータ保護の特効薬?! 実績と信頼性の高いパッケージで安心運用 |
| 仮想環境のバックアップもこれまでどおり 「まるごと取ってまるごと戻す」簡単運用 |
| おばかアプリ選手権、第4弾開催中!! ムダにカッコよくてくだらない作品求ム! |
| 社内ファイルサーバを“クラウド”に統合 VPN直結「クラウド型ストレージ」を紹介 |
| その数、なんと400台以上! グループ内 サーバの「統合管理」によるメリットは? |
| 美人!? まあまあ? 気になる いやし系!! PV急増で「美人時計」がとった手段とは? |
| 進化を続ける富士通ストレージETERNUS DX 製品開発者の自信を裏付けるものとは何か |
| 運用管理の課題を“2つの観点”から分析 ユーザー満足度の高い「仮想環境」とは? |
- - PR -
お勧め求人情報

**先週の人気講座ランキング**
〜CCNA編〜
| ◆ | TomcatやJBossなどAPサーバ環境に関する 情報を集約! “業務”用APサーバ大百科 New! |
| ◆ | 一気に解説! 最新のクラスタストレージ 「RAIDを超えたストレージ基準」……など New! |
| ◆ | クラウド的ユーザー体験の変化は脅威か? 仮想化技術を使いこなす運用管理術を紹介 New! |

| ◆ | 上司や部下、部署内メンバーとの情報共有 を“ガラッ”と変えるコラボツールとは? New! |
| ◆ | おばかアプリ選手権、第4弾開催中!! ムダにカッコよくてくだらない作品求ム! |
| ◆ | 社内ファイルサーバを“クラウド”に統合 VPN直結「クラウド型ストレージ」を紹介 |

| ◆ | Twitterのアカウントはなぜ突破された? メールによる新手の攻撃手法とその対策 |
| ◆ | もう仮想化のお試しフェイズは終わりだ! Hyper-V 2.0が基幹システムも仮想化 |
| ◆ | 美人!? まあまあ? 気になる いやし系!! PV急増で「美人時計」がとった手段とは? |

| ◆ | クライアント企業から求められる人材 ⇒IT技術と経営戦略を併せ持つ「戦略家」 |
| ◆ | .NET編集長が実践する「技術情報検索術」 サンプル・コードを簡単に探す“技”は? |
| ◆ | 業務効率と情報セキュリティ対策を両立! 手間なく確実に機密情報を守る方法とは? |

| ◆ | 進化を続ける富士通ストレージETERNUS DX 製品開発者の自信を裏付けるものとは何か |
| ◆ | 運用管理の課題を“2つの観点”から分析 ユーザー満足度の高い「仮想環境」とは? |

| ◆ | 【CTC事例】約30の基幹システムを統合! 膨大なバッジジョブを制御した方法は? |
| ◆ | 仮想化すればコストは削減できるか? 仮想化に必要な「3つの視点」を解説する |
| ◆ | その数、なんと400台以上! グループ内 サーバの「統合管理」によるメリットは? |







