本稿最後のトピックは、.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)
コードの大まかな流れはリスト内のコメントを参照いただくとして、ここで注目していただきたいポイントは以下の2点だ。
.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などで順次紹介していければと考えている。どうぞお楽しみに。
Copyright© Digital Advantage Corp. All Rights Reserved.