【2/17】今年は「濃厚」技術トーク!@ITメールセミナー スラッシュドット    はてなブックマーク  Yahoo!ブックマークに登録  印刷
   

[運用]
Windows PowerShellコマンド&スクリプティング入門(後編)

5..NET Frameworkのクラスを利用する

山田 祥寛
2007/09/20

 本稿最後のトピックは、.NET Frameworkクラス・ライブラリの利用方法だ。前回、コマンドレットは.NET Frameworkオブジェクトを返すと解説したが、PowerShellではただコマンドレットから返されるオブジェクトを利用できるばかりではない。自ら.NET Frameworkが提供するクラスをインスタンス化して、スクリプトの中で利用することも可能だ。これによって、スクリプト上でVisual BasicやC#と限りなく同等の操作を行うことができる点は、PowerShellを利用する最大のメリットであるともいえるだろう。

 例えば、以下は.NET Frameworkが提供するMailMessageクラス(電子メールのメッセージを管理するクラス)、SmtpClientクラス(SMTPサーバによる電子メールの送信手段を提供するクラス)を経由して、電子メールを配信するスクリプトの例だ。

  # 電子メールのメッセージを作成
$mail = New-Object System.Net.Mail.MailMessage("あて先@example.jp","送信元@example.co.jp") ……(1)
$mail.Subject = "PowerShellスクリプティング入門"  # 件名
$mail.Body = @"
こんにちは、PowerShell!
PowerShellでスクリプティングに挑戦しましょう。
"@    # 本文
      # 件名/本文の文字エンコーディング
$mail.SubjectEncoding = [System.Text.Encoding]::GetEncoding("ISO-2022-JP")
$mail.BodyEncoding = [System.Text.Encoding]::GetEncoding("ISO-2022-JP")
  # 指定されたSMTPサーバで電子メールを送信
$smtp = New-Object System.Net.Mail.SmtpClient("smtp.examples.ne.jp")
$smtp.Send($mail)
PowerShellで指定されたアドレスにメールを送信する例(Sendmail.ps1)

 コードの大まかな流れはリスト内のコメントを参照いただくとして、ここで注目していただきたいポイントは以下の2点だ。

オブジェクトを生成するNew-Objectコマンドレット

 .NET クラスをインスタンス化するのは、New-Objectコマンドレットの役割だ。New-Objectコマンドレットは、リスト内(1)のように、

オブジェクト変数 = New-Object クラスの完全修飾名(引数,...)

の構文で記述できる。New-Objectコマンドレットは、インスタンス化されたオブジェクトを返すので、後は、

オブジェクト変数.プロパティ名 [= 値]
オブジェクト変数.メソッド名(引数,...)

のように「.」演算子を介して、オブジェクトのメンバにアクセスすればよい。

 Visual Basic/C#に精通されている方ならば、New/new演算子がNew-Objectコマンドレットに置き換わっただけだと思えば、ごく直感的にPowerShell上でも.NETオブジェクトが利用できることが理解できるだろう。ただしいくつかの点でVisual BasicやC#とは異なるポイントもあるので、要注意だ。

■1.クラス名は完全修飾名で指定すること
 PowerShellでは、現時点でVisual Basic/C#におけるImports/usingに相当する命令は存在しない。つまり、クラス名を指定する場合には必ず名前空間を含んだ完全修飾名で指定する必要がある。ただし例外的に名前空間の先頭の「System.」だけは省略することが可能である。従って次の2つの文は等価だ。

※次の2つの文は等価

$mail = New-Object System.Net.Mail.MailMessage(〜)

$mail = New-Object Net.Mail.MailMessage(〜)

■2.引数が存在しない場合はカッコも省略すること
  引数を持たないコンストラクタを呼び出す場合、Visual Basic/C#に慣れている方は、自然と、

$mail = New-Object System.Net.Mail.MailMessage()

のように記述するはずだ。しかしPowerShellではこれは不可である。上のようなコードを記述した場合、以下のようなエラーメッセージが返される。

式が '(' の後に必要です。
発生場所 C:\windows\tmp\Sendmail.ps1:1 文字:48
+ $mail = New-Object System.Net.Mail.MailMessage() <<<<

 というのも、PowerShellでは疑似的にVisual Basic/C#によく似た構文を提供しているが、(当然のことながら)厳密にはPowerShellのNew-Objectコマンドレットと、Visual Basic/C#のコンストラクタとはまったく異なるものだからだ。ここで、厳密なNew-Objectコマンドレットの構文を見てみよう。

New-Object [-typeName] <string> [[-argumentList] <object[]>]

 つまり、「New-Object System.Net.Mail.MailMessage(〜)」としているのは、それぞれ「System.Net.Mail.MailMessage」は-typeNameパラメータ(型名)の値を、「(〜)」は-argumentListパラメータ(引数リスト)の値を表しているわけだ。もっといえば、「(〜)」の中身はPowerShellにおける配列(カンマ構文)を表しているわけである。そのため、「()」のような中身を持たない式はエラーとして弾かれる結果となる。

静的メンバにアクセスする「::」演算子

 PowerShellでは、インスタンスメソッド/プロパティにアクセスする場合と、静的メンバにアクセスする場合とで、使用する演算子が異なる点も要注意である。静的メンバにアクセスする場合には(ドット演算子ではなく)「::」演算子を利用する必要がある。当然、「::」演算子を利用する場合には、演算子の左オペランドは型名(クラス名)でなければならない。

[System.Text.Encoding]::GetEncoding("ISO-2022-JP")

 クラス名の表記については、先ほども指摘したように、必ず完全修飾名で記述しなければならない点も、いま一度確認しておこう。

 以上、非常に早足ではあったが、PowerShellでスクリプトを記述するに当たって、最低限理解しておきたい構文規則について概説してきた。すでにほかの言語を理解している方にとっては、PowerShellの言語構文がごくごくなじみやすいルールで成り立っていることがお分かりいただけただろう。もっとも本稿を見ても分かるように、(もちろん)PowerShellにはPowerShell独自の構文や、似ているが少しだけ異なる構文も多々存在する。これまでスクリプト言語に触れてきた方が、そうしたPowerShell独自の構文で頭を悩ませないよう、本稿がその一助となれば幸いである。

 本稿では分量の都合上、PowerShellを利用した具体的なコード例にまでは踏み込むことはできなかったが、具体的な活用例については、今後、Windows TIPSなどで順次紹介していければと考えている。どうぞお楽しみに。End of Article

 

 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ジャパン

Windows Server Insider フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

スキルアップ/キャリアアップ(JOB@IT)

- PR -
- PR -

お勧め求人情報

キャリアアップ 〜JOB@IT
@IT Special -PR-
  企業の仮想化に足りない“発想”とは?
仮想化運用管理のキモは意外なところに!

New!
  操作もマニュアルも分かりやすい!
ユーザー視点で開発されたPC管理ツール

New!
  仮想化すればコストは削減できるか?
仮想化に必要な「3つの視点」を解説する

  セキュリティを知り尽くす上野氏が登壇!
@ITメールソリューションLive! in Tokyo

  運用管理の課題を“2つの観点”から分析
ユーザー満足度の高い「仮想環境」とは?

  世界に通用するストレージの作り方とは?
製品に込めた思いを富士通の開発者に聞く

  OSSで手間も時間も、障害も減った――
「マピオンの事例」オープンソース活用法

  「ノートPCの持ち出し禁止」で大丈夫?
情報漏えいを防ぐ管理手法とインフラは?

  1日の処理を1秒に――MySQLの達人が語る
「コスト削減」できるチューニング

  ドキュメント作成を自動化して、SEの作業
効率を大幅アップ! Visio 2007の魅力

  急速に広がるHyper-Vでのサーバ仮想化
そのベストプラクティスをデルが解説

  @IT主催セミナーで語られた、「担当者に
求められるセキュリティ対策」をレポート

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