[運用]
|
|
PowerShellのコマンドレットは、戻り値として「.NET Frameworkのオブジェクト(以降「.NETオブジェクト」と呼ぶ)」を返す。これはともすると、そのまま軽く通り過ぎてしまいそうな事実であるが、PowerShellを使いこなすうえで重要なポイントを含んでいる。そのポイントについては、これから追って解説していくものとして、ここではまず、実際にコマンドレットが.NETオブジェクトを返すことを確認してみよう。
※コマンドレットの戻り値型を確認するコード |
Get-Dateは、システムの現在日時を取得するためのコマンドレットだ。ただ単に「Get-Date」として呼び出すと「2007年8月8日 15:01:53」のような日付時刻の文字列を返すが、ここではいったん変数$resultに格納しておくことにしよう(ちなみにPowerShellの変数は、1文字目は「$」、2文字目以降は「英字、数字、アンダースコア」とする必要がある)。
そして、次はこの変数$resultを介して、GetTypeメソッドを呼び出してみる。GetTypeメソッドは.NET Frameworkの全オブジェクトの基底クラスとなるObjectクラスのメンバーであり、現在のオブジェクトの型情報を返す。コマンドレットが.NETオブジェクトを返すならば、GetTypeメソッドは呼び出し可能であるはずだ。
果たして、GetTypeメソッドが変数$result(戻り値)の型情報を返すことを確認できた。上のリストの結果から、Get-Dateコマンドレットが戻り値としてSystem.DateTimeオブジェクトを返すことが分かったはずだ。
ここではただ単に戻り値の型情報を出力しているだけだが、オブジェクトを取得しているということは、System.DateTimeオブジェクトで公開されているメンバーにもアクセスできるということだ。例えば、現在日時の曜日だけを取り出したいならば、先ほど取得した変数$result(DateTimeオブジェクト)を介して、DayOfWeekプロパティを呼び出せばよい。
PS > $result.DayOfWeek |
パイプラインを流れる.NETオブジェクト
以上でコマンドレットが.NETオブジェクトを返すことが確認できた。次は本題の、PowerShellを利用するうえで、この事実がどんな恩恵をもたらしているのかを見てみることにしよう。
ここで紹介するパイプライン処理(以降「パイプ処理」)とは、従来のコマンド・プロンプトでもおなじみの機能で、あるコマンドによる処理結果を、異なるほかのコマンドの入力として引き渡す機能のこと。例えば、コマンド・プロンプト上で以下のような記述を利用したことがある方は少なくないのではないだろうか。
※コマンド・プロンプト上でファイルの一覧を表示し、1ページずつ表示させる例 |
これがまさにパイプの代表的な一例で、ここではdirコマンドで取得したファイル一覧を、1画面ごとに入力の内容を出力するmoreコマンドに引き渡すことで、ファイル・リストをページ単位に区切って表示しているわけだ。パイプ処理を利用することで、複数のコマンドを組み合わせた処理を簡潔に記述することができることからも、パイプをいかに使いこなすかがシェル上の作業効率を左右するといってもよいだろう。
もっとも、従来のコマンド・プロンプトやUNIXシェルでは、コマンドの結果はテキスト・データであった。つまり、コマンドの結果を受け取ってパイプ処理を行う場合にも、いったん入力テキストを解析し、処理に必要な情報を取り出す必要があったわけだ。しかし、このようなテキスト解析は煩雑でもあり、入力するコマンドによっては正しい結果を取り出せなかったり、そもそも適切な正規表現を記述するには、それなりのスキルが要求されたりすることとなる。
しかし、PowerShellのコマンドレットは(繰り返しであるが)オブジェクトを返す。つまり、パイプ処理に際しても、後続のコマンドに対してオブジェクトを引き渡すことができるので、こうした煩雑な解析は不要になるというわけだ。パイプの先のコマンドでは、オブジェクトがもともと公開しているプロパティを介して、必要な情報を取り出すことができる。
もっとも、「パイプをオブジェクトが流れる」といっても、なかなかイメージが分かりにくいかもしれないので、以下では、パイプ処理で利用されるコマンドレットの中でも特に重要ないくつかについて、具体的な使用例を挙げてみることにしよう。
■Where-Objectコマンドレット
Where-Objectコマンドレットは、パイプ経由で渡された入力オブジェクトを特定の条件式で比較し、合致した(Trueと判定された)オブジェクトのみを出力する。例えば、次のリストでは、Get-ChildItemコマンドレットで取得したファイル一覧から、サイズが1Mbytes以上のものだけを表示している。
※サイズが1Mbytes以上のファイルのみを表示 |
Where-Objectコマンドレットにおいて、条件式はスクリプト・ブロック({ 〜 }で囲まれた部分)に記述することができる。変数「$_」はPowerShell上で利用可能な特殊変数の1つで、パイプ経由で渡されたオブジェクトを表す。また、「-ge」は比較演算子の1つで、「以上」を表すものだ(それ以外の比較演算子は次の表を参照)。
| 演算子 | 概要 | 例(条件式の部分のみ) |
| -eq | 等しい(=) | $_.Name -eq "wga.log" |
| -ne | 等しくない(≠) | $_.Name -ne "wga.log" |
| -gt | より大きい(>) | $_.Length -gt 1MB |
| -ge | 以上(≧) | $_.Length -ge 1MB |
| -lt | 未満(<) | $_.Length -lt 1MB |
| -le | 以下(≦) | $_.Length -le 1MB |
| -like | あいまい検索(ワイルドカード) | $_.Name -like "*.log" |
| -match | 正規表現検索 | $_.Name -match "[a-z]{1,}\.log" |
| PowerShellの比較演算子 | ||
| ただし、文字列比較で大文字/小文字を区別する場合には「c」、しない場合には「i」を演算子の先頭に付ける。例えば「-ieq」などとする。 | ||
つまりここでは、Get-ChildItemコマンドレットで取得したFileInfoオブジェクト群のそれぞれのLengthプロパティ(サイズ)を確認し、その値が1Mbytes以上である場合にのみ、そのオブジェクトを出力しているというわけだ。
同じ要領で、例えば最終更新日が6カ月以上前のファイルのみを取得したければ、次のようにする。
※最終更新日が6カ月以上前のファイルのみを取得する例 |
AddMonthsメソッドは、Get-Dateコマンドレットによって返されるDateTimeオブジェクトのメソッドで、指定された月数を現在の日付に加算するものだ。従って、ここではGet-ChildItemコマンドレットから渡されたFileInfoオブジェクト群のLastWriteTimeプロパティ(最終更新日)を6カ月前の日付と比較し、それ以前のもののみを出力することになる。
■ForEach-Objectコマンド
ForEach-Objectコマンドレットは、パイプ経由で渡された入力オブジェクトを順番に出力する。例えば、次のリストはGet-ChildItem/Where-Objectコマンドレット経由で取得した「6カ月以上更新のないファイル」を削除するためのコマンドの例である。やや長めではあるが、上の実行結果をもとに更にパイプでつないでいるだけなので、前半部を理解していれば、さほどに難しいことはないだろう。
なお、そろそろコマンドが長くなってきたので、次の例ではコマンドを複数行に分けている。行末を「|」(パイプ記号)で終えた場合、PowerShellではコマンドが複数行にまたがるものと見なし、次行では「>>」という続きの入力を促すプロンプト記号が表示される。パイプ処理を伴うコマンドは、往々にして長く複雑になりがちであるので、このように、適宜改行を入れておくと分かりやすいだろう。
※6カ月以上更新のないファイルを削除する |
注目していただきたいのは、太字で示した「ForEach-Object {$_.Delete()}」の部分だ。Where-Objectコマンドレットの場合と同様、パイプ経由で渡された入力オブジェクトの処理は「{ 〜 }」で囲まれたスクリプトブロックの中に記述できる。ここでは、特殊変数「$_」にはWhere-Objectコマンドレットでフィルタ済みのFileInfoオブジェクトが渡されているはずなので、Deleteメソッドによって、該当のファイルを削除している。
■Format-Listコマンドレット
Format-Listコマンドレットは、パイプ経由で渡されたオブジェクトの内容をリスト形式で出力する。コマンドレットは、デフォルトで、その処理結果をテーブル形式で出力するが、表示すべきプロパティの数が多い場合には、テーブル形式では一部の情報が省略されてしまうなど、十分な情報が得られない。そのような場合には、Format-Listコマンドレットでリスト形式に整形すれば、必要な情報を見やすい形式で出力できる。
次のリストは、Get-ChildItemコマンドレットで取得したファイル一覧を、Format-Listコマンドレットで整形した例だ。
※Get-ChildItemコマンドレットの処理結果をリスト形式に整形する |
表形式では表示されていなかった多くのプロパティ情報が表示されていることが確認できるはずだ。Format-Listコマンドレットでパラメータとして「*」を指定しているのは、入力オブジェクトで公開されているすべてのプロパティを出力するという意味である。もしも特定のプロパティ――例えば、NameプロパティとLengthプロパティだけを出力したいという場合には、
PS > Get-ChildItem | Format-List Name,Length |
のように、出力したいプロパティをカンマ区切りで指定することも可能だ。
| [参考]PowerShell独自のプロパティ |
Format-Listコマンドレットによる出力結果を見て、はたと違和感を覚えた方もいるかもしれない。というのも、本来のDirectoryInfo/FileInfoオブジェクトには存在しないはずの「PS〜」で始まるプロパティが多く表示されているのだ。 これは、(名前からも容易に想像できるように)PowerShellが本来の.NETオブジェクトを拡張しているためだ。Get-ChildItemコマンドレットに限らず、PowerShellでは多くのコマンドレットが戻り値オブジェクトを内部的に拡張し、必要な情報を追加している。どのような拡張がなされているのか興味のある方は、それぞれのコマンドレットの結果をFormat-Listコマンドレットでリスト表示してみるとよいだろう。 |
| [コラム]moreコマンドの実体 ちなみにPowerShellでも、「dir | more」というコマンド・プロンプトふうの記述は利用可能だ。もっとも、このmoreコマンドは、厳密にはコマンド・プロンプトで提供されていたそれではなく、PowerShellの「関数」(エイリアスではない)を利用して擬似的にマッピングされているにすぎない(関数については後編で詳述の予定)。具体的な実装については、以下のリストのようにすれば確認できる。
|
| INDEX | ||
| [運用]Windows PowerShellコマンド&スクリプティング入門(前編) | ||
| PowerShellの基本 | ||
| 1.PowerShellを始めよう | ||
| 2.PowerShellをインストールする | ||
| 3.キーワード1「コマンドレット」―PowerShellを操作する基本コマンド | ||
| 4.キーワード2「.NETオブジェクト」―コマンドレットの戻り値はオブジェクト | ||
| 5.キーワード3「ドライブ」―データソースへのアクセスを一元化する | ||
| [運用]Windows PowerShellコマンド&スクリプティング入門(後編) | ||
| PowerShellスクリプティングの第一歩 | ||
| 1.PowerShellスクリプトの基本 | ||
| 2.PowerShellの変数 | ||
| 3.PowerShellの制御構文 | ||
| 4.PowerShellの関数 | ||
| 5..NET Frameworkのクラスを利用する | ||
| Windows運用 |
ホワイトペーパー(TechTargetジャパン)
- WindowsTIPS (2010/3/19)
− [シャットダウン]ボタンの設定を変更する
− WINSサーバをインストールする
− WINSサーバをnetshコマンドで管理する - Windows 7のファイアウォール機能 (2010/3/18)
Win 7のファイアウォールの概要解説。ルールセットを切り替えるプロファイル機能が強化され、ドメインでもVPNでも、適切なルールが自動選択される - 第212話 プリンタ用紙 (2010/3/16)
致命的なディスク・クラッシュが起きる確率は、クラッシュによってもたらされる被害の大きさに比例する… - WindowsTIPS (2010/3/12)
− 不要なアドオンを無効化してIE8の起動を高速化する
− IE8のソース表示エディタを変更する
− RRASのNATでポートマッピングを定義する
|
|
スキルアップ/キャリアアップ(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台以上! グループ内 サーバの「統合管理」によるメリットは? |






