特集
» 2006年07月26日 00時00分 公開

特集:Windows PowerShellレビュー(後編):Windows PowerShellのパワーの源は.NETオブジェクト (3/3)

[遠藤孝信,デジタルアドバンテージ]
前のページへ 1|2|3       

クラス・ライブラリの活用

 ここまではCmdletにより生成されるオブジェクトについて操作を行ってきた。これに加えてPowerShellでは、.NET Frameworkのクラス・ライブラリで用意されているクラスからオブジェクトを作成し、それを利用することができる。最後にこれについて見ておこう。

■クラスのインスタンス化

 オブジェクトを新しく作成するには「New-Objectコマンド」を使用する。パラメータにはインスタンス化したいクラスの名前を指定する。

 以下の例では、WebページにアクセスするためのクラスであるWebClientクラス(System.Net名前空間)を使用して、@ITのトップページ(index.html)を取得し、それをファイル「atmarkit.html」に保存してから、画面に表示している。

PS C:\proj> $wc = New-Object System.Net.WebClient
PS C:\proj> $wc.DownloadString("http://www.atmarkit.co.jp/") > atmarkit.html
PS C:\proj> more atmarkit.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML lang="ja">
<HEAD>
<!--ひらがな 漢字コード識別用-->
<meta http-equiv="content-type" content="text/html;CHARSET=SHIFT_JIS">
<meta http-equiv="content-script-type" content="text/javascript">
<meta http-equiv="content-style-type" content="text/css">
<meta name="keywords" content="IT,情報技術,質問,ニュース,メールマガジン,掲示板,BBS,Windows,Linux,XML,ネットワーク,LAN">
<meta name="description" content="プロフェッショナルなIT技術者・管理者のためのコンテンツとコミュニティ満載の問題解決サイト。製品や技術に関する高度な
解説記事や、掲示板、質問コーナーなど。">
<title>@IT - アットマーク・アイティ</title>
……以下省略……

WebClientクラスを利用したWebページの取得
.NET FrameworkのクラスはNew-Objectコマンドによりインスタンス化できる。ここではWebClientクラスを使ってWebページの内容を取得している。

 WebClientクラスのDownloadStringメソッドは、パラメータで指定したURLにアクセスし、その内容を文字列として返すメソッドだ。ここではその内容をファイルにリダイレクトしている。

■静的メソッド(スタティック・メソッド)の呼び出し

 上記の例では、クラスをインスタンス化し(クラスからオブジェクトを作成し)、そのインスタンス・メソッドを呼び出した。メソッドにはもう1種類、静的メソッドと呼ばれるメソッドがある。これはインスタンスに関係なくクラスに対して直接呼び出すことのできるメソッドだ。

 PowerShellではクラスの静的メソッドは次のような構文で呼び出すことができる。

[クラス名]::メソッド名()

 以下の例ではStringクラスの静的メソッドであるFormatメソッドを呼び出している。

PS C:\proj> [String]::Format("数値を16進表示: {0:x}", 1234)
数値を16進表示: 4d2

Stringクラスの静的メソッドであるFormatメソッドの実行例
Formatメソッドでは第2パラメータのオブジェクトを書式付きで文字列にできる。「{0:x}」は第2パラメータの値を16進表示の文字列に変換することを示している。

 大カッコ内で指定するクラス名は通常、クラス名に名前空間名を付けた完全修飾名である必要があるが、StringやDateTimeなど、よく利用されるいくつかの基本的なクラスについては名前空間名を省略できるようである。

■Windowsフォームの利用

 では最後にクラス・ライブラリの応用として、Windowsフォームを使用してPowerShellからウィンドウを開いてみよう。

 Windowsフォームを利用するにはFormクラス(System.Windows.Forms名前空間)を利用するが、PowerShellではこのクラスを含んでいるアセンブリ(System.Windows.Forms.dll内にあるSystem.Windows.Formsアセンブリ)がデフォルトでメモリにロードされていないため、まずはこれをロードする必要がある。

 アセンブリをロードするにはいくつかの方法があるが、ここではAssemblyクラス(System.Reflection名前空間)の静的メソッドであるLoadWithPartialNameメソッドを利用して次のように行った(Assemblyクラスを含んだアセンブリはPowerShell自体も利用するため、PowerShell実行時にすでにロードされている)。

PS C:\proj> [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")

GAC    Version        Location
---    -------        --------
True   v2.0.50727     C:\WINDOWS\assembly\GAC_MSIL\System.Windows.
Forms\2.0.0.0__b77a5c561934e089\System.Windows.Forms.dll

AssemblyクラスのLoadWithPartialNameメソッドによるアセンブリのロード
メモリにロードされていないアセンブリに含まれるクラスを利用する場合には、このようにして、まずそのアセンブリをロードする必要がある。

 ちなみに、PowerShellに対してすでにロードされているアセンブリの一覧は次のようにして見ることができる。

PS C:\proj> ([AppDomain]::CurrentDomain).GetAssemblies() | Format-List

CodeBase               : file:///C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/mscorlib.dll
EntryPoint             :
EscapedCodeBase        : file:///C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/mscorlib.dll
FullName               : mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
GlobalAssemblyCache    : True
HostContext            : 0
ImageFileMachine       :
ImageRuntimeVersion    : v2.0.50727
Location               : C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll
ManifestModule         : CommonLanguageRuntimeLibrary
MetadataToken          :
PortableExecutableKind :
ReflectionOnly         : False
……以下省略……

AppDomainクラスのGetAssembliesメソッドによるロード済みアセンブリの一覧
AppDomainクラスの静的メソッドであるCurrentDomainプロパティからはPowerShellが実行されているAppDomain(アプリケーション・ドメイン)を示すオブジェクトを取得できる。パイプで使用している「Format-Listコマンド」はオブジェクトの内容を詳細表示するためのもの。

 さて、以下の例では、ButtonコントロールとLabelコントロールを配置したフォームを開いている。ボタンがクリックされると、ラベルにメッセージを表示する。ここでは詳細な解説は割愛するが、C#やVBでWindowsアプリケーションを作ったことがある人ならだいたい理解できるだろう。

PS C:\proj> $form = New-Object System.Windows.Forms.Form
PS C:\proj> $button = New-Object System.Windows.Forms.Button
PS C:\proj> $button.Location = New-Object System.Drawing.Point(10, 50)
PS C:\proj> $button.Text = "クリック!"
PS C:\proj> $button.add_Click({ $label.Text = "hello, world"})
PS C:\proj> $label = New-Object System.Windows.Forms.Label
PS C:\proj> $label.Location = New-Object System.Drawing.Point(10, 10)
PS C:\proj> $form.Controls.AddRange(($button, $label))
PS C:\proj> [System.Windows.Forms.Application]::Run($form)

ボタンとラベルを配置したフォームの表示
最後のRunメソッドを実行した時点でウィンドウが開く。

 Buttonコントロールのadd_Clickメソッドのパラメータにはイベント・ハンドラ(EventHandlerオブジェクト)が必要となるが、PowerShellではここにスクリプト・ブロックを記述できる。スクリプト・ブロック自体も実際にはオブジェクトであり(「{} | Get-Member」を実行してほしい)、これがEventHandler型にキャスト可能となっている。

 以下の画面は、上記のコマンドを実行してウィンドウを開き、[クリック!]ボタンを押してメッセージを表示したところだ。

PowerShellから開いたウィンドウ
この画面は[クリック!]ボタンを押してメッセージを表示したところ。

 もちろん実際には、PowerShellのスクリプトでWindowsフォームを開いたり、そのようなコードを1行ずつコマンドラインで実行したりするようなことはしないと思うが、PowerShellがうまく.NET Frameworkのクラス・ライブラリを活用できるようになっていることはお分かりいただけただろう。


 今回見てきたように、PowerShellでは実行結果がテキストではなくオブジェクトであり、また、そのオブジェクトを直接操作できる仕組みが備わっていることにより、非常に強力で多種多様なオペレーションが可能になっている。さらには.NET Frameworkのクラス・ライブラリなどで用意された豊富なクラスをコマンドのように利用することもでき、その利用範囲はこれまでのシェルとは比べものにならないほど広い。

 PowerShellをメインに利用するであろうシステム管理者は少し.NETのクラス・ライブラリについて学ぶ必要があるかもしれないが、.NET開発者にとっては若干の構文を学ぶだけで“マネージド”なスクリプトが使えるようになる。PowerShellがWindows標準搭載のシェルとなる日が待ち遠しいものである。

「特集:Windows PowerShellレビュー」のインデックス

特集:Windows PowerShellレビュー

前のページへ 1|2|3       

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。