ここまでは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クラスのDownloadStringメソッドは、パラメータで指定したURLにアクセスし、その内容を文字列として返すメソッドだ。ここではその内容をファイルにリダイレクトしている。
■静的メソッド(スタティック・メソッド)の呼び出し
上記の例では、クラスをインスタンス化し(クラスからオブジェクトを作成し)、そのインスタンス・メソッドを呼び出した。メソッドにはもう1種類、静的メソッドと呼ばれるメソッドがある。これはインスタンスに関係なくクラスに対して直接呼び出すことのできるメソッドだ。
PowerShellではクラスの静的メソッドは次のような構文で呼び出すことができる。
[クラス名]::メソッド名()
以下の例ではStringクラスの静的メソッドであるFormatメソッドを呼び出している。
PS C:\proj> [String]::Format("数値を16進表示: {0:x}", 1234)
数値を16進表示: 4d2
大カッコ内で指定するクラス名は通常、クラス名に名前空間名を付けた完全修飾名である必要があるが、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
ちなみに、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
……以下省略……
さて、以下の例では、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)
Buttonコントロールのadd_Clickメソッドのパラメータにはイベント・ハンドラ(EventHandlerオブジェクト)が必要となるが、PowerShellではここにスクリプト・ブロックを記述できる。スクリプト・ブロック自体も実際にはオブジェクトであり(「{} | Get-Member」を実行してほしい)、これがEventHandler型にキャスト可能となっている。
以下の画面は、上記のコマンドを実行してウィンドウを開き、[クリック!]ボタンを押してメッセージを表示したところだ。
もちろん実際には、PowerShellのスクリプトでWindowsフォームを開いたり、そのようなコードを1行ずつコマンドラインで実行したりするようなことはしないと思うが、PowerShellがうまく.NET Frameworkのクラス・ライブラリを活用できるようになっていることはお分かりいただけただろう。
今回見てきたように、PowerShellでは実行結果がテキストではなくオブジェクトであり、また、そのオブジェクトを直接操作できる仕組みが備わっていることにより、非常に強力で多種多様なオペレーションが可能になっている。さらには.NET Frameworkのクラス・ライブラリなどで用意された豊富なクラスをコマンドのように利用することもでき、その利用範囲はこれまでのシェルとは比べものにならないほど広い。
PowerShellをメインに利用するであろうシステム管理者は少し.NETのクラス・ライブラリについて学ぶ必要があるかもしれないが、.NET開発者にとっては若干の構文を学ぶだけで“マネージド”なスクリプトが使えるようになる。PowerShellがWindows標準搭載のシェルとなる日が待ち遠しいものである。
Copyright© Digital Advantage Corp. All Rights Reserved.